feat(dump): expose dumps through a settings-page admin API
This commit is contained in:
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
<?php declare(strict_types=1);
|
||||||
|
|
||||||
|
use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
|
||||||
|
|
||||||
|
return function (RoutingConfigurator $routes): void {
|
||||||
|
$routes->import(__DIR__ . '/../../Controller/*Controller.php', 'attribute');
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user