use crate::application::use_cases::{
AppendForkEventUseCase,
BranchForkUseCase,
CheckAccessUseCase,
CleanupExpiredForksUseCase,
CleanupExpiredTokensUseCase,
ConfirmTransactionUseCase,
CreateArticleUseCase,
CreateForkUseCase,
DiscardForkUseCase,
GetForkUseCase,
GrantFreeAccessUseCase,
InitiatePaymentUseCase,
MergeForkUseCase,
QueryForkEventsUseCase,
RefundTransactionUseCase,
RegisterCreatorUseCase,
RevokeAccessUseCase,
UpdateArticleUseCase,
UpdateCreatorUseCase,
UpdateForkUseCase,
ValidateTokenUseCase,
};
use crate::{
application::services::consumer::ConsumerRegistry,
domain::repositories::{
AccessTokenRepository, ArticleRepository, AuditEventRepository, CreatorRepository,
EventStreamRepository, ForkRepository, TenantRepository, TransactionRepository,
},
infrastructure::{
persistence::SystemMetadataStore, repositories::EventSourcedConfigRepository,
},
};
use std::sync::Arc;
#[derive(Clone)]
pub struct ServiceContainer {
creator_repository: Arc<dyn CreatorRepository>,
article_repository: Arc<dyn ArticleRepository>,
transaction_repository: Arc<dyn TransactionRepository>,
access_token_repository: Arc<dyn AccessTokenRepository>,
fork_repository: Arc<dyn ForkRepository>,
event_stream_repository: Arc<dyn EventStreamRepository>,
pub(super) tenant_repository: Option<Arc<dyn TenantRepository>>,
pub(super) audit_repository: Option<Arc<dyn AuditEventRepository>>,
pub(super) config_repository: Option<Arc<EventSourcedConfigRepository>>,
pub(super) system_store: Option<Arc<SystemMetadataStore>>,
pub(super) consumer_registry: Option<Arc<ConsumerRegistry>>,
}
impl ServiceContainer {
pub fn new(
creator_repository: Arc<dyn CreatorRepository>,
article_repository: Arc<dyn ArticleRepository>,
transaction_repository: Arc<dyn TransactionRepository>,
access_token_repository: Arc<dyn AccessTokenRepository>,
fork_repository: Arc<dyn ForkRepository>,
event_stream_repository: Arc<dyn EventStreamRepository>,
) -> Self {
Self {
creator_repository,
article_repository,
transaction_repository,
access_token_repository,
fork_repository,
event_stream_repository,
tenant_repository: None,
audit_repository: None,
config_repository: None,
system_store: None,
consumer_registry: None,
}
}
pub fn creator_repository(&self) -> Arc<dyn CreatorRepository> {
self.creator_repository.clone()
}
pub fn article_repository(&self) -> Arc<dyn ArticleRepository> {
self.article_repository.clone()
}
pub fn transaction_repository(&self) -> Arc<dyn TransactionRepository> {
self.transaction_repository.clone()
}
pub fn access_token_repository(&self) -> Arc<dyn AccessTokenRepository> {
self.access_token_repository.clone()
}
pub fn fork_repository(&self) -> Arc<dyn ForkRepository> {
self.fork_repository.clone()
}
pub fn event_stream_repository(&self) -> Arc<dyn EventStreamRepository> {
self.event_stream_repository.clone()
}
pub fn tenant_repository(&self) -> Option<Arc<dyn TenantRepository>> {
self.tenant_repository.clone()
}
pub fn audit_repository(&self) -> Option<Arc<dyn AuditEventRepository>> {
self.audit_repository.clone()
}
pub fn config_repository(&self) -> Option<Arc<EventSourcedConfigRepository>> {
self.config_repository.clone()
}
pub fn system_store(&self) -> Option<Arc<SystemMetadataStore>> {
self.system_store.clone()
}
pub fn consumer_registry(&self) -> Option<Arc<ConsumerRegistry>> {
self.consumer_registry.clone()
}
pub fn has_system_repositories(&self) -> bool {
self.system_store.is_some()
}
pub fn register_creator_use_case(&self) -> RegisterCreatorUseCase {
RegisterCreatorUseCase::new(self.creator_repository.clone())
}
pub fn update_creator_use_case(&self) -> UpdateCreatorUseCase {
UpdateCreatorUseCase::new(self.creator_repository.clone())
}
pub fn create_article_use_case(&self) -> CreateArticleUseCase {
CreateArticleUseCase::new(self.article_repository.clone())
}
pub fn update_article_use_case(&self) -> UpdateArticleUseCase {
UpdateArticleUseCase::new(self.article_repository.clone())
}
pub fn initiate_payment_use_case(&self) -> InitiatePaymentUseCase {
InitiatePaymentUseCase::new(
self.transaction_repository.clone(),
self.article_repository.clone(),
self.creator_repository.clone(),
)
}
pub fn confirm_transaction_use_case(&self) -> ConfirmTransactionUseCase {
ConfirmTransactionUseCase::new(
self.transaction_repository.clone(),
self.access_token_repository.clone(),
self.article_repository.clone(),
self.creator_repository.clone(),
)
}
pub fn refund_transaction_use_case(&self) -> RefundTransactionUseCase {
RefundTransactionUseCase::new(
self.transaction_repository.clone(),
self.access_token_repository.clone(),
)
}
pub fn grant_free_access_use_case(&self) -> GrantFreeAccessUseCase {
GrantFreeAccessUseCase::new(
self.access_token_repository.clone(),
self.article_repository.clone(),
)
}
pub fn validate_token_use_case(&self) -> ValidateTokenUseCase {
ValidateTokenUseCase::new(self.access_token_repository.clone())
}
pub fn revoke_access_use_case(&self) -> RevokeAccessUseCase {
RevokeAccessUseCase::new(self.access_token_repository.clone())
}
pub fn check_access_use_case(&self) -> CheckAccessUseCase {
CheckAccessUseCase::new(self.access_token_repository.clone())
}
pub fn cleanup_expired_tokens_use_case(&self) -> CleanupExpiredTokensUseCase {
CleanupExpiredTokensUseCase::new(self.access_token_repository.clone())
}
pub fn create_fork_use_case(&self) -> CreateForkUseCase {
CreateForkUseCase::new(self.fork_repository.clone())
}
pub fn update_fork_use_case(&self) -> UpdateForkUseCase {
UpdateForkUseCase::new(self.fork_repository.clone())
}
pub fn merge_fork_use_case(&self) -> MergeForkUseCase {
MergeForkUseCase::new(self.fork_repository.clone())
}
pub fn discard_fork_use_case(&self) -> DiscardForkUseCase {
DiscardForkUseCase::new(self.fork_repository.clone())
}
pub fn get_fork_use_case(&self) -> GetForkUseCase {
GetForkUseCase::new(self.fork_repository.clone())
}
pub fn append_fork_event_use_case(&self) -> AppendForkEventUseCase {
AppendForkEventUseCase::new(self.fork_repository.clone())
}
pub fn query_fork_events_use_case(&self) -> QueryForkEventsUseCase {
QueryForkEventsUseCase::new(self.fork_repository.clone())
}
pub fn branch_fork_use_case(&self) -> BranchForkUseCase {
BranchForkUseCase::new(self.fork_repository.clone())
}
pub fn cleanup_expired_forks_use_case(&self) -> CleanupExpiredForksUseCase {
CleanupExpiredForksUseCase::new(self.fork_repository.clone())
}
}
impl std::fmt::Debug for ServiceContainer {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("ServiceContainer")
.field("creator_repository", &"Arc<dyn CreatorRepository>")
.field("article_repository", &"Arc<dyn ArticleRepository>")
.field("transaction_repository", &"Arc<dyn TransactionRepository>")
.field("access_token_repository", &"Arc<dyn AccessTokenRepository>")
.field("fork_repository", &"Arc<dyn ForkRepository>")
.field("event_stream_repository", &"Arc<dyn EventStreamRepository>")
.field(
"system_repositories",
&if self.has_system_repositories() {
"event-sourced"
} else {
"not configured"
},
)
.finish()
}
}