<?php
namespace App\EventSubscriber;
use App\Entity\DocFile;
use App\Entity\DocFileBlock;
use App\Handler\DocFileHandler;
use App\Event\DocFilePreUpdateEvent;
use App\Event\DocFilePrePersistEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class DocFileSubscriber implements EventSubscriberInterface
{
private $intervalSortCode = [
'DAY' => 'D',
'MONTH' => 'M',
'YEAR' => 'Y'
];
public function __construct(
private DocFileHandler $handler
) {
}
public static function getSubscribedEvents(): array
{
return [
DocFilePrePersistEvent::NAME => 'preCreate',
DocFilePreUpdateEvent::NAME => 'preUpdate'
];
}
public function preCreate(DocFilePrePersistEvent $event)
{
$object = $event->getObject();
$parent = $object->getParent();
if ($object->getDocFileType() !== DocFile::DOCFILE_TYPE_FOLDER && $object->getDocFileType() !== DocFile::DOCFILE_TYPE_URL) {
$object->addDocFileBlock(new DocFileBlock());
}
if ($parent) {
$path = $this->handler->getPathFromParent($parent);
$object->setPath($path);
}
if ($object->getReminderDurationType() && $object->getReminderDuration()) {
$nr = new \DateTime();
$nr->add(new \DateInterval('P'.$object->getReminderDuration().$this->intervalSortCode[$object->getReminderDurationType()]));
$object->setNextReminder($nr);
}
}
public function preUpdate(DocFilePreUpdateEvent $event)
{
$object = $event->getObject();
$originalEvent = $event->getEvent();
$changeSet = $originalEvent->getEntityChangeSet();
if (isset($changeSet['reminderDurationType']) || isset($changeSet['reminderDuration'])) {
$nr = null;
if ($object->getReminderDurationType() && $object->getReminderDuration()) {
$nr = new \DateTime();
$nr->add(new \DateInterval('P'.$object->getReminderDuration().$this->intervalSortCode[$object->getReminderDurationType()]));
}
$object->setNextReminder($nr);
}
}
}