Passed
Push — 4.0-wip ( 6335ec...2b093e )
by Damien
04:23
created

ViewerController::showTransactionAction()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 4
c 1
b 0
f 0
nc 1
nop 2
dl 0
loc 7
rs 10
1
<?php
2
3
namespace DH\AuditorBundle\Controller;
4
5
use DH\Auditor\Exception\AccessDeniedException;
6
use DH\Auditor\Provider\Doctrine\Auditing\Annotation\Security;
7
use DH\Auditor\Provider\Doctrine\Configuration;
8
use DH\Auditor\Provider\Doctrine\Persistence\Reader\Reader;
9
use DH\Auditor\Provider\Doctrine\Persistence\Schema\SchemaManager;
10
use DH\Auditor\Provider\Doctrine\Service\AuditingService;
11
use DH\AuditorBundle\Helper\UrlHelper;
12
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
13
use Symfony\Component\HttpFoundation\Request;
14
use Symfony\Component\HttpFoundation\Response;
15
use Symfony\Component\Routing\Annotation\Route;
16
17
class ViewerController extends AbstractController
18
{
19
    /**
20
     * @Route("/audit", name="dh_auditor_list_audits", methods={"GET"})
21
     */
22
    public function listAuditsAction(Reader $reader): Response
23
    {
24
        $schemaManager = new SchemaManager($reader->getProvider());
25
26
        /** @var AuditingService[] $auditingServices */
27
        $auditingServices = $reader->getProvider()->getAuditingServices();
28
        $audited = [];
29
        $scope = Security::VIEW_SCOPE;
30
        foreach ($auditingServices as $name => $auditingService) {
31
            $audited = array_merge(
32
                $audited,
33
                array_filter(
34
                    $schemaManager->getAuditableTableNames($auditingService->getEntityManager()),
35
                    function ($entity) use ($reader, $scope) {
36
                        /** @var Configuration $configuration */
37
                        $configuration = $reader->getProvider()->getConfiguration();
38
                        $roleChecker = $configuration->getRoleChecker();
39
40
                        return null === $roleChecker ? true : $roleChecker->call($this, $entity, $scope);
41
                    },
42
                    ARRAY_FILTER_USE_KEY
43
                )
44
            );
45
        }
46
47
        return $this->render('@DHAuditor/Audit/audits.html.twig', [
48
            'audited' => $audited,
49
            'reader' => $reader,
50
        ]);
51
    }
52
53
    /**
54
     * @Route("/audit/transaction/{hash}", name="dh_auditor_show_transaction", methods={"GET"})
55
     */
56
    public function showTransactionAction(Reader $reader, string $hash): Response
57
    {
58
        $audits = $reader->getAuditsByTransactionHash($hash);
59
60
        return $this->render('@DHAuditor/Audit/transaction.html.twig', [
61
            'hash' => $hash,
62
            'audits' => $audits,
63
        ]);
64
    }
65
66
    /**
67
     * @Route("/audit/{entity}/{id}", name="dh_auditor_show_entity_history", methods={"GET"})
68
     *
69
     * @param int|string $id
70
     */
71
    public function showEntityHistoryAction(Request $request, Reader $reader, string $entity, $id = null): Response
72
    {
73
        $page = (int) $request->query->get('page', '1');
74
        $entity = UrlHelper::paramToNamespace($entity);
75
76
        if (!$reader->getProvider()->isAuditable($entity)) {
77
            throw $this->createNotFoundException();
78
        }
79
80
        try {
81
            $pager = $reader->paginate($reader->createQuery($entity, [
82
                'object_id' => $id,
83
                'page' => $page,
84
                'page_size' => Reader::PAGE_SIZE,
85
            ]), $page, Reader::PAGE_SIZE);
86
        } catch (AccessDeniedException $e) {
87
            throw $this->createAccessDeniedException();
88
        }
89
90
        return $this->render('@DHAuditor/Audit/entity_history.html.twig', [
91
            'id' => $id,
92
            'entity' => $entity,
93
            'paginator' => $pager,
94
        ]);
95
    }
96
}
97