refactor: clean up presentation layer — AppState grouping, multipart extractor, thin handlers

This commit is contained in:
2026-05-31 06:14:19 +02:00
parent 34b231a8f6
commit 2d9dd2c2d0
14 changed files with 199 additions and 258 deletions

View File

@@ -16,15 +16,18 @@ use adapters_postgres::{
connect, run_migrations,
};
use adapters_storage::{LocalFileStorage, ObjectStorageAdapter, StorageConfig, build_store};
use adapters_storage::LocalFileStorage;
use application::{
catalog::{GetAssetHandler, GetTimelineHandler, UpdateMetadataHandler},
catalog::{GetAssetHandler, GetTimelineHandler, ReadAssetFileHandler, UpdateMetadataHandler},
identity::{GetProfileHandler, LoginUserHandler, RegisterUserHandler},
organization::{CreateAlbumHandler, GetAlbumHandler, ManageAlbumEntriesHandler},
storage::{IngestAssetHandler, RegisterLibraryPathHandler, RegisterVolumeHandler},
};
use presentation::{routes::app_router, state::AppState};
use presentation::{
routes::app_router,
state::{AppState, CatalogHandlers, IdentityHandlers, OrganizationHandlers, StorageHandlers},
};
use crate::config::Config;
use crate::log_event_publisher::LogEventPublisher;
@@ -46,11 +49,6 @@ pub async fn build_app(config: &Config) -> Result<Router> {
));
let get_profile_handler = Arc::new(GetProfileHandler::new(user_repo));
// Object storage
let storage_cfg = StorageConfig::from_env()?;
let store = build_store(&storage_cfg)?;
let storage = Arc::new(ObjectStorageAdapter::new(store, &storage_cfg.prefix)?);
// Repos
let album_repo = Arc::new(PostgresAlbumRepository::new(pool.clone()));
let asset_repo = Arc::new(PostgresAssetRepository::new(pool.clone()));
@@ -62,7 +60,7 @@ pub async fn build_app(config: &Config) -> Result<Router> {
let ledger_repo = Arc::new(PostgresUsageLedgerRepository::new(pool.clone()));
let event_publisher: Arc<LogEventPublisher> = Arc::new(LogEventPublisher);
// File storage for ingest
// File storage
let storage_path = std::env::var("STORAGE_PATH").unwrap_or_else(|_| "./data/media".to_string());
let file_storage: Arc<LocalFileStorage> = Arc::new(LocalFileStorage::new(&storage_path));
@@ -94,30 +92,45 @@ pub async fn build_app(config: &Config) -> Result<Router> {
metadata_repo,
event_publisher,
));
let read_asset_file_handler = Arc::new(ReadAssetFileHandler::new(asset_repo, file_storage));
// Storage handlers
let register_volume_handler = Arc::new(RegisterVolumeHandler::new(volume_repo.clone()));
let register_library_path_handler =
Arc::new(RegisterLibraryPathHandler::new(volume_repo, path_repo));
let state = AppState::new(
register_handler,
login_handler,
get_profile_handler,
issuer,
storage,
create_album_handler,
get_album_handler,
manage_album_entries_handler,
ingest_asset_handler,
get_asset_handler,
get_timeline_handler,
update_metadata_handler,
register_volume_handler,
register_library_path_handler,
file_storage,
asset_repo,
);
let identity = IdentityHandlers {
register: register_handler,
login: login_handler,
get_profile: get_profile_handler,
};
let catalog = CatalogHandlers {
ingest_asset: ingest_asset_handler,
get_asset: get_asset_handler,
get_timeline: get_timeline_handler,
update_metadata: update_metadata_handler,
read_asset_file: read_asset_file_handler,
};
let organization = OrganizationHandlers {
create_album: create_album_handler,
get_album: get_album_handler,
manage_album_entries: manage_album_entries_handler,
};
let storage_handlers = StorageHandlers {
register_volume: register_volume_handler,
register_library_path: register_library_path_handler,
};
let state = AppState {
identity,
catalog,
organization,
storage: storage_handlers,
token_issuer: issuer,
};
let cors = CorsLayer::new()
.allow_origin(