Varios cambios Co-authored-by: Juan Pablo Vial <jpvialb@incoviba.cl> Reviewed-on: #25
136 lines
3.9 KiB
PHP
136 lines
3.9 KiB
PHP
<?php
|
|
namespace Incoviba\Service;
|
|
|
|
use DateInvalidTimeZoneException;
|
|
use DateMalformedStringException;
|
|
use DateTimeImmutable;
|
|
use DateTimeZone;
|
|
use Psr\Log\LoggerInterface;
|
|
use Incoviba\Common\Ideal;
|
|
use Incoviba\Exception\MQTT as MQTTException;
|
|
use Incoviba\Exception\ServiceAction\{Create, Delete, Read, Update};
|
|
use Incoviba\Model;
|
|
use Incoviba\Repository;
|
|
|
|
class Job extends Ideal\Service
|
|
{
|
|
public function __construct(LoggerInterface $logger, protected MQTT $mqttService,
|
|
protected Repository\Job $jobRepository)
|
|
{
|
|
parent::__construct($logger);
|
|
}
|
|
|
|
public function isPending(): bool
|
|
{
|
|
try {
|
|
return $this->mqttService->exists();
|
|
} catch (MQTTException $exception) {
|
|
$this->logger->error($exception->getMessage(), ['exception' => $exception]);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @return Model\Job
|
|
* @throws Read
|
|
*/
|
|
public function get(): Model\Job
|
|
{
|
|
try {
|
|
return $this->load(json_decode($this->mqttService->get(), true));
|
|
} catch (MQTTException $exception) {
|
|
$this->logger->error($exception->getMessage(), ['exception' => $exception]);
|
|
throw new Read(__CLASS__, $exception);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param array $configuration
|
|
* @return Model\Job
|
|
* @throws Create
|
|
*/
|
|
public function add(array $configuration): Model\Job
|
|
{
|
|
try {
|
|
$now = (new DateTimeImmutable('now', new DateTimeZone($_ENV['TZ'] ?? 'America/Santiago')));
|
|
} catch (DateMalformedStringException | DateInvalidTimeZoneException $exception) {
|
|
$this->logger->warning($exception->getMessage(), ['exception' => $exception]);
|
|
$now = new DateTimeImmutable();
|
|
}
|
|
$data = [
|
|
'id' => $now->format('Uu'),
|
|
'configuration' => $configuration,
|
|
'executed' => false,
|
|
'created_at' => $now->format('Y-m-d H:i:s'),
|
|
'updated_at' => null,
|
|
'retries' => 0
|
|
];
|
|
try {
|
|
$this->mqttService->set(json_encode($data));
|
|
} catch (MQTTException $exception) {
|
|
throw new Create(__CLASS__, $exception);
|
|
}
|
|
return $this->load($data);
|
|
}
|
|
|
|
/**
|
|
* @param Model\Job $job
|
|
* @return void
|
|
* @throws Update
|
|
*/
|
|
public function update(Model\Job $job): void
|
|
{
|
|
try {
|
|
$now = (new DateTimeImmutable('now', new DateTimeZone($_ENV['TZ'] ?? 'America/Santiago')));
|
|
} catch (DateMalformedStringException | DateInvalidTimeZoneException) {
|
|
$now = new DateTimeImmutable();
|
|
}
|
|
$data = json_decode(json_encode($job), true);
|
|
$data['updated_at'] = $now->format('Y-m-d H:i:s');
|
|
|
|
try {
|
|
$this->mqttService->update(json_encode($data));
|
|
} catch (MQTTException $exception) {
|
|
throw new Update(__CLASS__, $exception);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param Model\Job $job
|
|
* @throws Delete
|
|
*/
|
|
public function remove(Model\Job $job): void
|
|
{
|
|
try {
|
|
$this->mqttService->remove();
|
|
} catch (MQTTException $exception) {
|
|
throw new Delete(__CLASS__, $exception);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param Model\Job $job
|
|
* @return bool
|
|
*/
|
|
public function execute(Model\Job $job): bool
|
|
{
|
|
try {
|
|
$this->mqttService->remove();
|
|
return true;
|
|
} catch (MQTTException $exception) {
|
|
$this->logger->error($exception->getMessage(), ['exception' => $exception]);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
protected function load(array $data, ?int $id = null): Model\Job
|
|
{
|
|
$job = new Model\Job();
|
|
$job->id = $id ?? $data['id'] ?? null;
|
|
$job->configuration = $data['configuration'] ?? [];
|
|
$job->executed = $data['executed'] ?? false;
|
|
$job->retries = $data['retries'] ?? 0;
|
|
return $job;
|
|
}
|
|
}
|