feat : audit log (table + writer + listener + API + admin UI + timeline) #9

Merged
matthieu merged 38 commits from feat/audit-log into develop 2026-05-13 08:29:31 +00:00
2 changed files with 15 additions and 3 deletions
Showing only changes of commit d3e30e55b2 - Show all commits

1
.dockerignore Normal file
View File

@@ -0,0 +1 @@
src/Module/Core/Infrastructure/Console/SeedE2ECommand.php

View File

@@ -9,7 +9,7 @@ use App\Module\Core\Domain\Repository\PermissionRepositoryInterface;
use App\Module\Core\Domain\Repository\RoleRepositoryInterface;
use App\Module\Core\Domain\Repository\UserRepositoryInterface;
use App\Module\Core\Domain\Security\SystemRoles;
use App\Module\Sites\Domain\Repository\SiteRepositoryInterface;
use App\Shared\Domain\Contract\SiteProviderInterface;
use Doctrine\ORM\EntityManagerInterface;
use RuntimeException;
use Symfony\Component\Console\Attribute\AsCommand;
@@ -50,7 +50,7 @@ final class SeedE2ECommand extends Command
private readonly UserRepositoryInterface $userRepository,
private readonly RoleRepositoryInterface $roleRepository,
private readonly PermissionRepositoryInterface $permissionRepository,
private readonly SiteRepositoryInterface $siteRepository,
private readonly SiteProviderInterface $siteProvider,
private readonly UserPasswordHasherInterface $passwordHasher,
) {
parent::__construct();
@@ -60,6 +60,17 @@ final class SeedE2ECommand extends Command
{
$io = new SymfonyStyle($input, $output);
// Garde-fou : cette commande cree un compte admin avec un mot de passe
// hardcode. Elle ne doit JAMAIS tourner hors dev/test, meme si le
// fichier se retrouve embarque dans une image prod par accident (le
// .dockerignore a la racine est la premiere ligne de defense).
$env = $_SERVER['APP_ENV'] ?? 'prod';
if (!in_array($env, ['dev', 'test'], true)) {
$io->error(sprintf('app:seed-e2e est refuse en environnement "%s". Autorise uniquement en dev/test.', $env));
return Command::FAILURE;
}
$userRole = $this->roleRepository->findByCode(SystemRoles::USER_CODE);
if (null === $userRole) {
@@ -71,7 +82,7 @@ final class SeedE2ECommand extends Command
return Command::FAILURE;
}
$defaultSite = $this->siteRepository->findByName(self::DEFAULT_SITE_NAME);
$defaultSite = $this->siteProvider->findByName(self::DEFAULT_SITE_NAME);
// Pas de fail fatal si le site manque : les tests sidebar/login
// n'en dependent pas. Les tests sites-scope-bypass (a venir) le feront.