<?php
namespace MedBrief\MSR\EventSubscriber;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use MedBrief\MSR\Entity\ProjectAccess;
use MedBrief\MSR\Event\ProjectAccessedEvent;
use Override;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class ProjectSubscriber implements EventSubscriberInterface
{
public function __construct(private readonly EntityManagerInterface $entityManager)
{
}
/**
* @inheritDoc
*/
#[Override]
public static function getSubscribedEvents()
{
return [
ProjectAccessedEvent::NAME => ['onProjectAccess', 0],
];
}
public function onProjectAccess(ProjectAccessedEvent $event): void
{
// Grab project and user from the event
$project = $event->getProject();
$user = $event->getUser();
// Check for existing ProjectAccess with these two
$projectAccess = $this->entityManager->getRepository(ProjectAccess::class)
->findOneByProjectAndUser($project, $user)
;
// ProjectAccess exists, update existing
if ($projectAccess) {
$projectAccess->setUpdated(new DateTime());
} else {
// ProjectAccess doesn't exist, create a new one
$projectAccess = (new ProjectAccess())
->setUpdated(new DateTime())
->setProject($project)
->setUser($user)
;
}
// Persist ProjectAccess
$this->entityManager->persist($projectAccess);
$this->entityManager->flush();
}
}