Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion app/config/routing/admin.yml
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ admin_healthcheck:
admin_logs:
path: /logs/{page}
defaults:
_controller: AppBundle\Controller\Admin\LogsController
_controller: AppBundle\Controller\Admin\Audit\IndexAction
page: 1
requirements:
id: '\d+'
Expand Down
18 changes: 18 additions & 0 deletions db/migrations/20251110193547_add_route_to_logs_table.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class AddRouteToLogsTable extends AbstractMigration
{
public function change(): void
{
$this->table('afup_logs')
->addColumn('route', 'string', [
'limit' => 255,
'null' => true,
])
->update();
}
}
18 changes: 0 additions & 18 deletions sources/Afup/Logger/DbLoggerTrait.php

This file was deleted.

41 changes: 0 additions & 41 deletions sources/Afup/Utils/Logs.php
Original file line number Diff line number Diff line change
Expand Up @@ -63,45 +63,4 @@ public static function log($texte): void
$requete .= ')';
$instance->_bdd->Executer($requete);
}

/**
* Renvoit tous les logs de la page indiquée
*
* @param int $numero_page Numéro de la page concernée
* @return array Les logs correspondant à la page indiquée
*/
public static function obtenirTous($numero_page)
{
$instance = & self::_obtenirInstance();
$depart = ($numero_page - 1) * $instance->_nombre_logs_par_page;
$requete = 'SELECT';
$requete .= ' afup_logs.*,';
$requete .= ' IF(afup_personnes_physiques.nom != "", afup_personnes_physiques.nom, "BOT") as nom,';
$requete .= ' afup_personnes_physiques.prenom ';
$requete .= 'FROM';
$requete .= ' afup_logs';
$requete .= ' LEFT JOIN afup_personnes_physiques';
$requete .= ' ON afup_personnes_physiques.id=afup_logs.id_personne_physique ';
$requete .= 'ORDER BY';
$requete .= ' afup_logs.date DESC ';
$requete .= 'LIMIT';
$requete .= ' ' . $depart . ', ' . $instance->_nombre_logs_par_page;
return $instance->_bdd->obtenirTous($requete);
}

/**
* Renvoit le nombre de pages de logs
*
* @return int Nombre de pages
*/
public static function obtenirNombrePages(): int
{
$instance = & self::_obtenirInstance();
$nombre = $instance->_bdd->obtenirUn('SELECT COUNT(*) FROM afup_logs');
if (!$instance->_nombre_logs_par_page) {
return 1;
}
$nombre = ceil($nombre / $instance->_nombre_logs_par_page);
return $nombre === 0.0 ? 1 : (int) $nombre;
}
}
31 changes: 31 additions & 0 deletions sources/AppBundle/AuditLog/Audit.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php

declare(strict_types=1);

namespace AppBundle\AuditLog;

use AppBundle\Association\Model\User;
use Symfony\Bundle\SecurityBundle\Security;
use Symfony\Component\HttpFoundation\RequestStack;

final readonly class Audit
{
public function __construct(
private Security $security,
private RequestStack $requestStack,
private AuditLogRepository $repository,
) {}

public function log(string $message): void
{
$userId = null;
$user = $this->security->getUser();
if ($user instanceof User) {
$userId = $user->getId();
}

$route = $this->requestStack->getCurrentRequest()->get('_route');

$this->repository->save($message, $userId, $route);
}
}
78 changes: 78 additions & 0 deletions sources/AppBundle/AuditLog/AuditLogRepository.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
<?php

declare(strict_types=1);

namespace AppBundle\AuditLog;

use CuyZ\Valinor\Mapper\Source\Source;
use CuyZ\Valinor\MapperBuilder;
use Doctrine\DBAL\Connection;
use Psr\Clock\ClockInterface;

final readonly class AuditLogRepository
{
private const ITEMS_PER_PAGE = 10;

public function __construct(
private Connection $connection,
private MapperBuilder $mapperBuilder,
private ClockInterface $clock,
) {}

public function save(string $texte, ?int $userId, ?string $route): void
{
$query = $this->connection->createQueryBuilder()
->insert('afup_logs')
->setValue('texte', ':texte')
->setParameter('texte', $texte)
->setValue('date', ':date')
->setParameter('date', $this->clock->now()->getTimestamp())
;

if ($userId) {
$query->setValue('id_personne_physique', ':userId');
$query->setParameter('userId', $userId);
}

if ($route) {
$query->setValue('route', ':route');
$query->setParameter('route', $route);
}

$query->executeStatement();
}

/**
* @return array<LogEntry>
*/
public function paginate(int $page): array
{
$query = $this->connection->createQueryBuilder()
->select('al.*', 'pe.nom', 'pe.prenom')
->from('afup_logs', 'al')
->leftJoin('al', 'afup_personnes_physiques', 'pe', 'pe.id = al.id_personne_physique')
->orderBy('al.date', 'desc')
->setMaxResults(self::ITEMS_PER_PAGE)
->setFirstResult(($page - 1) * self::ITEMS_PER_PAGE);

return $this->mapperBuilder
->supportDateFormats('U')
->mapper()
->map(
'array<' . LogEntry::class . '>',
Source::array($query->fetchAllAssociative())->camelCaseKeys(),
);
}

public function countPages(): int
{
$total = (int) $this->connection->createQueryBuilder()
->select('count(*)')
->from('afup_logs')
->fetchOne();

$pages = (int) ceil($total / self::ITEMS_PER_PAGE);

return $pages === 0 ? 1 : $pages;
}
}
18 changes: 18 additions & 0 deletions sources/AppBundle/AuditLog/LogEntry.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

declare(strict_types=1);

namespace AppBundle\AuditLog;

final readonly class LogEntry
{
public function __construct(
public int $id,
public \DateTimeImmutable $date,
public string $texte,
public ?string $route,
public ?int $idPersonnePhysique,
public ?string $nom,
public ?string $prenom,
) {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,19 @@

namespace AppBundle\Controller\Admin\Accounting\Configuration;

use Afup\Site\Logger\DbLoggerTrait;
use AppBundle\Accounting\Form\AccountType;
use AppBundle\Accounting\Model\Account;
use AppBundle\Accounting\Model\Repository\AccountRepository;
use AppBundle\AuditLog\Audit;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

final class AddAccountAction extends AbstractController
{
use DbLoggerTrait;

public function __construct(
private readonly AccountRepository $accountRepository,
private readonly Audit $audit,
) {}

public function __invoke(Request $request): Response
Expand All @@ -27,7 +26,7 @@ public function __invoke(Request $request): Response
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->accountRepository->save($account);
$this->log('Ajout du compte ' . $account->getName());
$this->audit->log('Ajout du compte ' . $account->getName());
$this->addFlash('notice', 'Le compte ' . $account->getName() . ' a été créé');
return $this->redirect('/pages/administration/index.php?page=compta_conf_compte&action=lister&filtre=' . $account->getName());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,19 @@

namespace AppBundle\Controller\Admin\Accounting\Configuration;

use Afup\Site\Logger\DbLoggerTrait;
use AppBundle\Accounting\Form\CategoryType;
use AppBundle\Accounting\Model\Category;
use AppBundle\Accounting\Model\Repository\CategoryRepository;
use AppBundle\AuditLog\Audit;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

final class AddCategoryAction extends AbstractController
{
use DbLoggerTrait;

public function __construct(
private readonly CategoryRepository $categoryRepository,
private readonly Audit $audit,
) {}

public function __invoke(Request $request): Response
Expand All @@ -27,7 +26,7 @@ public function __invoke(Request $request): Response
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->categoryRepository->save($category);
$this->log('Ajout de la catégorie ' . $category->getName());
$this->audit->log('Ajout de la catégorie ' . $category->getName());
$this->addFlash('notice', 'La catégorie a été ajoutée');
return $this->redirectToRoute('admin_accounting_categories_list');
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,19 @@

namespace AppBundle\Controller\Admin\Accounting\Configuration;

use Afup\Site\Logger\DbLoggerTrait;
use AppBundle\Accounting\Form\EventType;
use AppBundle\Accounting\Model\Event;
use AppBundle\Accounting\Model\Repository\EventRepository;
use AppBundle\AuditLog\Audit;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

final class AddEventAction extends AbstractController
{
use DbLoggerTrait;

public function __construct(
private readonly EventRepository $eventRepository,
private readonly Audit $audit,
) {}

public function __invoke(Request $request): Response
Expand All @@ -27,7 +26,7 @@ public function __invoke(Request $request): Response
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->eventRepository->save($event);
$this->log('Ajout de l\'évènement ' . $event->getName());
$this->audit->log('Ajout de l\'évènement ' . $event->getName());
$this->addFlash('notice', 'L\'évènement a été ajouté');
return $this->redirectToRoute('admin_accounting_events_list');
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,19 @@

namespace AppBundle\Controller\Admin\Accounting\Configuration;

use Afup\Site\Logger\DbLoggerTrait;
use AppBundle\Accounting\Form\OperationType;
use AppBundle\Accounting\Model\Operation;
use AppBundle\Accounting\Model\Repository\OperationRepository;
use AppBundle\AuditLog\Audit;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

final class AddOperationAction extends AbstractController
{
use DbLoggerTrait;

public function __construct(
private readonly OperationRepository $operationRepository,
private readonly Audit $audit,
) {}

public function __invoke(Request $request): Response
Expand All @@ -27,7 +26,7 @@ public function __invoke(Request $request): Response
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->operationRepository->save($operation);
$this->log('Ajout de l\'opération ' . $operation->getName());
$this->audit->log('Ajout de l\'opération ' . $operation->getName());
$this->addFlash('notice', 'L\'opération a été ajoutée');
return $this->redirectToRoute('admin_accounting_operations_list');
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,19 @@

namespace AppBundle\Controller\Admin\Accounting\Configuration;

use Afup\Site\Logger\DbLoggerTrait;
use AppBundle\Accounting\Form\PaymentType;
use AppBundle\Accounting\Model\Payment;
use AppBundle\Accounting\Model\Repository\PaymentRepository;
use AppBundle\AuditLog\Audit;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

final class AddPaymentAction extends AbstractController
{
use DbLoggerTrait;

public function __construct(
private readonly PaymentRepository $paymentRepository,
private readonly Audit $audit,
) {}

public function __invoke(Request $request): Response
Expand All @@ -27,7 +26,7 @@ public function __invoke(Request $request): Response
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->paymentRepository->save($payment);
$this->log('Ajout du type de règlement ' . $payment->getName());
$this->audit->log('Ajout du type de règlement ' . $payment->getName());
$this->addFlash('notice', 'Le type de règlement a été ajouté');
return $this->redirectToRoute('admin_accounting_payments_list');
}
Expand Down
Loading