#![recursion_limit = "1024"]
#![allow(unused_imports)]
pub mod domain;
pub mod infrastructure;
pub mod application;
pub mod presentation;
pub mod seeders;
pub mod exports;
pub use domain::entity::*;
pub use infrastructure::persistence::*;
pub use application::service::IssueService;
pub use application::service::ServiceLevelAgreementService;
pub use application::service::ServiceLevelPriorityService;
pub use application::service::WarrantyClaimService;
use std::sync::Arc;
use axum::Router;
use sqlx::PgPool;
pub struct SupportModule {
pub(crate) issue_service: Arc<IssueService>,
pub(crate) service_level_agreement_service: Arc<ServiceLevelAgreementService>,
pub(crate) service_level_priority_service: Arc<ServiceLevelPriorityService>,
pub(crate) warranty_claim_service: Arc<WarrantyClaimService>,
}
impl SupportModule {
pub fn builder() -> SupportModuleBuilder {
SupportModuleBuilder::new()
}
pub fn all_crud_routes(&self) -> Router {
use presentation::http::{
create_issue_routes,
create_service_level_agreement_routes,
create_service_level_priority_routes,
create_warranty_claim_routes,
};
Router::new()
.merge(create_issue_routes(self.issue_service.clone()))
.merge(create_service_level_agreement_routes(self.service_level_agreement_service.clone()))
.merge(create_service_level_priority_routes(self.service_level_priority_service.clone()))
.merge(create_warranty_claim_routes(self.warranty_claim_service.clone()))
}
#[deprecated(note = "mounts unvalidated generic CRUD; prefer readonly_routes() + validated writes, or all_crud_routes() for the full/unguarded surface")]
pub fn routes(&self) -> Router {
self.all_crud_routes()
}
pub fn readonly_routes(&self) -> Router {
use presentation::http::{
create_issue_read_routes,
create_service_level_agreement_read_routes,
create_service_level_priority_read_routes,
create_warranty_claim_read_routes,
};
Router::new()
.merge(create_issue_read_routes(self.issue_service.clone()))
.merge(create_service_level_agreement_read_routes(self.service_level_agreement_service.clone()))
.merge(create_service_level_priority_read_routes(self.service_level_priority_service.clone()))
.merge(create_warranty_claim_read_routes(self.warranty_claim_service.clone()))
}
}
pub struct SupportModuleBuilder {
db_pool: Option<PgPool>,
}
impl SupportModuleBuilder {
pub fn new() -> Self {
Self {
db_pool: None,
}
}
pub fn with_database(mut self, pool: PgPool) -> Self {
self.db_pool = Some(pool);
self
}
pub fn build(self) -> anyhow::Result<SupportModule> {
let db_pool = self.db_pool
.ok_or_else(|| anyhow::anyhow!("Database pool not configured"))?;
let issue_repository = Arc::new(IssueRepository::new(db_pool.clone()));
let issue_service = Arc::new(IssueService::with_repository(issue_repository.clone()));
let service_level_agreement_repository = Arc::new(ServiceLevelAgreementRepository::new(db_pool.clone()));
let service_level_agreement_service = Arc::new(ServiceLevelAgreementService::with_repository(service_level_agreement_repository.clone()));
let service_level_priority_repository = Arc::new(ServiceLevelPriorityRepository::new(db_pool.clone()));
let service_level_priority_service = Arc::new(ServiceLevelPriorityService::with_repository(service_level_priority_repository.clone()));
let warranty_claim_repository = Arc::new(WarrantyClaimRepository::new(db_pool.clone()));
let warranty_claim_service = Arc::new(WarrantyClaimService::with_repository(warranty_claim_repository.clone()));
Ok(SupportModule {
issue_service,
service_level_agreement_service,
service_level_priority_service,
warranty_claim_service,
})
}
}
impl Default for SupportModuleBuilder {
fn default() -> Self {
Self::new()
}
}