feat: load billing adapters

This commit is contained in:
Aravinth Manivannan 2024-12-18 18:12:48 +05:30
parent 8410f27738
commit f8870594ce
Signed by: realaravinth
GPG key ID: F8F50389936984FF
3 changed files with 86 additions and 1 deletions

View file

@ -1,6 +1,87 @@
// SPDX-FileCopyrightText: 2024 Aravinth Manivannan <realaravinth@batsense.net>
//
// 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());
}
}

View file

@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2024 Aravinth Manivannan <realaravinth@batsense.net>
//
// SPDX-License-Identifier: AGPL-3.0-or-later
mod postgres;
pub(crate) mod postgres;

View file

@ -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())