diff --git a/src/inventory/adapters/mod.rs b/src/inventory/adapters/mod.rs index 9b25f58..622ecf3 100644 --- a/src/inventory/adapters/mod.rs +++ b/src/inventory/adapters/mod.rs @@ -2,5 +2,91 @@ // // SPDX-License-Identifier: AGPL-3.0-or-later +use std::sync::Arc; + +use actix_web::web::{self, Data}; +use cqrs_es::{persist::ViewRepository, EventEnvelope, Query, View}; +use postgres_es::PostgresCqrs; +use sqlx::postgres::PgPool; + +use crate::inventory::{ + application::services::{InventoryServices, InventoryServicesObj}, + domain::{ + category_aggregate::Category, customization_aggregate::Customization, + product_aggregate::Product, store_aggregate::Store, + }, +}; +use crate::settings::Settings; +use output::{ + db::postgres::{ + category_view, customization_view, product_view, store_view, InventoryDBPostgresAdapter, + }, + full_text_search::meili::InventoryFTSMeili, +}; + mod input; -mod output; +pub mod output; +mod types; + +pub fn load_adapters(pool: PgPool, settings: Settings) -> impl FnOnce(&mut web::ServiceConfig) { + let db = InventoryDBPostgresAdapter::new(pool.clone()); + let fts = InventoryFTSMeili::new(&settings.meili.url, &settings.meili.api_key); + + let services: InventoryServicesObj = InventoryServices::new( + Arc::new(db.clone()), + Arc::new(db.clone()), + Arc::new(db.clone()), + Arc::new(db.clone()), + Arc::new(db.clone()), + Arc::new(db.clone()), + Arc::new(db.clone()), + Arc::new(db.clone()), + Arc::new(db.clone()), + Arc::new(fts.clone()), + ); + + let (category_cqrs_exec, category_cqrs_query) = + category_view::init_cqrs(db.clone(), services.clone()); + let (product_cqrs_exec, product_cqrs_query) = + product_view::init_cqrs(db.clone(), services.clone()); + let (customization_cqrs_exec, customization_cqrs_query) = + customization_view::init_cqrs(db.clone(), services.clone()); + let (store_cqrs_exec, store_cqrs_query) = store_view::init_cqrs(db.clone(), services.clone()); + let inventory_cqrs_exec = types::WebInventoryCqrsExec::new(Arc::new( + types::InventoryCqrsExecBuilder::default() + .category(category_cqrs_exec) + .product(product_cqrs_exec) + .customization(customization_cqrs_exec) + .store(store_cqrs_exec) + .build() + .unwrap(), + )); + + let f = move |cfg: &mut web::ServiceConfig| { + // cfg.configure(input::web::load_ctx()); + cfg.app_data(Data::new(category_cqrs_query.clone())); + cfg.app_data(Data::new(product_cqrs_query.clone())); + cfg.app_data(Data::new(customization_cqrs_query.clone())); + cfg.app_data(Data::new(store_cqrs_query.clone())); + cfg.app_data(inventory_cqrs_exec.clone()); + }; + + Box::new(f) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::db::migrate::*; + + #[actix_rt::test] + async fn inventory_load_adapters() { + let settings = crate::settings::tests::get_settings().await; + settings.create_db().await; + + let db = crate::db::sqlx_postgres::Postgres::init(&settings.database.url).await; + db.migrate().await; + + load_adapters(db.pool.clone(), settings.clone()); + } +} diff --git a/src/inventory/mod.rs b/src/inventory/mod.rs index 7272406..e311feb 100644 --- a/src/inventory/mod.rs +++ b/src/inventory/mod.rs @@ -2,6 +2,6 @@ // // SPDX-License-Identifier: AGPL-3.0-or-later -mod adapters; +pub mod adapters; mod application; mod domain; diff --git a/src/utils/load_adapters.rs b/src/utils/load_adapters.rs index 1fb3bd1..6d3d6c4 100644 --- a/src/utils/load_adapters.rs +++ b/src/utils/load_adapters.rs @@ -16,6 +16,10 @@ pub fn load_adapters(pool: PgPool, settings: Settings) -> impl FnOnce(&mut web:: pool.clone(), settings.clone(), )) + .configure(crate::inventory::adapters::load_adapters( + pool.clone(), + settings.clone(), + )) .configure(super::random_string::GenerateRandomString::inject()) .configure(super::uuid::GenerateUUID::inject()); };