- New GET /api/activity-logs endpoint with pagination and filters
(entityType, action) for the global activity log page
- Add findAllPaginated() to AuditLogRepository
- normalizeCollection() now stores {id, name} objects instead of
bare IDs so constructeur changes display readable names
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
77 lines
2.1 KiB
PHP
77 lines
2.1 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Repository;
|
|
|
|
use App\Entity\AuditLog;
|
|
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
|
|
use Doctrine\Persistence\ManagerRegistry;
|
|
|
|
/**
|
|
* @extends ServiceEntityRepository<AuditLog>
|
|
*/
|
|
final class AuditLogRepository extends ServiceEntityRepository
|
|
{
|
|
public function __construct(ManagerRegistry $registry)
|
|
{
|
|
parent::__construct($registry, AuditLog::class);
|
|
}
|
|
|
|
/**
|
|
* @return list<AuditLog>
|
|
*/
|
|
public function findEntityHistory(string $entityType, string $entityId, int $limit = 100): array
|
|
{
|
|
return $this->createQueryBuilder('a')
|
|
->andWhere('a.entityType = :entityType')
|
|
->andWhere('a.entityId = :entityId')
|
|
->setParameter('entityType', $entityType)
|
|
->setParameter('entityId', $entityId)
|
|
->orderBy('a.createdAt', 'DESC')
|
|
->setMaxResults($limit)
|
|
->getQuery()
|
|
->getResult()
|
|
;
|
|
}
|
|
|
|
/**
|
|
* @param array{entityType?: string, action?: string} $filters
|
|
*
|
|
* @return array{items: list<AuditLog>, total: int}
|
|
*/
|
|
public function findAllPaginated(int $page = 1, int $itemsPerPage = 30, array $filters = []): array
|
|
{
|
|
$qb = $this->createQueryBuilder('a')
|
|
->orderBy('a.createdAt', 'DESC')
|
|
;
|
|
|
|
if (!empty($filters['entityType'])) {
|
|
$qb->andWhere('a.entityType = :entityType')
|
|
->setParameter('entityType', $filters['entityType'])
|
|
;
|
|
}
|
|
|
|
if (!empty($filters['action'])) {
|
|
$qb->andWhere('a.action = :action')
|
|
->setParameter('action', $filters['action'])
|
|
;
|
|
}
|
|
|
|
$countQb = clone $qb;
|
|
$countQb->select('COUNT(a.id)')
|
|
->resetDQLPart('orderBy')
|
|
;
|
|
$total = (int) $countQb->getQuery()->getSingleScalarResult();
|
|
|
|
$qb->setFirstResult(($page - 1) * $itemsPerPage)
|
|
->setMaxResults($itemsPerPage)
|
|
;
|
|
|
|
return [
|
|
'items' => $qb->getQuery()->getResult(),
|
|
'total' => $total,
|
|
];
|
|
}
|
|
}
|