From 1d8d2de118af3497265ef49d1fdff2401af347fa Mon Sep 17 00:00:00 2001 From: Haylan Date: Mon, 14 Sep 2026 22:00:26 +0200 Subject: [PATCH] feat(dump): expose dumps through a settings-page admin API --- src/Controller/DumpController.php | 90 +++++++++++++++++++++++++++++++ src/Resources/config/routes.php | 7 +++ 2 files changed, 97 insertions(+) create mode 100644 src/Controller/DumpController.php create mode 100644 src/Resources/config/routes.php diff --git a/src/Controller/DumpController.php b/src/Controller/DumpController.php new file mode 100644 index 0000000..e115b0f --- /dev/null +++ b/src/Controller/DumpController.php @@ -0,0 +1,90 @@ + [ApiRouteScope::ID]])] +class DumpController +{ + public function __construct( + private readonly DumpLister $dumpLister, + private readonly DumpService $dumpService, + private readonly DumpJobStatusService $jobStatus, + private readonly MessageBusInterface $bus, + ) { + } + + #[Route( + path: '/api/_action/aeon-dump-manager/dumps', + name: 'api.action.aeon_dump_manager.dumps.list', + defaults: [PlatformRequest::ATTRIBUTE_ACL => ['aeon_dump_manager.viewer']], + methods: ['GET'] + )] + public function list(): JsonResponse + { + $dumps = array_map( + static fn ($dumpFile) => $dumpFile->jsonSerialize(), + $this->dumpLister->list() + ); + + return new JsonResponse(['dumps' => $dumps]); + } + + #[Route( + path: '/api/_action/aeon-dump-manager/dumps', + name: 'api.action.aeon_dump_manager.dumps.create', + defaults: [PlatformRequest::ATTRIBUTE_ACL => ['aeon_dump_manager.creator']], + methods: ['POST'] + )] + public function create(): JsonResponse + { + $jobId = $this->jobStatus->createPending(); + $this->bus->dispatch(new CreateDumpMessage($jobId)); + + return new JsonResponse(['jobId' => $jobId], Response::HTTP_ACCEPTED); + } + + #[Route( + path: '/api/_action/aeon-dump-manager/dumps/{filename}', + name: 'api.action.aeon_dump_manager.dumps.delete', + defaults: [PlatformRequest::ATTRIBUTE_ACL => ['aeon_dump_manager.deleter']], + methods: ['DELETE'] + )] + public function delete(string $filename): JsonResponse + { + $this->dumpService->delete($filename); + + return new JsonResponse(null, Response::HTTP_NO_CONTENT); + } + + #[Route( + path: '/api/_action/aeon-dump-manager/dumps/jobs/{jobId}', + name: 'api.action.aeon_dump_manager.dumps.jobs.status', + defaults: [PlatformRequest::ATTRIBUTE_ACL => ['aeon_dump_manager.viewer']], + methods: ['GET'] + )] + public function jobStatus(string $jobId): JsonResponse + { + $job = $this->jobStatus->find($jobId); + if ($job === null) { + return new JsonResponse(['message' => 'Job not found'], Response::HTTP_NOT_FOUND); + } + + return new JsonResponse($job); + } +} diff --git a/src/Resources/config/routes.php b/src/Resources/config/routes.php new file mode 100644 index 0000000..19ba0fe --- /dev/null +++ b/src/Resources/config/routes.php @@ -0,0 +1,7 @@ +import(__DIR__ . '/../../Controller/*Controller.php', 'attribute'); +};