From f8870594ceb34737624696774f1156f6671b4cc8 Mon Sep 17 00:00:00 2001 From: Aravinth Manivannan Date: Wed, 18 Dec 2024 18:12:48 +0530 Subject: [PATCH] feat: load billing adapters --- src/billing/adapters/mod.rs | 81 +++++++++++++++++++++++++++ src/billing/adapters/output/db/mod.rs | 2 +- src/main.rs | 4 ++ 3 files changed, 86 insertions(+), 1 deletion(-) diff --git a/src/billing/adapters/mod.rs b/src/billing/adapters/mod.rs index 9b25f58..e453b2d 100644 --- a/src/billing/adapters/mod.rs +++ b/src/billing/adapters/mod.rs @@ -1,6 +1,87 @@ // SPDX-FileCopyrightText: 2024 Aravinth Manivannan // // 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::billing::{ + application::{ + port::output::db::{ + bill_id_exists::BillIDExistsDBPortObj, + get_line_items_for_bill_id::GetLineItemsForBillIDDBPortObj, + line_item_id_exists::LineItemIDExistsDBPortObj, next_token_id::NextTokenIDDBPortObj, + store_id_exists::StoreIDExistsDBPortObj, store_name_exists::StoreNameExistsDBPortObj, + }, + services::{BillingServices, BillingServicesObj}, + }, + domain::{bill_aggregate::Bill, line_item_aggregate::LineItem, store_aggregate::Store}, +}; +use crate::settings::Settings; +use output::db::postgres::{bill_view, line_item_view, store_view, BillingDBPostgresAdapter}; mod input; mod output; +mod types; + +pub fn load_adapters(pool: PgPool, settings: Settings) -> impl FnOnce(&mut web::ServiceConfig) { + // init DB + let db = BillingDBPostgresAdapter::new(pool.clone()); + let db_bill_id_exists: BillIDExistsDBPortObj = Arc::new(db.clone()); + let db_line_item_id_exists: LineItemIDExistsDBPortObj = Arc::new(db.clone()); + let db_store_id_exists: StoreIDExistsDBPortObj = Arc::new(db.clone()); + let db_store_name_exists: StoreNameExistsDBPortObj = Arc::new(db.clone()); + let db_get_line_items_for_bill_id: GetLineItemsForBillIDDBPortObj = Arc::new(db.clone()); + let db_next_token_id: NextTokenIDDBPortObj = Arc::new(db.clone()); + + // init services + + let services: BillingServicesObj = Arc::new(BillingServices::new( + db_bill_id_exists.clone(), + db_line_item_id_exists.clone(), + db_store_id_exists.clone(), + db_store_name_exists.clone(), + db_get_line_items_for_bill_id.clone(), + db_next_token_id.clone(), + )); + + let (bill_cqrs_exec, bill_cqrs_query) = bill_view::init_cqrs(db.clone(), services.clone()); + let (store_cqrs_exec, store_cqrs_query) = store_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 f = move |cfg: &mut web::ServiceConfig| { + cfg.configure(input::web::load_ctx()); + + cfg.app_data(Data::new(bill_cqrs_exec.clone())); + cfg.app_data(Data::new(bill_cqrs_query.clone())); + + cfg.app_data(Data::new(store_cqrs_exec.clone())); + cfg.app_data(Data::new(store_cqrs_query.clone())); + + cfg.app_data(Data::new(line_item_cqrs_exec.clone())); + cfg.app_data(Data::new(line_item_cqrs_query.clone())); + }; + + Box::new(f) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::db::migrate::*; + + #[actix_rt::test] + async fn billing_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/billing/adapters/output/db/mod.rs b/src/billing/adapters/output/db/mod.rs index efa3961..0378461 100644 --- a/src/billing/adapters/output/db/mod.rs +++ b/src/billing/adapters/output/db/mod.rs @@ -1,4 +1,4 @@ // SPDX-FileCopyrightText: 2024 Aravinth Manivannan // // SPDX-License-Identifier: AGPL-3.0-or-later -mod postgres; +pub(crate) mod postgres; diff --git a/src/main.rs b/src/main.rs index d595908..6ed9eb3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -58,6 +58,10 @@ async fn main() { .wrap( middleware::DefaultHeaders::new().add(("Permissions-Policy", "interest-cohort=()")), ) + .configure(billing::adapters::load_adapters( + db.pool.clone(), + settings.clone(), + )) // .configure(auth::adapter::load_adapters(db.pool.clone(), &settings)) .configure(utils::random_string::GenerateRandomString::inject()) .configure(utils::uuid::GenerateUUID::inject())