diff --git a/src/ordering/adapters/mod.rs b/src/ordering/adapters/mod.rs index 9b25f58..c6bf8cf 100644 --- a/src/ordering/adapters/mod.rs +++ b/src/ordering/adapters/mod.rs @@ -2,5 +2,99 @@ // // 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::ordering::application::services::{OrderingServices, OrderingServicesObj}; +use crate::settings::Settings; +use output::{ + db::{ + category_view, customization_view, kot_view, line_item_view, order_view, product_view, + store_view, OrderingDBPostgresAdapter, + }, + full_text_search::meili::OrderingFTSMeili, +}; + mod input; -mod output; +pub mod output; +mod types; + +pub fn load_adapters(pool: PgPool, settings: Settings) -> impl FnOnce(&mut web::ServiceConfig) { + let db = OrderingDBPostgresAdapter::new(pool.clone()); + let fts = OrderingFTSMeili::new(&settings.meili.url, &settings.meili.api_key); + + let services: OrderingServicesObj = OrderingServices::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(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 (kot_cqrs_exec, kot_cqrs_query) = kot_view::init_cqrs(db.clone(), services.clone()); + let (line_item_cqrs_exec, line_item_cqrs_query) = + line_item_view::init_cqrs(db.clone(), services.clone()); + let (order_cqrs_exec, order_cqrs_query) = order_view::init_cqrs(db.clone(), services.clone()); + let ordering_cqrs_exec = types::WebOrderingCqrsExec::new(Arc::new( + types::OrderingCqrsExecBuilder::default() + .category(category_cqrs_exec) + .product(product_cqrs_exec) + .customization(customization_cqrs_exec) + .store(store_cqrs_exec) + .kot(kot_cqrs_exec) + .line_item(line_item_cqrs_exec) + .order(order_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(Data::new(kot_cqrs_query.clone())); + cfg.app_data(Data::new(line_item_cqrs_query.clone())); + cfg.app_data(Data::new(order_cqrs_query.clone())); + cfg.app_data(ordering_cqrs_exec.clone()); + }; + + Box::new(f) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::db::migrate::*; + + #[actix_rt::test] + async fn ordering_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/ordering/mod.rs b/src/ordering/mod.rs index 7272406..e311feb 100644 --- a/src/ordering/mod.rs +++ b/src/ordering/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 6d3d6c4..03e1287 100644 --- a/src/utils/load_adapters.rs +++ b/src/utils/load_adapters.rs @@ -20,6 +20,10 @@ pub fn load_adapters(pool: PgPool, settings: Settings) -> impl FnOnce(&mut web:: pool.clone(), settings.clone(), )) + .configure(crate::ordering::adapters::load_adapters( + pool.clone(), + settings.clone(), + )) .configure(super::random_string::GenerateRandomString::inject()) .configure(super::uuid::GenerateUUID::inject()); };