use std::sync::Arc; use adapters_postgres::{ PgPool, PostgresIngestSessionRepository, PostgresLibraryPathRepository, PostgresQuotaRepository, PostgresStorageVolumeRepository, PostgresUsageLedgerRepository, }; use application::storage::{CheckQuotaHandler, RegisterLibraryPathHandler, RegisterVolumeHandler}; use presentation::state::StorageHandlers; /// Shared storage repos needed by other bounded contexts (catalog ingest, etc.). pub struct StorageRepos { pub volume_repo: Arc, pub path_repo: Arc, pub session_repo: Arc, pub quota_repo: Arc, pub ledger_repo: Arc, } pub fn build(pool: &PgPool) -> (StorageRepos, StorageHandlers) { let volume_repo = Arc::new(PostgresStorageVolumeRepository::new(pool.clone())); let path_repo = Arc::new(PostgresLibraryPathRepository::new(pool.clone())); let session_repo = Arc::new(PostgresIngestSessionRepository::new(pool.clone())); let quota_repo = Arc::new(PostgresQuotaRepository::new(pool.clone())); let ledger_repo = Arc::new(PostgresUsageLedgerRepository::new(pool.clone())); let register_volume = Arc::new(RegisterVolumeHandler::new(volume_repo.clone())); let register_library_path = Arc::new(RegisterLibraryPathHandler::new(volume_repo.clone(), path_repo.clone())); let check_quota = Arc::new(CheckQuotaHandler::new(quota_repo.clone(), ledger_repo.clone())); let handlers = StorageHandlers { register_volume, register_library_path, check_quota, }; let repos = StorageRepos { volume_repo, path_repo, session_repo, quota_repo, ledger_repo, }; (repos, handlers) }