feat: serve derivative files via GET /assets/{id}/derivatives/{profile}

- ReadDerivativeHandler queries DerivativeRepository + FileStoragePort
- Profile URL param: thumbnail, thumbnail_large, web_optimized, video_sd
- Immutable cache headers (derivatives don't change once generated)
- Wired into bootstrap catalog service builder
This commit is contained in:
2026-05-31 21:10:58 +02:00
parent f85c0cb246
commit ef64e86439
7 changed files with 127 additions and 9 deletions

View File

@@ -1,13 +1,13 @@
use std::sync::Arc;
use adapters_postgres::{
PgPool, PostgresAssetMetadataRepository, PostgresAssetRepository, PostgresDuplicateRepository,
PostgresIngestTransaction,
PgPool, PostgresAssetMetadataRepository, PostgresAssetRepository, PostgresDerivativeRepository,
PostgresDuplicateRepository, PostgresIngestTransaction,
};
use adapters_storage::LocalFileStorage;
use application::catalog::{
GetAssetHandler, GetTimelineHandler, ReadAssetFileHandler, RegisterAssetHandler,
UpdateMetadataHandler,
GetAssetHandler, GetTimelineHandler, ReadAssetFileHandler, ReadDerivativeHandler,
RegisterAssetHandler, UpdateMetadataHandler,
};
use application::storage::IngestAssetHandler;
use domain::ports::EventPublisher;
@@ -23,6 +23,7 @@ pub fn build(
) -> CatalogHandlers {
let asset_repo = Arc::new(PostgresAssetRepository::new(pool.clone()));
let metadata_repo = Arc::new(PostgresAssetMetadataRepository::new(pool.clone()));
let derivative_repo = Arc::new(PostgresDerivativeRepository::new(pool.clone()));
let duplicate_repo = Arc::new(PostgresDuplicateRepository::new(pool.clone()));
let ingest_tx = Arc::new(PostgresIngestTransaction::new(pool.clone()));
@@ -49,7 +50,12 @@ pub fn build(
event_publisher.clone(),
));
let read_asset_file = Arc::new(ReadAssetFileHandler::new(asset_repo.clone(), file_storage));
let read_asset_file = Arc::new(ReadAssetFileHandler::new(
asset_repo.clone(),
file_storage.clone(),
));
let read_derivative = Arc::new(ReadDerivativeHandler::new(derivative_repo, file_storage));
let register_asset = Arc::new(RegisterAssetHandler::new(
asset_repo,
@@ -63,6 +69,7 @@ pub fn build(
get_timeline,
update_metadata,
read_asset_file,
read_derivative,
register_asset,
}
}