Skip to content

Commit 17898e6

Browse files
committed
Refactor du log d'audit
Le logger actuel est une classe globale qui utilise l'ancienne connexion à la base de données. Le refactor apporte plusieurs choses : - dépendance injectée donc plus facile à tester - récupération automatique de metadonnées (user, route, etc)
1 parent de46dca commit 17898e6

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+376
-317
lines changed

app/config/routing/admin.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ admin_healthcheck:
116116
admin_logs:
117117
path: /logs/{page}
118118
defaults:
119-
_controller: AppBundle\Controller\Admin\LogsController
119+
_controller: AppBundle\Controller\Admin\Audit\IndexAction
120120
page: 1
121121
requirements:
122122
id: '\d+'
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use Phinx\Migration\AbstractMigration;
6+
7+
final class AddRouteToLogsTable extends AbstractMigration
8+
{
9+
public function change(): void
10+
{
11+
$this->table('afup_logs')
12+
->addColumn('route', 'string', [
13+
'limit' => 255,
14+
'null' => true,
15+
])
16+
->update();
17+
}
18+
}

sources/Afup/Logger/DbLoggerTrait.php

Lines changed: 0 additions & 18 deletions
This file was deleted.

sources/Afup/Utils/Logs.php

Lines changed: 0 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -63,45 +63,4 @@ public static function log($texte): void
6363
$requete .= ')';
6464
$instance->_bdd->Executer($requete);
6565
}
66-
67-
/**
68-
* Renvoit tous les logs de la page indiquée
69-
*
70-
* @param int $numero_page Numéro de la page concernée
71-
* @return array Les logs correspondant à la page indiquée
72-
*/
73-
public static function obtenirTous($numero_page)
74-
{
75-
$instance = & self::_obtenirInstance();
76-
$depart = ($numero_page - 1) * $instance->_nombre_logs_par_page;
77-
$requete = 'SELECT';
78-
$requete .= ' afup_logs.*,';
79-
$requete .= ' IF(afup_personnes_physiques.nom != "", afup_personnes_physiques.nom, "BOT") as nom,';
80-
$requete .= ' afup_personnes_physiques.prenom ';
81-
$requete .= 'FROM';
82-
$requete .= ' afup_logs';
83-
$requete .= ' LEFT JOIN afup_personnes_physiques';
84-
$requete .= ' ON afup_personnes_physiques.id=afup_logs.id_personne_physique ';
85-
$requete .= 'ORDER BY';
86-
$requete .= ' afup_logs.date DESC ';
87-
$requete .= 'LIMIT';
88-
$requete .= ' ' . $depart . ', ' . $instance->_nombre_logs_par_page;
89-
return $instance->_bdd->obtenirTous($requete);
90-
}
91-
92-
/**
93-
* Renvoit le nombre de pages de logs
94-
*
95-
* @return int Nombre de pages
96-
*/
97-
public static function obtenirNombrePages(): int
98-
{
99-
$instance = & self::_obtenirInstance();
100-
$nombre = $instance->_bdd->obtenirUn('SELECT COUNT(*) FROM afup_logs');
101-
if (!$instance->_nombre_logs_par_page) {
102-
return 1;
103-
}
104-
$nombre = ceil($nombre / $instance->_nombre_logs_par_page);
105-
return $nombre === 0.0 ? 1 : (int) $nombre;
106-
}
10766
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace AppBundle\AuditLog;
6+
7+
use AppBundle\Association\Model\User;
8+
use Symfony\Bundle\SecurityBundle\Security;
9+
use Symfony\Component\HttpFoundation\RequestStack;
10+
11+
final readonly class Audit
12+
{
13+
public function __construct(
14+
private Security $security,
15+
private RequestStack $requestStack,
16+
private AuditLogRepository $repository,
17+
) {}
18+
19+
public function log(string $message): void
20+
{
21+
$userId = null;
22+
$user = $this->security->getUser();
23+
if ($user instanceof User) {
24+
$userId = $user->getId();
25+
}
26+
27+
$route = $this->requestStack->getCurrentRequest()->get('_route');
28+
29+
$this->repository->save($message, $userId, $route);
30+
}
31+
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace AppBundle\AuditLog;
6+
7+
use CuyZ\Valinor\Mapper\Source\Source;
8+
use CuyZ\Valinor\MapperBuilder;
9+
use Doctrine\DBAL\Connection;
10+
use Psr\Clock\ClockInterface;
11+
12+
final readonly class AuditLogRepository
13+
{
14+
private const ITEMS_PER_PAGE = 10;
15+
16+
public function __construct(
17+
private Connection $connection,
18+
private MapperBuilder $mapperBuilder,
19+
private ClockInterface $clock,
20+
) {}
21+
22+
public function save(string $texte, ?int $userId, ?string $route): void
23+
{
24+
$query = $this->connection->createQueryBuilder()
25+
->insert('afup_logs')
26+
->setValue('texte', ':texte')
27+
->setParameter('texte', $texte)
28+
->setValue('date', ':date')
29+
->setParameter('date', $this->clock->now()->getTimestamp())
30+
;
31+
32+
if ($userId) {
33+
$query->setValue('id_personne_physique', ':userId');
34+
$query->setParameter('userId', $userId);
35+
}
36+
37+
if ($route) {
38+
$query->setValue('route', ':route');
39+
$query->setParameter('route', $route);
40+
}
41+
42+
$query->executeStatement();
43+
}
44+
45+
/**
46+
* @return array<LogEntry>
47+
*/
48+
public function paginate(int $page): array
49+
{
50+
$query = $this->connection->createQueryBuilder()
51+
->select('al.*', 'pe.nom', 'pe.prenom')
52+
->from('afup_logs', 'al')
53+
->leftJoin('al', 'afup_personnes_physiques', 'pe', 'pe.id = al.id_personne_physique')
54+
->orderBy('al.date', 'desc')
55+
->setMaxResults(self::ITEMS_PER_PAGE)
56+
->setFirstResult(($page - 1) * self::ITEMS_PER_PAGE);
57+
58+
return $this->mapperBuilder
59+
->supportDateFormats('U')
60+
->mapper()
61+
->map(
62+
'array<' . LogEntry::class . '>',
63+
Source::array($query->fetchAllAssociative())->camelCaseKeys(),
64+
);
65+
}
66+
67+
public function countPages(): int
68+
{
69+
$total = (int) $this->connection->createQueryBuilder()
70+
->select('count(*)')
71+
->from('afup_logs')
72+
->fetchOne();
73+
74+
$pages = (int) ceil($total / self::ITEMS_PER_PAGE);
75+
76+
return $pages === 0 ? 1 : $pages;
77+
}
78+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace AppBundle\AuditLog;
6+
7+
final readonly class LogEntry
8+
{
9+
public function __construct(
10+
public int $id,
11+
public \DateTimeImmutable $date,
12+
public string $texte,
13+
public ?string $route,
14+
public ?int $idPersonnePhysique,
15+
public ?string $nom,
16+
public ?string $prenom,
17+
) {}
18+
}

sources/AppBundle/Controller/Admin/Accounting/Configuration/AddAccountAction.php

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,19 @@
44

55
namespace AppBundle\Controller\Admin\Accounting\Configuration;
66

7-
use Afup\Site\Logger\DbLoggerTrait;
87
use AppBundle\Accounting\Form\AccountType;
98
use AppBundle\Accounting\Model\Account;
109
use AppBundle\Accounting\Model\Repository\AccountRepository;
10+
use AppBundle\AuditLog\Audit;
1111
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
1212
use Symfony\Component\HttpFoundation\Request;
1313
use Symfony\Component\HttpFoundation\Response;
1414

1515
final class AddAccountAction extends AbstractController
1616
{
17-
use DbLoggerTrait;
18-
1917
public function __construct(
2018
private readonly AccountRepository $accountRepository,
19+
private readonly Audit $audit,
2120
) {}
2221

2322
public function __invoke(Request $request): Response
@@ -27,7 +26,7 @@ public function __invoke(Request $request): Response
2726
$form->handleRequest($request);
2827
if ($form->isSubmitted() && $form->isValid()) {
2928
$this->accountRepository->save($account);
30-
$this->log('Ajout du compte ' . $account->getName());
29+
$this->audit->log('Ajout du compte ' . $account->getName());
3130
$this->addFlash('notice', 'Le compte ' . $account->getName() . ' a été créé');
3231
return $this->redirect('/pages/administration/index.php?page=compta_conf_compte&action=lister&filtre=' . $account->getName());
3332
}

sources/AppBundle/Controller/Admin/Accounting/Configuration/AddCategoryAction.php

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,19 @@
44

55
namespace AppBundle\Controller\Admin\Accounting\Configuration;
66

7-
use Afup\Site\Logger\DbLoggerTrait;
87
use AppBundle\Accounting\Form\CategoryType;
98
use AppBundle\Accounting\Model\Category;
109
use AppBundle\Accounting\Model\Repository\CategoryRepository;
10+
use AppBundle\AuditLog\Audit;
1111
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
1212
use Symfony\Component\HttpFoundation\Request;
1313
use Symfony\Component\HttpFoundation\Response;
1414

1515
final class AddCategoryAction extends AbstractController
1616
{
17-
use DbLoggerTrait;
18-
1917
public function __construct(
2018
private readonly CategoryRepository $categoryRepository,
19+
private readonly Audit $audit,
2120
) {}
2221

2322
public function __invoke(Request $request): Response
@@ -27,7 +26,7 @@ public function __invoke(Request $request): Response
2726
$form->handleRequest($request);
2827
if ($form->isSubmitted() && $form->isValid()) {
2928
$this->categoryRepository->save($category);
30-
$this->log('Ajout de la catégorie ' . $category->getName());
29+
$this->audit->log('Ajout de la catégorie ' . $category->getName());
3130
$this->addFlash('notice', 'La catégorie a été ajoutée');
3231
return $this->redirectToRoute('admin_accounting_categories_list');
3332
}

sources/AppBundle/Controller/Admin/Accounting/Configuration/AddEventAction.php

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,19 @@
44

55
namespace AppBundle\Controller\Admin\Accounting\Configuration;
66

7-
use Afup\Site\Logger\DbLoggerTrait;
87
use AppBundle\Accounting\Form\EventType;
98
use AppBundle\Accounting\Model\Event;
109
use AppBundle\Accounting\Model\Repository\EventRepository;
10+
use AppBundle\AuditLog\Audit;
1111
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
1212
use Symfony\Component\HttpFoundation\Request;
1313
use Symfony\Component\HttpFoundation\Response;
1414

1515
final class AddEventAction extends AbstractController
1616
{
17-
use DbLoggerTrait;
18-
1917
public function __construct(
2018
private readonly EventRepository $eventRepository,
19+
private readonly Audit $audit,
2120
) {}
2221

2322
public function __invoke(Request $request): Response
@@ -27,7 +26,7 @@ public function __invoke(Request $request): Response
2726
$form->handleRequest($request);
2827
if ($form->isSubmitted() && $form->isValid()) {
2928
$this->eventRepository->save($event);
30-
$this->log('Ajout de l\'évènement ' . $event->getName());
29+
$this->audit->log('Ajout de l\'évènement ' . $event->getName());
3130
$this->addFlash('notice', 'L\'évènement a été ajouté');
3231
return $this->redirectToRoute('admin_accounting_events_list');
3332
}

0 commit comments

Comments
 (0)