feat: OrderingServices constructor

This commit is contained in:
Aravinth Manivannan 2025-01-10 14:08:13 +05:30
parent bf2b3c3440
commit b786bdd3ee
Signed by: realaravinth
GPG key ID: F8F50389936984FF

View file

@ -1,6 +1,7 @@
// SPDX-FileCopyrightText: 2024 Aravinth Manivannan <realaravinth@batsense.net> // SPDX-FileCopyrightText: 2024 Aravinth Manivannan <realaravinth@batsense.net>
// //
// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-License-Identifier: AGPL-3.0-or-later
use std::sync::Arc;
use derive_builder::Builder; use derive_builder::Builder;
use mockall::predicate::*; use mockall::predicate::*;
@ -27,105 +28,348 @@ pub mod update_order_service;
pub mod update_product_service; pub mod update_product_service;
pub mod update_store_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] #[automock]
pub trait OrderingServicesInterface: Send + Sync { pub trait OrderingServicesInterface: Send + Sync {
fn add_line_item(&self) -> add_line_item_service::AddLineItemServiceObj; fn add_line_item(&self) -> AddLineItemServiceObj;
fn update_line_item(&self) -> update_line_item_service::UpdateLineItemServiceObj; fn update_line_item(&self) -> UpdateLineItemServiceObj;
fn delete_line_item(&self) -> delete_line_item_service::DeleteLineItemServiceObj; fn delete_line_item(&self) -> DeleteLineItemServiceObj;
fn add_order(&self) -> add_order_service::AddOrderServiceObj; fn add_order(&self) -> AddOrderServiceObj;
fn update_order(&self) -> update_order_service::UpdateOrderServiceObj; fn update_order(&self) -> UpdateOrderServiceObj;
fn delete_order(&self) -> delete_order_service::DeleteOrderServiceObj; fn delete_order(&self) -> DeleteOrderServiceObj;
fn add_kot(&self) -> add_kot_service::AddKotServiceObj; fn add_kot(&self) -> AddKotServiceObj;
fn update_kot(&self) -> update_kot_service::UpdateKotServiceObj; fn update_kot(&self) -> UpdateKotServiceObj;
fn delete_kot(&self) -> delete_kot_service::DeleteKotServiceObj; fn delete_kot(&self) -> DeleteKotServiceObj;
fn add_store(&self) -> add_store_service::AddStoreServiceObj; fn add_store(&self) -> AddStoreServiceObj;
fn update_store(&self) -> update_store_service::UpdateStoreServiceObj; fn update_store(&self) -> UpdateStoreServiceObj;
fn add_category(&self) -> add_category_service::AddCategoryServiceObj; fn add_category(&self) -> AddCategoryServiceObj;
fn update_category(&self) -> update_category_service::UpdateCategoryServiceObj; fn update_category(&self) -> UpdateCategoryServiceObj;
fn add_product(&self) -> add_product_service::AddProductServiceObj; fn add_product(&self) -> AddProductServiceObj;
fn update_product(&self) -> update_product_service::UpdateProductServiceObj; fn update_product(&self) -> UpdateProductServiceObj;
fn add_customization(&self) -> add_customization_service::AddCustomizationServiceObj; fn add_customization(&self) -> AddCustomizationServiceObj;
fn update_customization(&self) -> update_customization_service::UpdateCustomizationServiceObj; fn update_customization(&self) -> UpdateCustomizationServiceObj;
} }
#[derive(Clone, Builder)] #[derive(Clone, Builder)]
pub struct OrderingServices { pub struct OrderingServices {
add_line_item: add_line_item_service::AddLineItemServiceObj, add_line_item: AddLineItemServiceObj,
update_line_item: update_line_item_service::UpdateLineItemServiceObj, update_line_item: UpdateLineItemServiceObj,
delete_line_item: delete_line_item_service::DeleteLineItemServiceObj, delete_line_item: DeleteLineItemServiceObj,
add_order: add_order_service::AddOrderServiceObj, add_order: AddOrderServiceObj,
update_order: update_order_service::UpdateOrderServiceObj, update_order: UpdateOrderServiceObj,
delete_order: delete_order_service::DeleteOrderServiceObj, delete_order: DeleteOrderServiceObj,
add_kot: add_kot_service::AddKotServiceObj, add_kot: AddKotServiceObj,
update_kot: update_kot_service::UpdateKotServiceObj, update_kot: UpdateKotServiceObj,
delete_kot: delete_kot_service::DeleteKotServiceObj, delete_kot: DeleteKotServiceObj,
add_store: add_store_service::AddStoreServiceObj, add_store: AddStoreServiceObj,
update_store: update_store_service::UpdateStoreServiceObj, update_store: UpdateStoreServiceObj,
add_category: add_category_service::AddCategoryServiceObj, add_category: AddCategoryServiceObj,
update_category: update_category_service::UpdateCategoryServiceObj, update_category: UpdateCategoryServiceObj,
add_product: add_product_service::AddProductServiceObj, add_product: AddProductServiceObj,
update_product: update_product_service::UpdateProductServiceObj, update_product: UpdateProductServiceObj,
add_customization: add_customization_service::AddCustomizationServiceObj, add_customization: AddCustomizationServiceObj,
update_customization: update_customization_service::UpdateCustomizationServiceObj, update_customization: UpdateCustomizationServiceObj,
} }
impl OrderingServicesInterface for OrderingServices { 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() 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() 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() self.delete_line_item.clone()
} }
fn add_order(&self) -> add_order_service::AddOrderServiceObj { fn add_order(&self) -> AddOrderServiceObj {
self.add_order.clone() self.add_order.clone()
} }
fn update_order(&self) -> update_order_service::UpdateOrderServiceObj { fn update_order(&self) -> UpdateOrderServiceObj {
self.update_order.clone() self.update_order.clone()
} }
fn delete_order(&self) -> delete_order_service::DeleteOrderServiceObj { fn delete_order(&self) -> DeleteOrderServiceObj {
self.delete_order.clone() self.delete_order.clone()
} }
fn add_kot(&self) -> add_kot_service::AddKotServiceObj { fn add_kot(&self) -> AddKotServiceObj {
self.add_kot.clone() self.add_kot.clone()
} }
fn update_kot(&self) -> update_kot_service::UpdateKotServiceObj { fn update_kot(&self) -> UpdateKotServiceObj {
self.update_kot.clone() self.update_kot.clone()
} }
fn delete_kot(&self) -> delete_kot_service::DeleteKotServiceObj { fn delete_kot(&self) -> DeleteKotServiceObj {
self.delete_kot.clone() self.delete_kot.clone()
} }
fn add_store(&self) -> add_store_service::AddStoreServiceObj { fn add_store(&self) -> AddStoreServiceObj {
self.add_store.clone() self.add_store.clone()
} }
fn update_store(&self) -> update_store_service::UpdateStoreServiceObj { fn update_store(&self) -> UpdateStoreServiceObj {
self.update_store.clone() self.update_store.clone()
} }
fn add_category(&self) -> add_category_service::AddCategoryServiceObj { fn add_category(&self) -> AddCategoryServiceObj {
self.add_category.clone() self.add_category.clone()
} }
fn update_category(&self) -> update_category_service::UpdateCategoryServiceObj { fn update_category(&self) -> UpdateCategoryServiceObj {
self.update_category.clone() self.update_category.clone()
} }
fn add_product(&self) -> add_product_service::AddProductServiceObj { fn add_product(&self) -> AddProductServiceObj {
self.add_product.clone() self.add_product.clone()
} }
fn update_product(&self) -> update_product_service::UpdateProductServiceObj { fn update_product(&self) -> UpdateProductServiceObj {
self.update_product.clone() self.update_product.clone()
} }
fn add_customization(&self) -> add_customization_service::AddCustomizationServiceObj { fn add_customization(&self) -> AddCustomizationServiceObj {
self.add_customization.clone() self.add_customization.clone()
} }
fn update_customization(&self) -> update_customization_service::UpdateCustomizationServiceObj { fn update_customization(&self) -> UpdateCustomizationServiceObj {
self.update_customization.clone() self.update_customization.clone()
} }
} }
pub type OrderingServicesInterfaceObj = Arc<dyn OrderingServicesInterface>;
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),
);
}
}