From 884e8fefdc869f888b65bb42dd01a16bb1343490 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20B=C5=82oszyk?= Date: Thu, 18 Feb 2021 10:14:39 +0100 Subject: [PATCH 1/2] Add actions --- composer.json | 3 +- src/Action/CompareAction.php | 62 +++++++++++++++ src/Action/IndexAction.php | 48 ++++++++++++ src/Action/ViewDetailAction.php | 56 ++++++++++++++ src/Action/ViewEntityAction.php | 51 +++++++++++++ src/Action/ViewRevisionAction.php | 55 ++++++++++++++ src/Controller/AuditController.php | 76 ++++++------------- .../SimpleThingsEntityAuditExtension.php | 1 + src/Resources/config/actions.xml | 25 ++++++ src/Resources/config/routing.yml | 10 +-- 10 files changed, 327 insertions(+), 60 deletions(-) create mode 100644 src/Action/CompareAction.php create mode 100644 src/Action/IndexAction.php create mode 100644 src/Action/ViewDetailAction.php create mode 100644 src/Action/ViewEntityAction.php create mode 100644 src/Action/ViewRevisionAction.php create mode 100644 src/Resources/config/actions.xml diff --git a/composer.json b/composer.json index 18a50edf..1af3368e 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,8 @@ "php": "^7.3 || ^8.0", "doctrine/dbal": "^2.5", "doctrine/orm": "^2.7", - "symfony/config": "^4.4 || ^5.2" + "symfony/config": "^4.4 || ^5.2", + "twig/twig": "^2.6 || ^3.0" }, "conflict": { "doctrine/dbal": "2.7.0", diff --git a/src/Action/CompareAction.php b/src/Action/CompareAction.php new file mode 100644 index 00000000..3f367d5b --- /dev/null +++ b/src/Action/CompareAction.php @@ -0,0 +1,62 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SimpleThings\EntityAudit\Action; + +use SimpleThings\EntityAudit\AuditReader; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Twig\Environment; + +class CompareAction +{ + /** + * @var AuditReader + */ + private $auditReader; + + /** + * @var Environment + */ + private $twig; + + public function __construct(Environment $twig, AuditReader $auditReader) + { + $this->twig = $twig; + $this->auditReader = $auditReader; + } + + public function __invoke(Request $request, string $className, string $id, ?int $oldRev = null, ?int $newRev = null): Response + { + if (null === $oldRev) { + $oldRev = $request->query->get('oldRev'); + } + + if (null === $newRev) { + $newRev = $request->query->get('newRev'); + } + + $ids = explode(',', $id); + $diff = $this->auditReader->diff($className, $ids, $oldRev, $newRev); + + $content = $this->twig->render('@SimpleThingsEntityAudit/Audit/compare.html.twig', [ + 'className' => $className, + 'id' => $id, + 'oldRev' => $oldRev, + 'newRev' => $newRev, + 'diff' => $diff, + ]); + + return new Response($content); + } +} diff --git a/src/Action/IndexAction.php b/src/Action/IndexAction.php new file mode 100644 index 00000000..bfa9b0da --- /dev/null +++ b/src/Action/IndexAction.php @@ -0,0 +1,48 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SimpleThings\EntityAudit\Action; + +use SimpleThings\EntityAudit\AuditReader; +use Symfony\Component\HttpFoundation\Response; +use Twig\Environment; + +class IndexAction +{ + /** + * @var AuditReader + */ + private $auditReader; + + /** + * @var Environment + */ + private $twig; + + public function __construct(Environment $twig, AuditReader $auditReader) + { + $this->twig = $twig; + $this->auditReader = $auditReader; + } + + public function __invoke(int $page = 1): Response + { + $revisions = $this->auditReader->findRevisionHistory(20, 20 * ($page - 1)); + + $content = $this->twig->render('@SimpleThingsEntityAudit/Audit/index.html.twig', [ + 'revisions' => $revisions, + ]); + + return new Response($content); + } +} diff --git a/src/Action/ViewDetailAction.php b/src/Action/ViewDetailAction.php new file mode 100644 index 00000000..7fbf5bfd --- /dev/null +++ b/src/Action/ViewDetailAction.php @@ -0,0 +1,56 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SimpleThings\EntityAudit\Action; + +use SimpleThings\EntityAudit\AuditReader; +use Symfony\Component\HttpFoundation\Response; +use Twig\Environment; + +class ViewDetailAction +{ + /** + * @var AuditReader + */ + private $auditReader; + + /** + * @var Environment + */ + private $twig; + + public function __construct(Environment $twig, AuditReader $auditReader) + { + $this->twig = $twig; + $this->auditReader = $auditReader; + } + + public function __invoke(string $className, string $id, int $rev): Response + { + $ids = explode(',', $id); + $entity = $this->auditReader->find($className, $ids, $rev); + + $data = $this->auditReader->getEntityValues($className, $entity); + krsort($data); + + $content = $this->twig->render('@SimpleThingsEntityAudit/Audit/view_detail.html.twig', [ + 'id' => $id, + 'rev' => $rev, + 'className' => $className, + 'entity' => $entity, + 'data' => $data, + ]); + + return new Response($content); + } +} diff --git a/src/Action/ViewEntityAction.php b/src/Action/ViewEntityAction.php new file mode 100644 index 00000000..c7806cc6 --- /dev/null +++ b/src/Action/ViewEntityAction.php @@ -0,0 +1,51 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SimpleThings\EntityAudit\Action; + +use SimpleThings\EntityAudit\AuditReader; +use Symfony\Component\HttpFoundation\Response; +use Twig\Environment; + +class ViewEntityAction +{ + /** + * @var AuditReader + */ + private $auditReader; + + /** + * @var Environment + */ + private $twig; + + public function __construct(Environment $twig, AuditReader $auditReader) + { + $this->twig = $twig; + $this->auditReader = $auditReader; + } + + public function __invoke(string $className, string $id): Response + { + $ids = explode(',', $id); + $revisions = $this->auditReader->findRevisions($className, $ids); + + $content = $this->twig->render('@SimpleThingsEntityAudit/Audit/view_entity.html.twig', [ + 'id' => $id, + 'className' => $className, + 'revisions' => $revisions, + ]); + + return new Response($content); + } +} diff --git a/src/Action/ViewRevisionAction.php b/src/Action/ViewRevisionAction.php new file mode 100644 index 00000000..06c46ea6 --- /dev/null +++ b/src/Action/ViewRevisionAction.php @@ -0,0 +1,55 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SimpleThings\EntityAudit\Action; + +use SimpleThings\EntityAudit\AuditReader; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; +use Twig\Environment; + +class ViewRevisionAction +{ + /** + * @var AuditReader + */ + private $auditReader; + + /** + * @var Environment + */ + private $twig; + + public function __construct(Environment $twig, AuditReader $auditReader) + { + $this->twig = $twig; + $this->auditReader = $auditReader; + } + + public function __invoke(int $rev): Response + { + $revision = $this->auditReader->findRevision($rev); + if (!$revision) { + throw new NotFoundHttpException(sprintf('Revision %i not found', $rev)); + } + + $changedEntities = $this->auditReader->findEntitiesChangedAtRevision($rev); + + $content = $this->twig->render('@SimpleThingsEntityAudit/Audit/view_revision.html.twig', [ + 'revision' => $revision, + 'changedEntities' => $changedEntities, + ]); + + return new Response($content); + } +} diff --git a/src/Controller/AuditController.php b/src/Controller/AuditController.php index d04b5f24..fb4651ce 100644 --- a/src/Controller/AuditController.php +++ b/src/Controller/AuditController.php @@ -13,6 +13,11 @@ namespace SimpleThings\EntityAudit\Controller; +use SimpleThings\EntityAudit\Action\CompareAction; +use SimpleThings\EntityAudit\Action\IndexAction; +use SimpleThings\EntityAudit\Action\ViewDetailAction; +use SimpleThings\EntityAudit\Action\ViewEntityAction; +use SimpleThings\EntityAudit\Action\ViewRevisionAction; use SimpleThings\EntityAudit\AuditManager; use SimpleThings\EntityAudit\AuditReader; use Symfony\Bundle\FrameworkBundle\Controller\Controller; @@ -24,6 +29,10 @@ * Controller for listing auditing information. * * @author Tim Nagel + * + * @deprecated since sonata-project/entity-audit-bundle 1.x, will be remove in 2.0. + * + * NEXT_MAJOR: remove this controller */ class AuditController extends Controller { @@ -36,12 +45,9 @@ class AuditController extends Controller */ public function indexAction($page = 1) { - $reader = $this->getAuditReader(); - $revisions = $reader->findRevisionHistory(20, 20 * ($page - 1)); + $indexAction = new IndexAction($this->get('twig'), $this->getAuditReader()); - return $this->render('@SimpleThingsEntityAudit/Audit/index.html.twig', [ - 'revisions' => $revisions, - ]); + return $indexAction($page); } /** @@ -55,17 +61,9 @@ public function indexAction($page = 1) */ public function viewRevisionAction($rev) { - $revision = $this->getAuditReader()->findRevision($rev); - if (!$revision) { - throw $this->createNotFoundException(sprintf('Revision %i not found', $rev)); - } - - $changedEntities = $this->getAuditReader()->findEntitiesChangedAtRevision($rev); + $viewRevisionAction = new ViewRevisionAction($this->get('twig'), $this->getAuditReader()); - return $this->render('@SimpleThingsEntityAudit/Audit/view_revision.html.twig', [ - 'revision' => $revision, - 'changedEntities' => $changedEntities, - ]); + return $viewRevisionAction($rev); } /** @@ -78,14 +76,9 @@ public function viewRevisionAction($rev) */ public function viewEntityAction($className, $id) { - $ids = explode(',', $id); - $revisions = $this->getAuditReader()->findRevisions($className, $ids); - - return $this->render('@SimpleThingsEntityAudit/Audit/view_entity.html.twig', [ - 'id' => $id, - 'className' => $className, - 'revisions' => $revisions, - ]); + $viewEntityAction = new ViewEntityAction($this->get('twig'), $this->getAuditReader()); + + return $viewEntityAction($className, $id); } /** @@ -99,19 +92,9 @@ public function viewEntityAction($className, $id) */ public function viewDetailAction($className, $id, $rev) { - $ids = explode(',', $id); - $entity = $this->getAuditReader()->find($className, $ids, $rev); - - $data = $this->getAuditReader()->getEntityValues($className, $entity); - krsort($data); - - return $this->render('@SimpleThingsEntityAudit/Audit/view_detail.html.twig', [ - 'id' => $id, - 'rev' => $rev, - 'className' => $className, - 'entity' => $entity, - 'data' => $data, - ]); + $viewDetailAction = new ViewDetailAction($this->get('twig'), $this->getAuditReader()); + + return $viewDetailAction($className, $id, $rev); } /** @@ -126,24 +109,9 @@ public function viewDetailAction($className, $id, $rev) */ public function compareAction(Request $request, $className, $id, $oldRev = null, $newRev = null) { - if (null === $oldRev) { - $oldRev = $request->query->get('oldRev'); - } - - if (null === $newRev) { - $newRev = $request->query->get('newRev'); - } - - $ids = explode(',', $id); - $diff = $this->getAuditReader()->diff($className, $ids, $oldRev, $newRev); - - return $this->render('@SimpleThingsEntityAudit/Audit/compare.html.twig', [ - 'className' => $className, - 'id' => $id, - 'oldRev' => $oldRev, - 'newRev' => $newRev, - 'diff' => $diff, - ]); + $compareAction = new CompareAction($this->get('twig'), $this->getAuditReader()); + + return $compareAction($request, $className, $id, $oldRev, $newRev); } /** diff --git a/src/DependencyInjection/SimpleThingsEntityAuditExtension.php b/src/DependencyInjection/SimpleThingsEntityAuditExtension.php index 6f3937b7..c57775c7 100644 --- a/src/DependencyInjection/SimpleThingsEntityAuditExtension.php +++ b/src/DependencyInjection/SimpleThingsEntityAuditExtension.php @@ -25,6 +25,7 @@ public function load(array $configs, ContainerBuilder $container): void $config = $this->processConfiguration(new Configuration(), $configs); $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); + $loader->load('actions.xml'); $loader->load('auditable.xml'); $configurables = [ diff --git a/src/Resources/config/actions.xml b/src/Resources/config/actions.xml new file mode 100644 index 00000000..8e014673 --- /dev/null +++ b/src/Resources/config/actions.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Resources/config/routing.yml b/src/Resources/config/routing.yml index bc71b53b..14861265 100644 --- a/src/Resources/config/routing.yml +++ b/src/Resources/config/routing.yml @@ -1,6 +1,6 @@ simple_things_entity_audit_home: path: /{page} - controller: SimpleThings\EntityAudit\Controller\AuditController::indexAction + controller: SimpleThings\EntityAudit\Action\IndexAction defaults: page: 1 requirements: @@ -8,23 +8,23 @@ simple_things_entity_audit_home: simple_things_entity_audit_viewrevision: path: /viewrev/{rev} - controller: SimpleThings\EntityAudit\Controller\AuditController::viewRevisionAction + controller: SimpleThings\EntityAudit\Action\ViewRevisionAction requirements: rev: \d+ simple_things_entity_audit_viewentity_detail: path: /viewent/{className}/{id}/{rev} - controller: SimpleThings\EntityAudit\Controller\AuditController::viewDetailAction + controller: SimpleThings\EntityAudit\Action\ViewDetailAction requirements: rev: \d+ simple_things_entity_audit_viewentity: path: /viewent/{className}/{id} - controller: SimpleThings\EntityAudit\Controller\AuditController::viewEntityAction + controller: SimpleThings\EntityAudit\Action\ViewEntityAction simple_things_entity_audit_compare: path: /compare/{className}/{id}/{oldRev}/{newRev} - controller: SimpleThings\EntityAudit\Controller\AuditController::compareAction + controller: SimpleThings\EntityAudit\Action\CompareAction defaults: oldRev: ~ newRev: ~ From 7968269904690299718a6c29d3dc7fed718689f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20B=C5=82oszyk?= Date: Thu, 18 Feb 2021 12:19:15 +0100 Subject: [PATCH 2/2] Make actions final --- src/Action/CompareAction.php | 2 +- src/Action/IndexAction.php | 2 +- src/Action/ViewDetailAction.php | 2 +- src/Action/ViewEntityAction.php | 2 +- src/Action/ViewRevisionAction.php | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Action/CompareAction.php b/src/Action/CompareAction.php index 3f367d5b..dc1c17c7 100644 --- a/src/Action/CompareAction.php +++ b/src/Action/CompareAction.php @@ -18,7 +18,7 @@ use Symfony\Component\HttpFoundation\Response; use Twig\Environment; -class CompareAction +final class CompareAction { /** * @var AuditReader diff --git a/src/Action/IndexAction.php b/src/Action/IndexAction.php index bfa9b0da..1e059aec 100644 --- a/src/Action/IndexAction.php +++ b/src/Action/IndexAction.php @@ -17,7 +17,7 @@ use Symfony\Component\HttpFoundation\Response; use Twig\Environment; -class IndexAction +final class IndexAction { /** * @var AuditReader diff --git a/src/Action/ViewDetailAction.php b/src/Action/ViewDetailAction.php index 7fbf5bfd..9b13ec2f 100644 --- a/src/Action/ViewDetailAction.php +++ b/src/Action/ViewDetailAction.php @@ -17,7 +17,7 @@ use Symfony\Component\HttpFoundation\Response; use Twig\Environment; -class ViewDetailAction +final class ViewDetailAction { /** * @var AuditReader diff --git a/src/Action/ViewEntityAction.php b/src/Action/ViewEntityAction.php index c7806cc6..bef27ab5 100644 --- a/src/Action/ViewEntityAction.php +++ b/src/Action/ViewEntityAction.php @@ -17,7 +17,7 @@ use Symfony\Component\HttpFoundation\Response; use Twig\Environment; -class ViewEntityAction +final class ViewEntityAction { /** * @var AuditReader diff --git a/src/Action/ViewRevisionAction.php b/src/Action/ViewRevisionAction.php index 06c46ea6..b548bf5f 100644 --- a/src/Action/ViewRevisionAction.php +++ b/src/Action/ViewRevisionAction.php @@ -18,7 +18,7 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Twig\Environment; -class ViewRevisionAction +final class ViewRevisionAction { /** * @var AuditReader