1#![recursion_limit = "1024"]
18#![allow(unused_imports)]
19
20pub mod request_pool;
22pub mod domain;
23pub mod infrastructure;
24pub mod application;
25pub mod presentation;
26pub mod seeders;
27pub mod exports;
28
29pub use domain::entity::*;
31
32pub use infrastructure::persistence::*;
34
35pub use application::service::BankService;
37pub use application::service::BankAccountService;
38pub use application::service::BankClearanceService;
39pub use application::service::BankReconciliationService;
40pub use application::service::BankStatementImportService;
41pub use application::service::BankTransactionService;
42pub use application::service::FxGainLossService;
43pub use application::service::ReconcilePresetService;
44
45pub use application::workflows::*;
47
48use std::sync::Arc;
49use axum::Router;
50use sqlx::PgPool;
51
52pub struct BankingModule {
65 pub(crate) bank_service: Arc<BankService>,
66 pub(crate) bank_account_service: Arc<BankAccountService>,
67 pub(crate) bank_clearance_service: Arc<BankClearanceService>,
68 pub(crate) bank_reconciliation_service: Arc<BankReconciliationService>,
69 pub(crate) bank_statement_import_service: Arc<BankStatementImportService>,
70 pub(crate) bank_transaction_service: Arc<BankTransactionService>,
71 pub(crate) fx_gain_loss_service: Arc<FxGainLossService>,
72 pub(crate) reconcile_preset_service: Arc<ReconcilePresetService>,
73 }
76
77impl BankingModule {
78 pub fn builder() -> BankingModuleBuilder {
80 BankingModuleBuilder::new()
81 }
82
83 pub fn all_crud_routes(&self) -> Router {
89 use presentation::http::{
90 create_bank_routes,
91 create_bank_account_routes,
92 create_bank_clearance_routes,
93 create_bank_reconciliation_routes,
94 create_bank_statement_import_routes,
95 create_bank_transaction_routes,
96 create_fx_gain_loss_routes,
97 create_reconcile_preset_routes,
98 };
99
100 Router::new()
101 .merge(create_bank_routes(self.bank_service.clone()))
102 .merge(create_bank_account_routes(self.bank_account_service.clone()))
103 .merge(create_bank_clearance_routes(self.bank_clearance_service.clone()))
104 .merge(create_bank_reconciliation_routes(self.bank_reconciliation_service.clone()))
105 .merge(create_bank_statement_import_routes(self.bank_statement_import_service.clone()))
106 .merge(create_bank_transaction_routes(self.bank_transaction_service.clone()))
107 .merge(create_fx_gain_loss_routes(self.fx_gain_loss_service.clone()))
108 .merge(create_reconcile_preset_routes(self.reconcile_preset_service.clone()))
109 }
110
111 #[deprecated(note = "mounts unvalidated generic CRUD; prefer readonly_routes() + validated writes, or all_crud_routes() for the full/unguarded surface")]
117 pub fn routes(&self) -> Router {
118 self.all_crud_routes()
119 }
120
121 pub fn readonly_routes(&self) -> Router {
127 use presentation::http::{
128 create_bank_read_routes,
129 create_bank_account_read_routes,
130 create_bank_clearance_read_routes,
131 create_bank_reconciliation_read_routes,
132 create_bank_statement_import_read_routes,
133 create_bank_transaction_read_routes,
134 create_fx_gain_loss_read_routes,
135 create_reconcile_preset_read_routes,
136 };
137
138 Router::new()
139 .merge(create_bank_read_routes(self.bank_service.clone()))
140 .merge(create_bank_account_read_routes(self.bank_account_service.clone()))
141 .merge(create_bank_clearance_read_routes(self.bank_clearance_service.clone()))
142 .merge(create_bank_reconciliation_read_routes(self.bank_reconciliation_service.clone()))
143 .merge(create_bank_statement_import_read_routes(self.bank_statement_import_service.clone()))
144 .merge(create_bank_transaction_read_routes(self.bank_transaction_service.clone()))
145 .merge(create_fx_gain_loss_read_routes(self.fx_gain_loss_service.clone()))
146 .merge(create_reconcile_preset_read_routes(self.reconcile_preset_service.clone()))
147 }
148
149 }
152
153pub struct BankingModuleBuilder {
155 db_pool: Option<PgPool>,
156}
157
158impl BankingModuleBuilder {
159 pub fn new() -> Self {
161 Self {
162 db_pool: None,
163 }
164 }
165
166 pub fn with_database(mut self, pool: PgPool) -> Self {
168 self.db_pool = Some(pool);
169 self
170 }
171
172 pub fn build(self) -> anyhow::Result<BankingModule> {
177 let db_pool = self.db_pool
178 .ok_or_else(|| anyhow::anyhow!("Database pool not configured"))?;
179
180 let bank_repository = Arc::new(BankRepository::new(db_pool.clone()));
182 let bank_service = Arc::new(BankService::with_repository(bank_repository.clone()));
183
184 let bank_account_repository = Arc::new(BankAccountRepository::new(db_pool.clone()));
186 let bank_account_service = Arc::new(BankAccountService::with_repository(bank_account_repository.clone()));
187
188 let bank_clearance_repository = Arc::new(BankClearanceRepository::new(db_pool.clone()));
190 let bank_clearance_service = Arc::new(BankClearanceService::with_repository(bank_clearance_repository.clone()));
191
192 let bank_reconciliation_repository = Arc::new(BankReconciliationRepository::new(db_pool.clone()));
194 let bank_reconciliation_service = Arc::new(BankReconciliationService::with_repository(bank_reconciliation_repository.clone()));
195
196 let bank_statement_import_repository = Arc::new(BankStatementImportRepository::new(db_pool.clone()));
198 let bank_statement_import_service = Arc::new(BankStatementImportService::with_repository(bank_statement_import_repository.clone()));
199
200 let bank_transaction_repository = Arc::new(BankTransactionRepository::new(db_pool.clone()));
202 let bank_transaction_service = Arc::new(BankTransactionService::with_repository(bank_transaction_repository.clone()));
203
204 let fx_gain_loss_repository = Arc::new(FxGainLossRepository::new(db_pool.clone()));
206 let fx_gain_loss_service = Arc::new(FxGainLossService::with_repository(fx_gain_loss_repository.clone()));
207
208 let reconcile_preset_repository = Arc::new(ReconcilePresetRepository::new(db_pool.clone()));
210 let reconcile_preset_service = Arc::new(ReconcilePresetService::with_repository(reconcile_preset_repository.clone()));
211
212 Ok(BankingModule {
216 bank_service,
217 bank_account_service,
218 bank_clearance_service,
219 bank_reconciliation_service,
220 bank_statement_import_service,
221 bank_transaction_service,
222 fx_gain_loss_service,
223 reconcile_preset_service,
224 })
227 }
228}
229
230impl Default for BankingModuleBuilder {
231 fn default() -> Self {
232 Self::new()
233 }
234}