nineskeletor/src/EventListener/AllSubscriber.php

199 lines
7.4 KiB
PHP

<?php
namespace App\EventListener;
use Doctrine\Bundle\DoctrineBundle\EventSubscriber\EventSubscriberInterface;
use Doctrine\ORM\Events;
use Doctrine\Persistence\Event\LifecycleEventArgs;
use Doctrine\ORM\Event\OnFlushEventArgs;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Doctrine\ORM\Proxy\Proxy;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use App\Entity\Audit as Audit;
class AllSubscriber implements EventSubscriberInterface
{
private $em;
private $token;
private $params;
private $entity;
public function __construct(EntityManagerInterface $em, TokenStorageInterface $token,ParameterBagInterface $params)
{
$this->em = $em;
$this->token = $token;
$this->params = $params;
}
public function getSubscribedEvents(): array
{
return [
Events::preRemove,
Events::onFlush,
];
}
public function preRemove(LifecycleEventArgs $args): void
{
$this->entity = $args->getObject();
// Les enregistrements négatifs sont des enregistrements systeme indispensable
if($this->entity->getId()<0)
throw new \Exception("Impossible de supprimer cet enregistrement. C'est un enregistrement système");
}
public function onFlush(OnFlushEventArgs $eventArgs): void
{
$this->entity = $eventArgs->getEntityManager();
if ($this->entity instanceof Audit||!$this->params->get("auditUse")) return;
$this->audit();
}
private function audit() {
$token = $this->token->getToken();
if(!$token)$user="job";
else {
$user=$token->getUser();
if($user!="anon.") $user = $user->getUsername();
else $user="job";
}
$uow = $this->em->getUnitOfWork();
$uow->computeChangeSets();
foreach ($uow->getScheduledEntityInsertions() as $entity) {
$metaCar = $this->em->getClassMetadata(get_class($entity));
$className=str_replace("App\\Entity\\","",$metaCar->getName());
$nameold="";
if($metaCar->hasField("name"))
$nameold=" = ".$entity->getName();
elseif($metaCar->hasField("label"))
$nameold=" = ".$entity->getLabel();
elseif($metaCar->hasField("username"))
$nameold=" = ".$entity->getUsername();
$audit=new Audit();
$audit->setDatesubmit(new \DateTime("now"));
$audit->setEntityname($className);
$audit->setEntityid($entity->getId());
$audit->setUsername($user);
$audit->setDescription("SUBMIT");
$audit->setDetail(["id"=>$entity->getId().$nameold]);
$this->em->persist($audit);
$uow->computeChangeSet($this->em->getClassMetadata(get_class($audit)), $audit);
}
foreach ($uow->getScheduledEntityDeletions() as $entity) {
$metaCar = $this->em->getClassMetadata(get_class($entity));
$className=str_replace("App\\Entity\\","",$metaCar->getName());
$nameold="";
if($metaCar->hasField("name"))
$nameold=" = ".$entity->getName();
elseif($metaCar->hasField("label"))
$nameold=" = ".$entity->getLabel();
elseif($metaCar->hasField("username"))
$nameold=" = ".$entity->getUsername();
$audit=new Audit();
$audit->setDatesubmit(new \DateTime("now"));
$audit->setEntityname($className);
$audit->setEntityid($entity->getId());
$audit->setUsername($user);
$audit->setDescription("DELETE");
$audit->setDetail(["id"=>$entity->getId().$nameold]);
$this->em->persist($audit);
$uow->computeChangeSet($this->em->getClassMetadata(get_class($audit)), $audit);
}
foreach ($uow->getScheduledEntityUpdates() as $entity) {
$changeSet = $uow->getEntityChangeSet($entity);
// Unaudit field
$className = str_replace("App\\Entity\\","",$this->em->getClassMetadata(get_class($entity))->getName());
switch($className) {
case "Audit":
$changeSet=null;
break;
case "User":
unset($changeSet["visitecpt"]);
unset($changeSet["visitedate"]);
unset($changeSet["preference"]);
unset($changeSet["keyvalue"]);
unset($changeSet["keyexpire"]);
unset($changeSet["apikey"]);
unset($changeSet["password"]);
unset($changeSet["passwordplain"]);
unset($changeSet["salt"]);
break;
default:
unset($changeSet["apikey"]);
break;
}
if ($changeSet) {
$mychange=[];
foreach($changeSet as $key => $value) {
// Le champs modifié est-il une entité
$isentity0=($value[0]&&is_object($value[0])&&get_class($value[0])&&get_class($value[0])!="DateTime");
$isentity1=($value[1]&&is_object($value[1])&&get_class($value[1])&&get_class($value[1])!="DateTime");
if($isentity0||$isentity1) {
$nameold="";
if($isentity0) {
$metaCar = $this->em->getClassMetadata(get_class($value[0]));
if($metaCar->hasField("name"))
$nameold=" = ".$value[0]->getName();
elseif($metaCar->hasField("label"))
$nameold=" = ".$value[0]->getLabel();
elseif($metaCar->hasField("username"))
$nameold=" = ".$value[0]->getUsername();
$nameold= $value[0]->getId().$nameold;
}
$namenew="";
if($isentity1) {
$metaCar = $this->em->getClassMetadata(get_class($value[1]));
if($metaCar->hasField("name"))
$namenew=" = ".$value[1]->getName();
elseif($metaCar->hasField("label"))
$namenew=" = ".$value[1]->getLabel();
elseif($metaCar->hasField("username"))
$namenew=" = ".$value[1]->getUsername();
$namenew= $value[1]->getId().$namenew;
}
$mychange[$key]=[$nameold,$namenew];
}
else $mychange[$key]=$value;
}
$audit=new Audit();
$audit->setDatesubmit(new \DateTime("now"));
$audit->setEntityname($className);
$audit->setEntityid($entity->getId());
$audit->setUsername($user);
$audit->setDescription("UPDATE");
$audit->setDetail($mychange);
$this->em->persist($audit);
$uow->computeChangeSet($this->em->getClassMetadata(get_class($audit)), $audit);
}
}
}
}