<?php
namespace App\EventSubscriber\Logger\ActivityLogger;
use App\Entity\Provider;
use App\Features\Core\ILogger;
use App\Features\ProviderMessage\Event\ProviderMessageBaseEvent;
use App\Features\ProviderMessage\Event\ProviderMessageEmptyRecipientEvent;
use App\Features\ProviderMessage\Event\ProviderMessageFailedEvent;
use App\Features\ProviderMessage\Event\ProviderMessageFirstSentEvent;
use App\Features\ProviderMessage\Event\ProviderMessageSentEvent;
use Doctrine\Common\Collections\ArrayCollection;
use OSAdmin\Event\OSAdminActivityLogEvent;
use OSAdmin\Form\ExportData;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class ProviderMessageEventSubscriber implements EventSubscriberInterface
{
public function __construct(private ILogger $activityLogger){}
public static function getSubscribedEvents(): array
{
return [
ProviderMessageSentEvent::NAME => 'notify',
ProviderMessageFirstSentEvent::NAME => 'notify',
ProviderMessageFailedEvent::NAME => 'notify',
OSAdminActivityLogEvent::NAME => 'notifyActivity',
];
}
public function notify(ProviderMessageBaseEvent $event): void
{
$message= $event->getMessage();
$recipientId= array_map(static fn(Provider $provider) => $provider->getId(), $event->getRecipients());
$suffix= ' au fournisseur suivant : '.implode(', ', $recipientId);
$log = match ($event::NAME) {
ProviderMessageSentEvent::NAME => 'Vous avez envoyé le communiqué '.$message->getSubject().$suffix,
ProviderMessageFirstSentEvent::NAME => "Vous avez envoyé le communiqué ".$message->getSubject().$suffix,
ProviderMessageFailedEvent::NAME => "Vous avez échoué lors de l'envoi du communiqué ".$message->getSubject().$suffix,
ProviderMessageEmptyRecipientEvent::NAME => "Aucun destinataire trouvé pour le communiqué ".$message->getSubject(),
};
$this->activityLogger->log($message, "Envoi de communiqué",$log);
}
public function notifyActivity(OSAdminActivityLogEvent $event)
{
$entity= $event->getEntity();
$object= $event->getObject();
$action= $event->getAction();
$message= "";
if($action === OSAdminActivityLogEvent::ACTION_SHOW){
if($object){
$message= "Vous avez consulté l'élément ".$entity." : ".$object->getId();
}else{
$message= "Vous avez consulté l'élément ".$entity;
}
}
if($action === OSAdminActivityLogEvent::ACTION_DELETE){
if($object){
$message= "Vous avez supprimé l'élément ".$entity." : ".$object->getId();
}else{
$message= "Vous avez supprimé l'élément ".$entity;
}
}
if($action === OSAdminActivityLogEvent::ACTION_ADD){
if($object){
$message= "Vous avez ajouté l'élément ".$entity." : ".$object->getId();
}else{
$message= "Vous avez ajouté l'élément ".$entity;
}
}
if($action === OSAdminActivityLogEvent::ACTION_EDIT){
if($object){
$message= "Vous avez modifié l'élément ".$entity." : ".$object->getId();
}else{
$message= "Vous avez modifié l'élément ".$entity;
}
}
if($action === OSAdminActivityLogEvent::ACTION_ENABLED_DISABLED){
if($object){
$message= "Vous avez activité/désactivé l'élément ".$entity." : ".$object->getId();
}else{
$message= "Vous avez activité/désactivé l'élément ".$entity;
}
}
if($action === OSAdminActivityLogEvent::ACTION_LIST){
$message= "Vous avez consulté la liste des éléments ".$entity;
}
if($action === OSAdminActivityLogEvent::ACTION_EXPORT){
if($object instanceof ExportData){
$message= "Vous avez exporté la liste des éléments ".$entity." ayant les id suivant: ".(implode(",", $object->ids));
}else{
$message= "Vous avez exporté la liste des éléments ".$entity;
}
}
if($message && $action){
try{
$this->activityLogger->log($object??$entity, $action, $message);
}catch (\Exception $e){}
}
}
}