diff --git a/src/ordering/application/services/mod.rs b/src/ordering/application/services/mod.rs index d56fc69..a0ceac7 100644 --- a/src/ordering/application/services/mod.rs +++ b/src/ordering/application/services/mod.rs @@ -1,6 +1,7 @@ // SPDX-FileCopyrightText: 2024 Aravinth Manivannan // // SPDX-License-Identifier: AGPL-3.0-or-later +use std::sync::Arc; use derive_builder::Builder; use mockall::predicate::*; @@ -27,105 +28,348 @@ pub mod update_order_service; pub mod update_product_service; pub mod update_store_service; +use add_category_service::*; +use add_customization_service::*; +use add_kot_service::*; +use add_line_item_service::*; +use add_order_service::*; +use add_product_service::*; +use add_store_service::*; +use delete_kot_service::*; +use delete_line_item_service::*; +use delete_order_service::*; +use update_category_service::*; +use update_customization_service::*; +use update_kot_service::*; +use update_line_item_service::*; +use update_order_service::*; +use update_product_service::*; +use update_store_service::*; + +use super::port::output::{ + db::{ + category_id_exists::*, category_name_exists_for_store::*, customization_id_exists::*, + customization_name_exists_for_product::*, get_category::*, kot_id_exists::*, + line_item_id_exists::*, order_id_exists::*, product_id_exists::*, + product_name_exists_for_category::*, store_id_exists::*, store_name_exists::*, + }, + full_text_search::add_product_to_store::*, +}; + #[automock] pub trait OrderingServicesInterface: Send + Sync { - fn add_line_item(&self) -> add_line_item_service::AddLineItemServiceObj; - fn update_line_item(&self) -> update_line_item_service::UpdateLineItemServiceObj; - fn delete_line_item(&self) -> delete_line_item_service::DeleteLineItemServiceObj; - fn add_order(&self) -> add_order_service::AddOrderServiceObj; - fn update_order(&self) -> update_order_service::UpdateOrderServiceObj; - fn delete_order(&self) -> delete_order_service::DeleteOrderServiceObj; - fn add_kot(&self) -> add_kot_service::AddKotServiceObj; - fn update_kot(&self) -> update_kot_service::UpdateKotServiceObj; - fn delete_kot(&self) -> delete_kot_service::DeleteKotServiceObj; - fn add_store(&self) -> add_store_service::AddStoreServiceObj; - fn update_store(&self) -> update_store_service::UpdateStoreServiceObj; - fn add_category(&self) -> add_category_service::AddCategoryServiceObj; - fn update_category(&self) -> update_category_service::UpdateCategoryServiceObj; - fn add_product(&self) -> add_product_service::AddProductServiceObj; - fn update_product(&self) -> update_product_service::UpdateProductServiceObj; - fn add_customization(&self) -> add_customization_service::AddCustomizationServiceObj; - fn update_customization(&self) -> update_customization_service::UpdateCustomizationServiceObj; + fn add_line_item(&self) -> AddLineItemServiceObj; + fn update_line_item(&self) -> UpdateLineItemServiceObj; + fn delete_line_item(&self) -> DeleteLineItemServiceObj; + fn add_order(&self) -> AddOrderServiceObj; + fn update_order(&self) -> UpdateOrderServiceObj; + fn delete_order(&self) -> DeleteOrderServiceObj; + fn add_kot(&self) -> AddKotServiceObj; + fn update_kot(&self) -> UpdateKotServiceObj; + fn delete_kot(&self) -> DeleteKotServiceObj; + fn add_store(&self) -> AddStoreServiceObj; + fn update_store(&self) -> UpdateStoreServiceObj; + fn add_category(&self) -> AddCategoryServiceObj; + fn update_category(&self) -> UpdateCategoryServiceObj; + fn add_product(&self) -> AddProductServiceObj; + fn update_product(&self) -> UpdateProductServiceObj; + fn add_customization(&self) -> AddCustomizationServiceObj; + fn update_customization(&self) -> UpdateCustomizationServiceObj; } #[derive(Clone, Builder)] pub struct OrderingServices { - add_line_item: add_line_item_service::AddLineItemServiceObj, - update_line_item: update_line_item_service::UpdateLineItemServiceObj, - delete_line_item: delete_line_item_service::DeleteLineItemServiceObj, - add_order: add_order_service::AddOrderServiceObj, - update_order: update_order_service::UpdateOrderServiceObj, - delete_order: delete_order_service::DeleteOrderServiceObj, - add_kot: add_kot_service::AddKotServiceObj, - update_kot: update_kot_service::UpdateKotServiceObj, - delete_kot: delete_kot_service::DeleteKotServiceObj, - add_store: add_store_service::AddStoreServiceObj, - update_store: update_store_service::UpdateStoreServiceObj, - add_category: add_category_service::AddCategoryServiceObj, - update_category: update_category_service::UpdateCategoryServiceObj, - add_product: add_product_service::AddProductServiceObj, - update_product: update_product_service::UpdateProductServiceObj, - add_customization: add_customization_service::AddCustomizationServiceObj, - update_customization: update_customization_service::UpdateCustomizationServiceObj, + add_line_item: AddLineItemServiceObj, + update_line_item: UpdateLineItemServiceObj, + delete_line_item: DeleteLineItemServiceObj, + add_order: AddOrderServiceObj, + update_order: UpdateOrderServiceObj, + delete_order: DeleteOrderServiceObj, + add_kot: AddKotServiceObj, + update_kot: UpdateKotServiceObj, + delete_kot: DeleteKotServiceObj, + add_store: AddStoreServiceObj, + update_store: UpdateStoreServiceObj, + add_category: AddCategoryServiceObj, + update_category: UpdateCategoryServiceObj, + add_product: AddProductServiceObj, + update_product: UpdateProductServiceObj, + add_customization: AddCustomizationServiceObj, + update_customization: UpdateCustomizationServiceObj, } impl OrderingServicesInterface for OrderingServices { - fn add_line_item(&self) -> add_line_item_service::AddLineItemServiceObj { + fn add_line_item(&self) -> AddLineItemServiceObj { self.add_line_item.clone() } - fn update_line_item(&self) -> update_line_item_service::UpdateLineItemServiceObj { + fn update_line_item(&self) -> UpdateLineItemServiceObj { self.update_line_item.clone() } - fn delete_line_item(&self) -> delete_line_item_service::DeleteLineItemServiceObj { + fn delete_line_item(&self) -> DeleteLineItemServiceObj { self.delete_line_item.clone() } - fn add_order(&self) -> add_order_service::AddOrderServiceObj { + fn add_order(&self) -> AddOrderServiceObj { self.add_order.clone() } - fn update_order(&self) -> update_order_service::UpdateOrderServiceObj { + fn update_order(&self) -> UpdateOrderServiceObj { self.update_order.clone() } - fn delete_order(&self) -> delete_order_service::DeleteOrderServiceObj { + fn delete_order(&self) -> DeleteOrderServiceObj { self.delete_order.clone() } - fn add_kot(&self) -> add_kot_service::AddKotServiceObj { + fn add_kot(&self) -> AddKotServiceObj { self.add_kot.clone() } - fn update_kot(&self) -> update_kot_service::UpdateKotServiceObj { + fn update_kot(&self) -> UpdateKotServiceObj { self.update_kot.clone() } - fn delete_kot(&self) -> delete_kot_service::DeleteKotServiceObj { + fn delete_kot(&self) -> DeleteKotServiceObj { self.delete_kot.clone() } - fn add_store(&self) -> add_store_service::AddStoreServiceObj { + fn add_store(&self) -> AddStoreServiceObj { self.add_store.clone() } - fn update_store(&self) -> update_store_service::UpdateStoreServiceObj { + fn update_store(&self) -> UpdateStoreServiceObj { self.update_store.clone() } - fn add_category(&self) -> add_category_service::AddCategoryServiceObj { + fn add_category(&self) -> AddCategoryServiceObj { self.add_category.clone() } - fn update_category(&self) -> update_category_service::UpdateCategoryServiceObj { + fn update_category(&self) -> UpdateCategoryServiceObj { self.update_category.clone() } - fn add_product(&self) -> add_product_service::AddProductServiceObj { + fn add_product(&self) -> AddProductServiceObj { self.add_product.clone() } - fn update_product(&self) -> update_product_service::UpdateProductServiceObj { + fn update_product(&self) -> UpdateProductServiceObj { self.update_product.clone() } - fn add_customization(&self) -> add_customization_service::AddCustomizationServiceObj { + fn add_customization(&self) -> AddCustomizationServiceObj { self.add_customization.clone() } - fn update_customization(&self) -> update_customization_service::UpdateCustomizationServiceObj { + fn update_customization(&self) -> UpdateCustomizationServiceObj { self.update_customization.clone() } } + +pub type OrderingServicesInterfaceObj = Arc; + +impl OrderingServices { + pub fn new( + out_db_category_id_exists: CategoryIDExistsDBPortObj, + out_db_category_name_exists_for_store: CategoryNameExistsForStoreDBPortObj, + out_db_customization_id_exists: CustomizationIDExistsDBPortObj, + out_db_customization_name_exists_for_product: CustomizationNameExistsForProductDBPortObj, + out_db_get_category: GetCategoryDBPortObj, + + out_db_kot_id_exists: KotIDExistsDBPortObj, + out_db_line_item_id_exists: LineItemIDExistsDBPortObj, + out_db_order_id_exists: OrderIDExistsDBPortObj, + + out_db_product_id_exists: ProductIDExistsDBPortObj, + out_db_product_name_exists_for_category: ProductNameExistsForCategoryDBPortObj, + out_db_store_id_exists: StoreIDExistsDBPortObj, + out_db_store_name_exists: StoreNameExistsDBPortObj, + + out_fts_add_product_to_store: AddProductToStoreFTSPortObj, + ) -> OrderingServicesInterfaceObj { + let add_line_item = Arc::new( + AddLineItemServiceBuilder::default() + .db_line_item_id_exists(out_db_line_item_id_exists.clone()) + .db_kot_id_exists(out_db_kot_id_exists.clone()) + .build() + .unwrap(), + ); + + let update_line_item = Arc::new( + UpdateLineItemServiceBuilder::default() + .db_line_item_id_exists(out_db_line_item_id_exists.clone()) + .db_kot_id_exists(out_db_kot_id_exists.clone()) + .build() + .unwrap(), + ); + let delete_line_item = Arc::new( + DeleteLineItemServiceBuilder::default() + .db_line_item_id_exists(out_db_line_item_id_exists.clone()) + .build() + .unwrap(), + ); + + let add_order = Arc::new( + AddOrderServiceBuilder::default() + .db_store_id_exists(out_db_store_id_exists.clone()) + .db_order_id_exists(out_db_order_id_exists.clone()) + .build() + .unwrap(), + ); + let update_order = Arc::new( + UpdateOrderServiceBuilder::default() + .db_order_id_exists(out_db_order_id_exists.clone()) + .build() + .unwrap(), + ); + + let delete_order = Arc::new( + DeleteOrderServiceBuilder::default() + .db_order_id_exists(out_db_order_id_exists.clone()) + .build() + .unwrap(), + ); + + let add_kot = Arc::new( + AddKotServiceBuilder::default() + .db_order_id_exists(out_db_order_id_exists.clone()) + .db_kot_id_exists(out_db_kot_id_exists.clone()) + .build() + .unwrap(), + ); + + let update_kot = Arc::new( + UpdateKotServiceBuilder::default() + .db_order_id_exists(out_db_order_id_exists.clone()) + .db_kot_id_exists(out_db_kot_id_exists.clone()) + .build() + .unwrap(), + ); + + let delete_kot = Arc::new( + DeleteKotServiceBuilder::default() + .db_kot_id_exists(out_db_kot_id_exists.clone()) + .build() + .unwrap(), + ); + + let add_store = Arc::new( + AddStoreServiceBuilder::default() + .db_store_id_exists(out_db_store_id_exists.clone()) + .db_store_name_exists(out_db_store_name_exists.clone()) + .build() + .unwrap(), + ); + + let add_category = Arc::new( + AddCategoryServiceBuilder::default() + .db_store_id_exists(out_db_store_id_exists.clone()) + .db_category_name_exists_for_store(out_db_category_name_exists_for_store.clone()) + .db_category_id_exists(out_db_category_id_exists.clone()) + .build() + .unwrap(), + ); + + let add_product = Arc::new( + AddProductServiceBuilder::default() + .db_category_id_exists(out_db_category_id_exists.clone()) + .db_product_name_exists_for_category( + out_db_product_name_exists_for_category.clone(), + ) + .db_product_id_exists(out_db_product_id_exists.clone()) + .db_get_category(out_db_get_category.clone()) + .fts_add_product(out_fts_add_product_to_store.clone()) + .build() + .unwrap(), + ); + + let add_customization = Arc::new( + AddCustomizationServiceBuilder::default() + .db_product_id_exists(out_db_product_id_exists.clone()) + .db_customization_id_exists(out_db_customization_id_exists.clone()) + .db_customization_name_exists_for_product( + out_db_customization_name_exists_for_product.clone(), + ) + .build() + .unwrap(), + ); + + let update_product = Arc::new( + UpdateProductServiceBuilder::default() + .db_category_id_exists(out_db_category_id_exists.clone()) + .db_product_name_exists_for_category( + out_db_product_name_exists_for_category.clone(), + ) + .db_product_id_exists(out_db_product_id_exists.clone()) + .build() + .unwrap(), + ); + + let update_customization = Arc::new( + UpdateCustomizationServiceBuilder::default() + .db_product_id_exists(out_db_product_id_exists.clone()) + .db_customization_id_exists(out_db_customization_id_exists.clone()) + .db_customization_name_exists_for_product( + out_db_customization_name_exists_for_product.clone(), + ) + .build() + .unwrap(), + ); + + let update_category = Arc::new( + UpdateCategoryServiceBuilder::default() + .db_store_id_exists(out_db_store_id_exists.clone()) + .db_category_name_exists_for_store(out_db_category_name_exists_for_store.clone()) + .db_category_id_exists(out_db_category_id_exists.clone()) + .build() + .unwrap(), + ); + + let update_store = Arc::new( + UpdateStoreServiceBuilder::default() + .db_store_id_exists(out_db_store_id_exists.clone()) + .db_store_name_exists(out_db_store_name_exists.clone()) + .build() + .unwrap(), + ); + + Arc::new(Self { + add_line_item, + update_line_item, + delete_line_item, + add_order, + update_order, + delete_order, + add_kot, + update_kot, + delete_kot, + add_store, + update_store, + add_category, + update_category, + add_product, + update_product, + add_customization, + update_customization, + }) + } +} + +#[cfg(test)] +mod tests { + use crate::tests::bdd::IS_NEVER_CALLED; + + use super::*; + + #[test] + fn ordering_services_work() { + let s = OrderingServices::new( + mock_category_id_exists_db_port_true(IS_NEVER_CALLED), + mock_category_name_exists_for_store_db_port_true(IS_NEVER_CALLED), + mock_customization_id_exists_db_port_true(IS_NEVER_CALLED), + mock_customization_name_exists_for_product_db_port_true(IS_NEVER_CALLED), + mock_get_category_db_port(IS_NEVER_CALLED), + mock_kot_id_exists_db_port_true(IS_NEVER_CALLED), + mock_line_item_id_exists_db_port_true(IS_NEVER_CALLED), + mock_order_id_exists_db_port_true(IS_NEVER_CALLED), + mock_product_id_exists_db_port_true(IS_NEVER_CALLED), + mock_product_name_exists_for_category_db_port_true(IS_NEVER_CALLED), + mock_store_id_exists_db_port_true(IS_NEVER_CALLED), + mock_store_name_exists_db_port_true(IS_NEVER_CALLED), + mock_add_product_to_store_fts_port(IS_NEVER_CALLED), + ); + } +}