<?php
namespace App\Centralstage\DeviceBundle\EventSubscriber;
use App\Centralstage\CoreBundle\Models\mongoDBDataModel;
use App\Centralstage\CoreBundle\Utils\DateTimeHelper;
use App\Centralstage\DeviceBundle\Event\SensorRawPacketEvent;
use App\Centralstage\DeviceBundle\Models\DeviceDataModel;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Doctrine\ODM\MongoDB\DocumentManager;
use MongoDB\BSON\UTCDateTime;
class SensorRawPacketSubscriber implements EventSubscriberInterface
{
private $documentManager;
public function __construct(DocumentManager $documentManager)
{
$this->documentManager = $documentManager;
}
public function onProcessRawData(SensorRawPacketEvent $RawObject) : void
{
try {
$context = $RawObject->getData();
list($deviceChannelID, $data, $orgKey, $currentDate,$MachineType) = array_values($context);
$currentDT = DateTimeHelper::parseDateTime($currentDate, 'Y-m-d', DateTimeHelper::ServerTimeZone);
$conDetails = mongoDBDataModel::getDataBaseSensorCollection($orgKey,$deviceChannelID, $currentDT,$MachineType);
$dataBase = $conDetails["database"];
$collectionName = $conDetails["collection"];
$data = json_decode($data, true);
$deviceTimestamp = $data['timestamp'];
$timestamp = new UTCDateTime($deviceTimestamp * 1000); // Convert to milliseconds
$data['timestamp'] = $timestamp;
$data['deviceChannelID'] = $deviceChannelID;
$database = $this->documentManager->getClient()->selectDatabase($dataBase);
// Check if collection exists and create if not
$collections = $database->listCollections(['filter' => ['name' => $collectionName]]);
if (iterator_count($collections) === 0) {
$database->command([
'create' => $collectionName,
'timeseries' => [
'timeField' => 'timestamp',
],
]);
// Create index on the timestamp field
$database->selectCollection($collectionName)->createIndex(['timestamp' => 1]);
}
// Insert data into the collection
$database->selectCollection($collectionName)->insertOne($data);
} catch (\Exception $exception) {
$error = $exception->getMessage();
}
}
public static function getSubscribedEvents(): array
{
return [
'device.raw' => 'onProcessRawData'
];
}
public function __destruct(){}
}