feat: implement preview mechanism

Signed-off-by: Sebastian Krupinski <krupinski01@gmail.com>
This commit is contained in:
2026-08-29 12:29:15 -04:00
parent f80e3679b6
commit 33a06c6509
3 changed files with 105 additions and 15 deletions
+35 -15
View File
@@ -50,11 +50,7 @@ class TransferController extends ControllerAbstract
*
* GET /download/entity/{provider}/{service}/{collection}/{identifier}
*/
#[AuthenticatedRoute(
'/download/entity/{provider}/{service}/{collection}/{identifier}',
name: 'document_manager.download.entity',
methods: ['GET']
)]
#[AuthenticatedRoute('/download/entity/{provider}/{service}/{collection}/{identifier}', name: 'document_manager.download.entity', methods: ['GET'])]
public function downloadEntity(string $provider, string $service, string $collection, string $identifier): Response {
$tenantId = $this->tenantContext->identifier();
$userId = $this->identityContext->identifier();
@@ -124,16 +120,44 @@ class TransferController extends ControllerAbstract
}
}
#[AuthenticatedRoute('/preview/entity/{provider}/{service}/{collection}/{identifier}', name: 'document_manager.preview.entity', methods: ['GET'])]
public function previewEntity(string $provider, string $service, string $collection, string $identifier, string $variant = 'popover'): Response {
try {
$preview = $this->manager->entityPreview(
$this->tenantContext->identifier(),
$this->identityContext->identifier(),
new EntityIdentifier($provider, $service, $collection, $identifier),
$variant,
);
if ($preview === null) {
return new JsonResponse([
'status' => 'error',
'error' => ['code' => 404, 'message' => 'Preview unavailable'],
], Response::HTTP_NOT_FOUND);
}
$response = new StreamedResponse($preview->result->resource->stream());
$response->headers->set('Content-Type', $preview->result->resource->mimeType());
$response->headers->set('Content-Length', (string) $preview->blob->size);
$response->headers->set('ETag', '"' . trim($preview->blob->etag, '"') . '"');
$response->headers->set('Cache-Control', 'private, max-age=3600');
$response->headers->set('X-Content-Type-Options', 'nosniff');
return $response;
} catch (Throwable $throwable) {
$this->logger->error('Document preview failed', ['exception' => $throwable]);
return new JsonResponse([
'status' => 'error',
'error' => ['code' => 500, 'message' => 'Preview unavailable'],
], Response::HTTP_INTERNAL_SERVER_ERROR);
}
}
/**
* Download multiple files as a ZIP archive
*
* GET /download/archive?provider=...&service=...&ids[]=...&ids[]=...
*/
#[AuthenticatedRoute(
'/download/archive',
name: 'manager.download.archive',
methods: ['GET']
)]
#[AuthenticatedRoute('/download/archive', name: 'manager.download.archive', methods: ['GET'])]
public function downloadArchive(string $provider, string $service, array $ids = [], ?string $collection = null, string $name = 'download'): Response {
$tenantId = $this->tenantContext->identifier();
$userId = $this->identityContext->identifier();
@@ -215,11 +239,7 @@ class TransferController extends ControllerAbstract
*
* GET /download/collection/{provider}/{service}/{identifier}
*/
#[AuthenticatedRoute(
'/download/collection/{provider}/{service}/{identifier}',
name: 'manager.download.collection',
methods: ['GET']
)]
#[AuthenticatedRoute('/download/collection/{provider}/{service}/{identifier}', name: 'manager.download.collection', methods: ['GET'])]
public function downloadCollection(string $provider, string $service, string $identifier): Response {
$tenantId = $this->tenantContext->identifier();
$userId = $this->identityContext->identifier();