Reworked the entity listener. #330

This commit is contained in:
Korina Cordero 2020-03-09 06:08:07 +00:00
parent e305dc4c16
commit b743d202fb
4 changed files with 77 additions and 77 deletions

View file

@ -267,14 +267,13 @@ services:
event: 'postPersist' event: 'postPersist'
entity: 'App\Entity\JobOrder' entity: 'App\Entity\JobOrder'
App\EventListener\EntityListener\UserEntityListener: App\EventListener\EntityListener:
arguments: arguments:
$token_storage: "@security.token_storage" $token_storage: "@security.token_storage"
$log_db: '@influxdb_database' $log_db: '@influxdb_database'
$entities: ['App\Entity\User', 'App\Entity\Role']
tags: tags:
- name: 'doctrine.event_listener' - name: 'doctrine.event_listener'
event: 'onFlush' event: 'onFlush'
entity: 'App\Entity\User' - name: 'doctrine.event_listener'
- name: 'doctrine.orm.entity_listener'
event: 'postPersist' event: 'postPersist'
entity: 'App\Entity\User'

View file

@ -25,4 +25,18 @@ class Role extends BaseRole
{ {
parent::__construct(); parent::__construct();
} }
public function fieldDump()
{
// get all fields and their values into an array
$field_array = [
'id' => $this->getID(),
'name' => $this->getName(),
'acl_attributes' => $this->getACLAttributes(),
];
$fields = json_encode($field_array);
return $fields;
}
} }

View file

@ -9,35 +9,46 @@ use Doctrine\ORM\Event\OnFlushEventArgs;
use InfluxDB\Point; use InfluxDB\Point;
use DateTime; class EntityListener
abstract class EntityListener
{ {
protected $token_storage; protected $token_storage;
protected $log_db; protected $log_db;
protected $entities;
public function __construct(TokenStorageInterface $token_storage, $log_db) public function __construct(TokenStorageInterface $token_storage, $log_db,
$entities)
{ {
$this->token_storage = $token_storage; $this->token_storage = $token_storage;
$this->log_db = $log_db; $this->log_db = $log_db;
// reconstruct entity array with class name as keys
// with values of true
foreach ($entities as $entity)
{
$this->entities[$entity] = true;
}
} }
public function postPersist($object, LifecycleEventArgs $args) public function postPersist(LifecycleEventArgs $args)
{ {
//$event_time = new DateTime(); $object = $args->getObject();
// get user id for logging $object_class = get_class($object);
$user = $this->token_storage->getToken()->getUser();
//$username = $user->getUsername();
$user_id = $user->getID();
// get entity name if (isset($this->entities[$object_class]))
$obj_class = preg_replace('/.*\\\\/', '', get_class($object)); {
// get user id for logging
$user = $this->token_storage->getToken()->getUser();
$user_id = $user->getID();
// get fields of object // get entity name
$fields = $object->fieldDump(); //$obj_class = preg_replace('/.*\\\\/', '', $object_class);
$this->writeToLogDB($obj_class, $object->getID(), 'create', $fields, $user_id); // get fields of object
$fields = $object->fieldDump();
$this->writeToLogDB($object_class, $object->getID(), 'create', $fields, $user_id);
}
} }
public function onFlush(OnFlushEventArgs $args) public function onFlush(OnFlushEventArgs $args)
@ -63,56 +74,54 @@ abstract class EntityListener
// get updated fields. This doesn't include lists of other entities. // get updated fields. This doesn't include lists of other entities.
foreach ($updated_entities as $updated_entity) foreach ($updated_entities as $updated_entity)
{ {
// get entity name // check if entity is in list of entities to log
$obj_class = preg_replace('/.*\\\\/', '', get_class($updated_entity)); $entity_class = get_class($updated_entity);
$log_message = $obj_class . ' with id ' . $updated_entity->getID() . ' updated by ' . $user_id; if (isset($this->entities[$entity_class]))
error_log($log_message);
$changeset = $unit_of_work->getEntityChangeSet($updated_entity);
$entity_fields = array_keys($changeset);
foreach ($entity_fields as $field)
{ {
$values = $changeset[$field]; // get entity name
//$obj_class = preg_replace('/.*\\\\/', '', $entity_class);
$old_value = $values[0]; $changeset = $unit_of_work->getEntityChangeSet($updated_entity);
$new_value = $values[1];
$field_changes[$field] = [ $entity_fields = array_keys($changeset);
'old_value' => $values[0], foreach ($entity_fields as $field)
'new_value' => $values[1], {
]; $values = $changeset[$field];
$old_value = $values[0];
$new_value = $values[1];
$field_changes[$field] = [
'old_value' => $values[0],
'new_value' => $values[1],
];
}
$fields = json_encode($field_changes);
$this->writeToLogDB($entity_class, $updated_entity->getID(), 'update', $fields, $user_id);
} }
$fields = json_encode($field_changes);
$this->writeToLogDB($obj_class, $updated_entity->getID(), 'update', $fields, $user_id);
} }
// get deleted objects // get deleted objects
foreach ($deleted_entities as $deleted_entity) foreach ($deleted_entities as $deleted_entity)
{ {
// get entity name // check if entity is in list of entities to log
$obj_class = preg_replace('/.*\\\\/', '', get_class($deleted_entity)); $entity_class = get_class($deleted_entity);
$log_message = $obj_class . ' with id ' . $deleted_entity->getID() . ' deleted by ' . $user_id; if (isset($this->entities[$entity_class]))
{
// get entity name
//$obj_class = preg_replace('/.*\\\\/', '', get_class($deleted_entity));
error_log($log_message); $deleted_id = $deleted_entity->getID();
$deleted_id = $deleted_entity->getID(); // get fields of deleted entity
$fields = $deleted_entity->fieldDump();
// get fields of deleted entity $this->writeToLogDB($entity_class, $deleted_id, 'delete', $fields, $user_id);
$fields = $deleted_entity->fieldDump(); }
$this->writeToLogDB($obj_class, $deleted_id, 'delete', $fields, $user_id);
} }
//$this->log_db->writePoints([new Point(
// 'User',
// 'Action',
// ['status' => 'success']
//)]);
// TODO: find a way to get the list of "old" items, compare with list of updated items // TODO: find a way to get the list of "old" items, compare with list of updated items
// so we can find out what was added/removed // so we can find out what was added/removed
/* /*

View file

@ -1,22 +0,0 @@
<?php
namespace App\EventListener\EntityListener;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use App\EventListener\EntityListener;
class UserEntityListener extends EntityListener
{
protected $token_storage;
protected $log_db;
public function __construct(TokenStorageInterface $token_storage, $log_db)
{
$this->token_storage = $token_storage;
$this->log_db = $log_db;
parent::__construct($token_storage, $log_db);
}
}