#![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 mod maintenance_module_ext;
pub use domain::entity::*;
pub use infrastructure::persistence::*;
pub use application::service::MaintenanceRequestService;
pub use application::service::MaintenanceScheduleService;
pub use application::service::MaintenanceStageService;
pub use application::service::MaintenanceVisitService;
pub use application::service::MaintenanceVisitPartService;
pub use application::validator::{ValidationError, ValidationResult};
pub use application::workflows::*;
pub use application::service::{
GlPostSink, InventoryPort, LoggingSink, MaintenanceEventSink, MaintenanceWriteService,
MaintenanceRequestWriteService,
};
use std::sync::Arc;
use axum::Router;
use sqlx::PgPool;
pub struct MaintenanceModule {
pub(crate) maintenance_request_service: Arc<MaintenanceRequestService>,
pub(crate) maintenance_schedule_service: Arc<MaintenanceScheduleService>,
pub(crate) maintenance_stage_service: Arc<MaintenanceStageService>,
pub(crate) maintenance_visit_service: Arc<MaintenanceVisitService>,
pub(crate) maintenance_visit_part_service: Arc<MaintenanceVisitPartService>,
pub(crate) query: Arc<dyn crate::exports::MaintenanceQueryService>,
pub(crate) write_svc: Arc<application::service::MaintenanceWriteService>,
pub(crate) request_write_svc: Arc<application::service::MaintenanceRequestWriteService>,
pub(crate) gl_sink: Option<Arc<dyn application::service::GlPostSink>>,
pub(crate) inventory_port: Option<Arc<dyn application::service::InventoryPort>>,
pub(crate) event_sink: Arc<dyn application::service::MaintenanceEventSink>,
}
impl MaintenanceModule {
pub fn builder() -> MaintenanceModuleBuilder {
MaintenanceModuleBuilder::new()
}
pub fn all_crud_routes(&self) -> Router {
use presentation::http::{
create_maintenance_request_routes,
create_maintenance_schedule_routes,
create_maintenance_stage_routes,
create_maintenance_visit_routes,
create_maintenance_visit_part_routes,
};
Router::new()
.merge(create_maintenance_request_routes(self.maintenance_request_service.clone()))
.merge(create_maintenance_schedule_routes(self.maintenance_schedule_service.clone()))
.merge(create_maintenance_stage_routes(self.maintenance_stage_service.clone()))
.merge(create_maintenance_visit_routes(self.maintenance_visit_service.clone()))
.merge(create_maintenance_visit_part_routes(self.maintenance_visit_part_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_maintenance_request_read_routes,
create_maintenance_schedule_read_routes,
create_maintenance_stage_read_routes,
create_maintenance_visit_read_routes,
create_maintenance_visit_part_read_routes,
};
Router::new()
.merge(create_maintenance_request_read_routes(self.maintenance_request_service.clone()))
.merge(create_maintenance_schedule_read_routes(self.maintenance_schedule_service.clone()))
.merge(create_maintenance_stage_read_routes(self.maintenance_stage_service.clone()))
.merge(create_maintenance_visit_read_routes(self.maintenance_visit_service.clone()))
.merge(create_maintenance_visit_part_read_routes(self.maintenance_visit_part_service.clone()))
}
}
pub struct MaintenanceModuleBuilder {
db_pool: Option<PgPool>,
gl_sink: Option<Arc<dyn application::service::GlPostSink>>,
inventory_port: Option<Arc<dyn application::service::InventoryPort>>,
event_sink: Option<Arc<dyn application::service::MaintenanceEventSink>>,
}
impl MaintenanceModuleBuilder {
pub fn new() -> Self {
Self {
db_pool: None,
gl_sink: None,
inventory_port: None,
event_sink: None,
}
}
pub fn with_database(mut self, pool: PgPool) -> Self {
self.db_pool = Some(pool);
self
}
pub fn with_gl_sink(mut self, sink: Arc<dyn application::service::GlPostSink>) -> Self {
self.gl_sink = Some(sink);
self
}
pub fn with_inventory_port(
mut self,
port: Arc<dyn application::service::InventoryPort>,
) -> Self {
self.inventory_port = Some(port);
self
}
pub fn with_event_sink(
mut self,
sink: Arc<dyn application::service::MaintenanceEventSink>,
) -> Self {
self.event_sink = Some(sink);
self
}
pub fn build(self) -> anyhow::Result<MaintenanceModule> {
let db_pool = self.db_pool
.ok_or_else(|| anyhow::anyhow!("Database pool not configured"))?;
let maintenance_request_repository = Arc::new(MaintenanceRequestRepository::new(db_pool.clone()));
let maintenance_request_service = Arc::new(MaintenanceRequestService::with_repository(maintenance_request_repository.clone()));
let maintenance_schedule_repository = Arc::new(MaintenanceScheduleRepository::new(db_pool.clone()));
let maintenance_schedule_service = Arc::new(MaintenanceScheduleService::with_repository(maintenance_schedule_repository.clone()));
let maintenance_stage_repository = Arc::new(MaintenanceStageRepository::new(db_pool.clone()));
let maintenance_stage_service = Arc::new(MaintenanceStageService::with_repository(maintenance_stage_repository.clone()));
let maintenance_visit_repository = Arc::new(MaintenanceVisitRepository::new(db_pool.clone()));
let maintenance_visit_service = Arc::new(MaintenanceVisitService::with_repository(maintenance_visit_repository.clone()));
let maintenance_visit_part_repository = Arc::new(MaintenanceVisitPartRepository::new(db_pool.clone()));
let maintenance_visit_part_service = Arc::new(MaintenanceVisitPartService::with_repository(maintenance_visit_part_repository.clone()));
let query: Arc<dyn crate::exports::MaintenanceQueryService> =
Arc::new(application::service::MaintenanceQueryServiceImpl::new(db_pool.clone()));
let write_svc =
Arc::new(application::service::MaintenanceWriteService::new(db_pool.clone()));
let request_write_svc = Arc::new(
application::service::MaintenanceRequestWriteService::new(db_pool.clone()),
);
let event_sink: Arc<dyn application::service::MaintenanceEventSink> = self
.event_sink
.unwrap_or_else(|| Arc::new(application::service::LoggingSink));
Ok(MaintenanceModule {
maintenance_request_service,
maintenance_schedule_service,
maintenance_stage_service,
maintenance_visit_service,
maintenance_visit_part_service,
query,
write_svc,
request_write_svc,
gl_sink: self.gl_sink,
inventory_port: self.inventory_port,
event_sink,
})
}
}
impl Default for MaintenanceModuleBuilder {
fn default() -> Self {
Self::new()
}
}