refactor: split bootstrap factory into per-context service builders
This commit is contained in:
70
crates/bootstrap/src/services/catalog.rs
Normal file
70
crates/bootstrap/src/services/catalog.rs
Normal file
@@ -0,0 +1,70 @@
|
||||
use std::sync::Arc;
|
||||
|
||||
use adapters_postgres::{
|
||||
PgPool, PostgresAssetMetadataRepository, PostgresAssetRepository,
|
||||
PostgresDuplicateRepository,
|
||||
};
|
||||
use adapters_storage::LocalFileStorage;
|
||||
use application::catalog::{
|
||||
GetAssetHandler, GetTimelineHandler, ReadAssetFileHandler, RegisterAssetHandler,
|
||||
UpdateMetadataHandler,
|
||||
};
|
||||
use application::storage::IngestAssetHandler;
|
||||
use domain::ports::EventPublisher;
|
||||
use presentation::state::CatalogHandlers;
|
||||
|
||||
use super::storage::StorageRepos;
|
||||
|
||||
pub fn build(
|
||||
pool: &PgPool,
|
||||
storage_repos: &StorageRepos,
|
||||
file_storage: Arc<LocalFileStorage>,
|
||||
event_publisher: Arc<dyn EventPublisher>,
|
||||
) -> CatalogHandlers {
|
||||
let asset_repo = Arc::new(PostgresAssetRepository::new(pool.clone()));
|
||||
let metadata_repo = Arc::new(PostgresAssetMetadataRepository::new(pool.clone()));
|
||||
let duplicate_repo = Arc::new(PostgresDuplicateRepository::new(pool.clone()));
|
||||
|
||||
let ingest_asset = Arc::new(IngestAssetHandler::new(
|
||||
storage_repos.session_repo.clone(),
|
||||
storage_repos.path_repo.clone(),
|
||||
storage_repos.quota_repo.clone(),
|
||||
storage_repos.ledger_repo.clone(),
|
||||
asset_repo.clone(),
|
||||
file_storage.clone(),
|
||||
event_publisher.clone(),
|
||||
));
|
||||
|
||||
let get_asset = Arc::new(GetAssetHandler::new(
|
||||
asset_repo.clone(),
|
||||
metadata_repo.clone(),
|
||||
));
|
||||
|
||||
let get_timeline = Arc::new(GetTimelineHandler::new(
|
||||
asset_repo.clone(),
|
||||
metadata_repo.clone(),
|
||||
));
|
||||
|
||||
let update_metadata = Arc::new(UpdateMetadataHandler::new(
|
||||
asset_repo.clone(),
|
||||
metadata_repo.clone(),
|
||||
event_publisher.clone(),
|
||||
));
|
||||
|
||||
let read_asset_file = Arc::new(ReadAssetFileHandler::new(asset_repo.clone(), file_storage));
|
||||
|
||||
let register_asset = Arc::new(RegisterAssetHandler::new(
|
||||
asset_repo,
|
||||
duplicate_repo,
|
||||
event_publisher,
|
||||
));
|
||||
|
||||
CatalogHandlers {
|
||||
ingest_asset,
|
||||
get_asset,
|
||||
get_timeline,
|
||||
update_metadata,
|
||||
read_asset_file,
|
||||
register_asset,
|
||||
}
|
||||
}
|
||||
35
crates/bootstrap/src/services/identity.rs
Normal file
35
crates/bootstrap/src/services/identity.rs
Normal file
@@ -0,0 +1,35 @@
|
||||
use std::sync::Arc;
|
||||
|
||||
use adapters_auth::{BcryptPasswordHasher, JwtTokenIssuer};
|
||||
use adapters_postgres::{PgPool, PostgresUserRepository};
|
||||
use application::identity::{GetProfileHandler, LoginUserHandler, RegisterUserHandler};
|
||||
use domain::ports::TokenIssuer;
|
||||
use presentation::state::IdentityHandlers;
|
||||
|
||||
pub struct IdentityServices {
|
||||
pub handlers: IdentityHandlers,
|
||||
pub token_issuer: Arc<dyn TokenIssuer>,
|
||||
}
|
||||
|
||||
pub fn build(pool: &PgPool, jwt_secret: &str) -> IdentityServices {
|
||||
let user_repo = Arc::new(PostgresUserRepository::new(pool.clone()));
|
||||
let hasher = Arc::new(BcryptPasswordHasher);
|
||||
let issuer: Arc<JwtTokenIssuer> = Arc::new(JwtTokenIssuer::new(jwt_secret));
|
||||
|
||||
let register = Arc::new(RegisterUserHandler::new(user_repo.clone(), hasher.clone()));
|
||||
let login = Arc::new(LoginUserHandler::new(
|
||||
user_repo.clone(),
|
||||
hasher,
|
||||
issuer.clone(),
|
||||
));
|
||||
let get_profile = Arc::new(GetProfileHandler::new(user_repo));
|
||||
|
||||
IdentityServices {
|
||||
handlers: IdentityHandlers {
|
||||
register,
|
||||
login,
|
||||
get_profile,
|
||||
},
|
||||
token_issuer: issuer,
|
||||
}
|
||||
}
|
||||
7
crates/bootstrap/src/services/mod.rs
Normal file
7
crates/bootstrap/src/services/mod.rs
Normal file
@@ -0,0 +1,7 @@
|
||||
pub mod catalog;
|
||||
pub mod identity;
|
||||
pub mod organization;
|
||||
pub mod processing;
|
||||
pub mod sharing;
|
||||
pub mod sidecar;
|
||||
pub mod storage;
|
||||
27
crates/bootstrap/src/services/organization.rs
Normal file
27
crates/bootstrap/src/services/organization.rs
Normal file
@@ -0,0 +1,27 @@
|
||||
use std::sync::Arc;
|
||||
|
||||
use adapters_postgres::{
|
||||
PgPool, PostgresAlbumRepository, PostgresAssetRepository, PostgresTagRepository,
|
||||
};
|
||||
use application::organization::{
|
||||
CreateAlbumHandler, GetAlbumHandler, ManageAlbumEntriesHandler, TagAssetHandler,
|
||||
};
|
||||
use presentation::state::OrganizationHandlers;
|
||||
|
||||
pub fn build(pool: &PgPool) -> OrganizationHandlers {
|
||||
let album_repo = Arc::new(PostgresAlbumRepository::new(pool.clone()));
|
||||
let asset_repo = Arc::new(PostgresAssetRepository::new(pool.clone()));
|
||||
let tag_repo = Arc::new(PostgresTagRepository::new(pool.clone()));
|
||||
|
||||
let create_album = Arc::new(CreateAlbumHandler::new(album_repo.clone()));
|
||||
let get_album = Arc::new(GetAlbumHandler::new(album_repo.clone()));
|
||||
let manage_album_entries = Arc::new(ManageAlbumEntriesHandler::new(album_repo));
|
||||
let tag_asset = Arc::new(TagAssetHandler::new(asset_repo, tag_repo));
|
||||
|
||||
OrganizationHandlers {
|
||||
create_album,
|
||||
get_album,
|
||||
manage_album_entries,
|
||||
tag_asset,
|
||||
}
|
||||
}
|
||||
48
crates/bootstrap/src/services/processing.rs
Normal file
48
crates/bootstrap/src/services/processing.rs
Normal file
@@ -0,0 +1,48 @@
|
||||
use std::sync::Arc;
|
||||
|
||||
use adapters_postgres::{
|
||||
PgPool, PostgresJobBatchRepository, PostgresJobRepository, PostgresPipelineRepository,
|
||||
PostgresPluginRepository,
|
||||
};
|
||||
use application::processing::{
|
||||
CompleteJobHandler, ConfigurePipelineHandler, EnqueueJobHandler, FailJobHandler,
|
||||
ManagePluginHandler, ReportBatchProgressHandler, StartJobHandler,
|
||||
};
|
||||
use domain::ports::EventPublisher;
|
||||
use presentation::state::ProcessingHandlers;
|
||||
|
||||
pub fn build(pool: &PgPool, event_publisher: Arc<dyn EventPublisher>) -> ProcessingHandlers {
|
||||
let job_repo = Arc::new(PostgresJobRepository::new(pool.clone()));
|
||||
let batch_repo = Arc::new(PostgresJobBatchRepository::new(pool.clone()));
|
||||
let plugin_repo = Arc::new(PostgresPluginRepository::new(pool.clone()));
|
||||
let pipeline_repo = Arc::new(PostgresPipelineRepository::new(pool.clone()));
|
||||
|
||||
let enqueue_job = Arc::new(EnqueueJobHandler::new(
|
||||
job_repo.clone(),
|
||||
event_publisher.clone(),
|
||||
));
|
||||
let start_job = Arc::new(StartJobHandler::new(job_repo.clone()));
|
||||
let complete_job = Arc::new(CompleteJobHandler::new(
|
||||
job_repo.clone(),
|
||||
batch_repo.clone(),
|
||||
event_publisher.clone(),
|
||||
));
|
||||
let fail_job = Arc::new(FailJobHandler::new(
|
||||
job_repo.clone(),
|
||||
batch_repo.clone(),
|
||||
event_publisher,
|
||||
));
|
||||
let batch_progress = Arc::new(ReportBatchProgressHandler::new(batch_repo, job_repo));
|
||||
let manage_plugin = Arc::new(ManagePluginHandler::new(plugin_repo.clone()));
|
||||
let configure_pipeline = Arc::new(ConfigurePipelineHandler::new(pipeline_repo, plugin_repo));
|
||||
|
||||
ProcessingHandlers {
|
||||
enqueue_job,
|
||||
start_job,
|
||||
complete_job,
|
||||
fail_job,
|
||||
batch_progress,
|
||||
manage_plugin,
|
||||
configure_pipeline,
|
||||
}
|
||||
}
|
||||
31
crates/bootstrap/src/services/sharing.rs
Normal file
31
crates/bootstrap/src/services/sharing.rs
Normal file
@@ -0,0 +1,31 @@
|
||||
use std::sync::Arc;
|
||||
|
||||
use adapters_postgres::{
|
||||
PgPool, PostgresShareRepository, PostgresVisibilityFilterRepository,
|
||||
};
|
||||
use application::sharing::{
|
||||
AccessSharedResourceHandler, GenerateShareLinkHandler, RevokeShareHandler,
|
||||
ShareResourceHandler,
|
||||
};
|
||||
use domain::ports::EventPublisher;
|
||||
use presentation::state::SharingHandlers;
|
||||
|
||||
pub fn build(pool: &PgPool, event_publisher: Arc<dyn EventPublisher>) -> SharingHandlers {
|
||||
let share_repo = Arc::new(PostgresShareRepository::new(pool.clone()));
|
||||
let _visibility_filter_repo = Arc::new(PostgresVisibilityFilterRepository::new(pool.clone()));
|
||||
|
||||
let share_resource = Arc::new(ShareResourceHandler::new(
|
||||
share_repo.clone(),
|
||||
event_publisher.clone(),
|
||||
));
|
||||
let generate_link = Arc::new(GenerateShareLinkHandler::new(share_repo.clone()));
|
||||
let revoke = Arc::new(RevokeShareHandler::new(share_repo.clone(), event_publisher));
|
||||
let access = Arc::new(AccessSharedResourceHandler::new(share_repo));
|
||||
|
||||
SharingHandlers {
|
||||
share_resource,
|
||||
generate_link,
|
||||
revoke,
|
||||
access,
|
||||
}
|
||||
}
|
||||
65
crates/bootstrap/src/services/sidecar.rs
Normal file
65
crates/bootstrap/src/services/sidecar.rs
Normal file
@@ -0,0 +1,65 @@
|
||||
use std::sync::Arc;
|
||||
|
||||
use adapters_postgres::{
|
||||
PgPool, PostgresAssetMetadataRepository, PostgresAssetRepository, PostgresSidecarRepository,
|
||||
};
|
||||
use application::sidecar::{
|
||||
DetectExternalChangesHandler, ExportSidecarHandler, FullExportHandler, FullImportHandler,
|
||||
ImportSidecarHandler, ResolveConflictHandler,
|
||||
};
|
||||
use presentation::state::SidecarHandlers;
|
||||
|
||||
use crate::log_sidecar_writer::LogSidecarWriter;
|
||||
|
||||
pub fn build(pool: &PgPool) -> SidecarHandlers {
|
||||
let metadata_repo = Arc::new(PostgresAssetMetadataRepository::new(pool.clone()));
|
||||
let asset_repo = Arc::new(PostgresAssetRepository::new(pool.clone()));
|
||||
let sidecar_repo = Arc::new(PostgresSidecarRepository::new(pool.clone()));
|
||||
let sidecar_writer: Arc<LogSidecarWriter> = Arc::new(LogSidecarWriter);
|
||||
|
||||
let export = Arc::new(ExportSidecarHandler::new(
|
||||
metadata_repo.clone(),
|
||||
sidecar_repo.clone(),
|
||||
sidecar_writer.clone(),
|
||||
));
|
||||
|
||||
let detect_changes = Arc::new(DetectExternalChangesHandler::new(
|
||||
sidecar_repo.clone(),
|
||||
sidecar_writer.clone(),
|
||||
));
|
||||
|
||||
let import = Arc::new(ImportSidecarHandler::new(
|
||||
sidecar_repo.clone(),
|
||||
sidecar_writer.clone(),
|
||||
metadata_repo.clone(),
|
||||
));
|
||||
|
||||
let resolve = Arc::new(ResolveConflictHandler::new(
|
||||
sidecar_repo.clone(),
|
||||
sidecar_writer.clone(),
|
||||
metadata_repo.clone(),
|
||||
));
|
||||
|
||||
let full_export = Arc::new(FullExportHandler::new(
|
||||
asset_repo.clone(),
|
||||
metadata_repo.clone(),
|
||||
sidecar_repo.clone(),
|
||||
sidecar_writer.clone(),
|
||||
));
|
||||
|
||||
let full_import = Arc::new(FullImportHandler::new(
|
||||
asset_repo,
|
||||
metadata_repo,
|
||||
sidecar_repo,
|
||||
sidecar_writer,
|
||||
));
|
||||
|
||||
SidecarHandlers {
|
||||
export,
|
||||
detect_changes,
|
||||
import,
|
||||
resolve,
|
||||
full_export,
|
||||
full_import,
|
||||
}
|
||||
}
|
||||
46
crates/bootstrap/src/services/storage.rs
Normal file
46
crates/bootstrap/src/services/storage.rs
Normal file
@@ -0,0 +1,46 @@
|
||||
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<PostgresStorageVolumeRepository>,
|
||||
pub path_repo: Arc<PostgresLibraryPathRepository>,
|
||||
pub session_repo: Arc<PostgresIngestSessionRepository>,
|
||||
pub quota_repo: Arc<PostgresQuotaRepository>,
|
||||
pub ledger_repo: Arc<PostgresUsageLedgerRepository>,
|
||||
}
|
||||
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user