nineskeletor/src/EventListener/AllSubscriber.php

205 lines
7.7 KiB
PHP
Executable File

<?php
namespace App\EventListener;
use App\Entity\Audit;
use Doctrine\Bundle\DoctrineBundle\EventSubscriber\EventSubscriberInterface;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Event\OnFlushEventArgs;
use Doctrine\ORM\Events;
use Doctrine\Persistence\Event\LifecycleEventArgs;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
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 ('anon.' != $user) {
$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]) && 'DateTime' != get_class($value[0]));
$isentity1 = ($value[1] && is_object($value[1]) && get_class($value[1]) && 'DateTime' != get_class($value[1]));
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);
}
}
}
}