1#![recursion_limit = "1024"]
18#![allow(unused_imports)]
19
20pub mod domain;
22pub mod infrastructure;
23pub mod application;
24pub mod presentation;
25pub mod seeders;
26pub mod integration;
29pub mod exports;
31
32pub mod request_pool;
37pub use domain::entity::*;
41
42pub use infrastructure::persistence::*;
44
45pub use application::service::PosClosingEntryService;
47pub use application::service::PosInvoiceService;
48pub use application::service::PosInvoiceItemService;
49pub use application::service::PosPaymentService;
50pub use application::service::PosProfileService;
51pub use application::service::PosOpeningEntryService;
52pub use application::service::PosCashMovementService;
53pub use application::service::PosDiscountService;
54pub use application::service::PosManagerPinService;
55pub use application::service::PosFloorPlanService;
56pub use application::service::PosTableService;
57
58pub use application::validator::{ValidationError, ValidationResult};
60
61use std::sync::Arc;
62use axum::Router;
63use sqlx::PgPool;
64
65pub struct PosModule {
78 pub(crate) pos_closing_entry_service: Arc<PosClosingEntryService>,
79 pub(crate) pos_invoice_service: Arc<PosInvoiceService>,
80 pub(crate) pos_invoice_item_service: Arc<PosInvoiceItemService>,
81 pub(crate) pos_payment_service: Arc<PosPaymentService>,
82 pub(crate) pos_profile_service: Arc<PosProfileService>,
83 pub(crate) pos_opening_entry_service: Arc<PosOpeningEntryService>,
84 pub(crate) pos_cash_movement_service: Arc<PosCashMovementService>,
85 pub(crate) pos_discount_service: Arc<PosDiscountService>,
86 pub(crate) pos_manager_pin_service: Arc<PosManagerPinService>,
87 pub(crate) pos_floor_plan_service: Arc<PosFloorPlanService>,
88 pub(crate) pos_table_service: Arc<PosTableService>,
89 }
92
93impl PosModule {
94 pub fn builder() -> PosModuleBuilder {
96 PosModuleBuilder::new()
97 }
98
99 pub fn all_crud_routes(&self) -> Router {
105 use presentation::http::{
106 create_pos_closing_entry_routes,
107 create_pos_invoice_routes,
108 create_pos_invoice_item_routes,
109 create_pos_payment_routes,
110 create_pos_profile_routes,
111 create_pos_opening_entry_routes,
112 create_pos_cash_movement_routes,
113 create_pos_discount_routes,
114 create_pos_manager_pin_routes,
115 create_pos_floor_plan_routes,
116 create_pos_table_routes,
117 };
118
119 Router::new()
120 .merge(create_pos_closing_entry_routes(self.pos_closing_entry_service.clone()))
121 .merge(create_pos_invoice_routes(self.pos_invoice_service.clone()))
122 .merge(create_pos_invoice_item_routes(self.pos_invoice_item_service.clone()))
123 .merge(create_pos_payment_routes(self.pos_payment_service.clone()))
124 .merge(create_pos_profile_routes(self.pos_profile_service.clone()))
125 .merge(create_pos_opening_entry_routes(self.pos_opening_entry_service.clone()))
126 .merge(create_pos_cash_movement_routes(self.pos_cash_movement_service.clone()))
127 .merge(create_pos_discount_routes(self.pos_discount_service.clone()))
128 .merge(create_pos_manager_pin_routes(self.pos_manager_pin_service.clone()))
129 .merge(create_pos_floor_plan_routes(self.pos_floor_plan_service.clone()))
130 .merge(create_pos_table_routes(self.pos_table_service.clone()))
131 }
132
133 #[deprecated(note = "mounts unvalidated generic CRUD; prefer readonly_routes() + validated writes, or all_crud_routes() for the full/unguarded surface")]
139 pub fn routes(&self) -> Router {
140 self.all_crud_routes()
141 }
142
143 pub fn readonly_routes(&self) -> Router {
149 use presentation::http::{
150 create_pos_closing_entry_read_routes,
151 create_pos_invoice_read_routes,
152 create_pos_invoice_item_read_routes,
153 create_pos_payment_read_routes,
154 create_pos_profile_read_routes,
155 create_pos_opening_entry_read_routes,
156 create_pos_cash_movement_read_routes,
157 create_pos_discount_read_routes,
158 create_pos_manager_pin_read_routes,
159 create_pos_floor_plan_read_routes,
160 create_pos_table_read_routes,
161 };
162
163 Router::new()
164 .merge(create_pos_closing_entry_read_routes(self.pos_closing_entry_service.clone()))
165 .merge(create_pos_invoice_read_routes(self.pos_invoice_service.clone()))
166 .merge(create_pos_invoice_item_read_routes(self.pos_invoice_item_service.clone()))
167 .merge(create_pos_payment_read_routes(self.pos_payment_service.clone()))
168 .merge(create_pos_profile_read_routes(self.pos_profile_service.clone()))
169 .merge(create_pos_opening_entry_read_routes(self.pos_opening_entry_service.clone()))
170 .merge(create_pos_cash_movement_read_routes(self.pos_cash_movement_service.clone()))
171 .merge(create_pos_discount_read_routes(self.pos_discount_service.clone()))
172 .merge(create_pos_manager_pin_read_routes(self.pos_manager_pin_service.clone()))
173 .merge(create_pos_floor_plan_read_routes(self.pos_floor_plan_service.clone()))
174 .merge(create_pos_table_read_routes(self.pos_table_service.clone()))
175 }
176
177 }
180
181pub struct PosModuleBuilder {
183 db_pool: Option<PgPool>,
184}
185
186impl PosModuleBuilder {
187 pub fn new() -> Self {
189 Self {
190 db_pool: None,
191 }
192 }
193
194 pub fn with_database(mut self, pool: PgPool) -> Self {
196 self.db_pool = Some(pool);
197 self
198 }
199
200 pub fn build(self) -> anyhow::Result<PosModule> {
205 let db_pool = self.db_pool
206 .ok_or_else(|| anyhow::anyhow!("Database pool not configured"))?;
207
208 let pos_closing_entry_repository = Arc::new(PosClosingEntryRepository::new(db_pool.clone()));
210 let pos_closing_entry_service = Arc::new(PosClosingEntryService::with_repository(pos_closing_entry_repository.clone()));
211
212 let pos_invoice_repository = Arc::new(PosInvoiceRepository::new(db_pool.clone()));
214 let pos_invoice_service = Arc::new(PosInvoiceService::with_repository(pos_invoice_repository.clone()));
215
216 let pos_invoice_item_repository = Arc::new(PosInvoiceItemRepository::new(db_pool.clone()));
218 let pos_invoice_item_service = Arc::new(PosInvoiceItemService::with_repository(pos_invoice_item_repository.clone()));
219
220 let pos_payment_repository = Arc::new(PosPaymentRepository::new(db_pool.clone()));
222 let pos_payment_service = Arc::new(PosPaymentService::with_repository(pos_payment_repository.clone()));
223
224 let pos_profile_repository = Arc::new(PosProfileRepository::new(db_pool.clone()));
226 let pos_profile_service = Arc::new(PosProfileService::with_repository(pos_profile_repository.clone()));
227
228 let pos_opening_entry_repository = Arc::new(PosOpeningEntryRepository::new(db_pool.clone()));
230 let pos_opening_entry_service = Arc::new(PosOpeningEntryService::with_repository(pos_opening_entry_repository.clone()));
231
232 let pos_cash_movement_repository = Arc::new(PosCashMovementRepository::new(db_pool.clone()));
234 let pos_cash_movement_service = Arc::new(PosCashMovementService::with_repository(pos_cash_movement_repository.clone()));
235
236 let pos_discount_repository = Arc::new(PosDiscountRepository::new(db_pool.clone()));
238 let pos_discount_service = Arc::new(PosDiscountService::with_repository(pos_discount_repository.clone()));
239
240 let pos_manager_pin_repository = Arc::new(PosManagerPinRepository::new(db_pool.clone()));
242 let pos_manager_pin_service = Arc::new(PosManagerPinService::with_repository(pos_manager_pin_repository.clone()));
243
244 let pos_floor_plan_repository = Arc::new(PosFloorPlanRepository::new(db_pool.clone()));
246 let pos_floor_plan_service = Arc::new(PosFloorPlanService::with_repository(pos_floor_plan_repository.clone()));
247
248 let pos_table_repository = Arc::new(PosTableRepository::new(db_pool.clone()));
250 let pos_table_service = Arc::new(PosTableService::with_repository(pos_table_repository.clone()));
251
252 Ok(PosModule {
256 pos_closing_entry_service,
257 pos_invoice_service,
258 pos_invoice_item_service,
259 pos_payment_service,
260 pos_profile_service,
261 pos_opening_entry_service,
262 pos_cash_movement_service,
263 pos_discount_service,
264 pos_manager_pin_service,
265 pos_floor_plan_service,
266 pos_table_service,
267 })
270 }
271}
272
273impl Default for PosModuleBuilder {
274 fn default() -> Self {
275 Self::new()
276 }
277}