feat(dump): expose dumps through a settings-page admin API

This commit is contained in:
2026-09-14 22:00:26 +02:00
parent b66bc550cd
commit 1d8d2de118
2 changed files with 97 additions and 0 deletions
+90
View File
@@ -0,0 +1,90 @@
<?php declare(strict_types=1);
namespace AeonDumpManager\Controller;
use AeonDumpManager\MessageQueue\Message\CreateDumpMessage;
use AeonDumpManager\Service\DumpJobStatusService;
use AeonDumpManager\Service\DumpLister;
use AeonDumpManager\Service\DumpService;
use Shopware\Core\Framework\Api\Route\ApiRouteScope;
use Shopware\Core\PlatformRequest;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Messenger\MessageBusInterface;
use Symfony\Component\Routing\Annotation\Route;
/**
* Client-side acl.can() in the admin UI only hides buttons — real
* enforcement is the PlatformRequest::ATTRIBUTE_ACL route default below,
* checked server-side by AclAnnotationValidator against Context::isAllowed().
*/
#[Route(defaults: [PlatformRequest::ATTRIBUTE_ROUTE_SCOPE => [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);
}
}