feat: InventoryServices constructor
This commit is contained in:
parent
46973ba2e0
commit
bf2b3c3440
1 changed files with 176 additions and 24 deletions
|
@ -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::*;
|
||||||
|
@ -18,58 +19,209 @@ pub mod update_customization_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_product_service::*;
|
||||||
|
use add_store_service::*;
|
||||||
|
use update_category_service::*;
|
||||||
|
use update_customization_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::*, product_id_exists::*,
|
||||||
|
product_name_exists_for_category::*, store_id_exists::*, store_name_exists::*,
|
||||||
|
},
|
||||||
|
full_text_search::{add_product_to_store::*, update_product::*},
|
||||||
|
};
|
||||||
|
|
||||||
#[automock]
|
#[automock]
|
||||||
pub trait InventoryServicesInterface: Send + Sync {
|
pub trait InventoryServicesInterface: Send + Sync {
|
||||||
fn add_store(&self) -> add_store_service::AddStoreServiceObj;
|
fn add_store(&self) -> AddStoreServiceObj;
|
||||||
fn add_category(&self) -> add_category_service::AddCategoryServiceObj;
|
fn add_category(&self) -> AddCategoryServiceObj;
|
||||||
fn add_product(&self) -> add_product_service::AddProductServiceObj;
|
fn add_product(&self) -> AddProductServiceObj;
|
||||||
fn add_customization(&self) -> add_customization_service::AddCustomizationServiceObj;
|
fn add_customization(&self) -> AddCustomizationServiceObj;
|
||||||
fn update_product(&self) -> update_product_service::UpdateProductServiceObj;
|
fn update_product(&self) -> UpdateProductServiceObj;
|
||||||
fn update_customization(&self) -> update_customization_service::UpdateCustomizationServiceObj;
|
fn update_customization(&self) -> UpdateCustomizationServiceObj;
|
||||||
fn update_category(&self) -> update_category_service::UpdateCategoryServiceObj;
|
fn update_category(&self) -> UpdateCategoryServiceObj;
|
||||||
fn update_store(&self) -> update_store_service::UpdateStoreServiceObj;
|
fn update_store(&self) -> UpdateStoreServiceObj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub type InventoryServicesObj = Arc<dyn InventoryServicesInterface>;
|
||||||
|
|
||||||
#[derive(Clone, Builder)]
|
#[derive(Clone, Builder)]
|
||||||
pub struct InventoryServices {
|
pub struct InventoryServices {
|
||||||
add_store: add_store_service::AddStoreServiceObj,
|
add_store: AddStoreServiceObj,
|
||||||
add_category: add_category_service::AddCategoryServiceObj,
|
add_category: AddCategoryServiceObj,
|
||||||
add_product: add_product_service::AddProductServiceObj,
|
add_product: AddProductServiceObj,
|
||||||
add_customization: add_customization_service::AddCustomizationServiceObj,
|
add_customization: AddCustomizationServiceObj,
|
||||||
update_product: update_product_service::UpdateProductServiceObj,
|
update_product: UpdateProductServiceObj,
|
||||||
update_customization: update_customization_service::UpdateCustomizationServiceObj,
|
update_customization: UpdateCustomizationServiceObj,
|
||||||
update_category: update_category_service::UpdateCategoryServiceObj,
|
update_category: UpdateCategoryServiceObj,
|
||||||
update_store: update_store_service::UpdateStoreServiceObj,
|
update_store: UpdateStoreServiceObj,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl InventoryServicesInterface for InventoryServices {
|
impl InventoryServicesInterface for InventoryServices {
|
||||||
fn add_store(&self) -> add_store_service::AddStoreServiceObj {
|
fn add_store(&self) -> AddStoreServiceObj {
|
||||||
self.add_store.clone()
|
self.add_store.clone()
|
||||||
}
|
}
|
||||||
fn add_category(&self) -> add_category_service::AddCategoryServiceObj {
|
fn add_category(&self) -> AddCategoryServiceObj {
|
||||||
self.add_category.clone()
|
self.add_category.clone()
|
||||||
}
|
}
|
||||||
fn add_product(&self) -> add_product_service::AddProductServiceObj {
|
fn add_product(&self) -> AddProductServiceObj {
|
||||||
self.add_product.clone()
|
self.add_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_product(&self) -> update_product_service::UpdateProductServiceObj {
|
fn update_product(&self) -> UpdateProductServiceObj {
|
||||||
self.update_product.clone()
|
self.update_product.clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update_customization(&self) -> update_customization_service::UpdateCustomizationServiceObj {
|
fn update_customization(&self) -> UpdateCustomizationServiceObj {
|
||||||
self.update_customization.clone()
|
self.update_customization.clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update_category(&self) -> update_category_service::UpdateCategoryServiceObj {
|
fn update_category(&self) -> UpdateCategoryServiceObj {
|
||||||
self.update_category.clone()
|
self.update_category.clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update_store(&self) -> update_store_service::UpdateStoreServiceObj {
|
fn update_store(&self) -> UpdateStoreServiceObj {
|
||||||
self.update_store.clone()
|
self.update_store.clone()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl InventoryServices {
|
||||||
|
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_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,
|
||||||
|
// out_fts_update_product: updateproduct
|
||||||
|
) -> InventoryServicesObj {
|
||||||
|
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_store,
|
||||||
|
add_category,
|
||||||
|
add_product,
|
||||||
|
add_customization,
|
||||||
|
update_product,
|
||||||
|
update_customization,
|
||||||
|
update_category,
|
||||||
|
update_store,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use crate::tests::bdd::IS_NEVER_CALLED;
|
||||||
|
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn inventory_services_work() {
|
||||||
|
let s = InventoryServices::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_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),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue