diff --git a/src/identity/adapters/mod.rs b/src/identity/adapters/mod.rs index c325d4d..a337b8f 100644 --- a/src/identity/adapters/mod.rs +++ b/src/identity/adapters/mod.rs @@ -2,5 +2,96 @@ // // 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::identity::{ + application::{ + services::{IdentityServices, IdentityServicesObj}, + }, + domain::{aggregate::User, employee_aggregate::Employee, store_aggregate::Store}, +}; +use crate::settings::Settings; +use output::{ + db::postgres::{employee_view, store_view, user_view, DBOutPostgresAdapter}, + mailer::lettre::LettreMailer, + phone::twilio::Phone, +}; + mod input; pub mod output; +mod types; + +pub fn load_adapters(pool: PgPool, settings: Settings) -> impl FnOnce(&mut web::ServiceConfig) { + // init DB + let db = DBOutPostgresAdapter::new(pool.clone()); + let mailer = LettreMailer::new(&settings); + let phone = Phone::new(&settings); + + let services: IdentityServicesObj = IdentityServices::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(db.clone()), + Arc::new(db.clone()), + Arc::new(db.clone()), + Arc::new(db.clone()), + Arc::new(db.clone()), + Arc::new(mailer.clone()), + Arc::new(phone.clone()), + Arc::new(phone.clone()), + crate::utils::uuid::GenerateUUID::new(), + crate::utils::random_string::GenerateRandomString::new(), + crate::utils::random_number::GenerateRandomNumber::new(), + ); + + let (user_cqrs_exec, user_cqrs_query) = user_view::init_cqrs(db.clone(), services.clone()); + let (store_cqrs_exec, store_cqrs_query) = store_view::init_cqrs(db.clone(), services.clone()); + let (employee_cqrs_exec, employee_cqrs_query) = + employee_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(user_cqrs_exec.clone())); + cfg.app_data(Data::new(user_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(employee_cqrs_exec.clone())); + cfg.app_data(Data::new(employee_cqrs_query.clone())); + }; + + Box::new(f) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::db::migrate::*; + + #[actix_rt::test] + async fn identity_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/identity/adapters/types.rs b/src/identity/adapters/types.rs index 3895547..e1b85ab 100644 --- a/src/identity/adapters/types.rs +++ b/src/identity/adapters/types.rs @@ -12,7 +12,7 @@ use postgres_es::PostgresCqrs; use crate::identity::{ adapters::{ - // input::web::RoutesRepository, + input::web::RoutesRepository, output::db::postgres::{ employee_view::EmployeeView, store_view::StoreView, user_view::UserView, DBOutPostgresAdapter, @@ -21,8 +21,8 @@ use crate::identity::{ application::services::{errors::IdentityError, IdentityCommand, IdentityServicesObj}, domain::{aggregate::User, employee_aggregate::Employee, store_aggregate::Store}, }; -// -////pub type WebIdentityRoutesRepository = Data>; + +pub type WebIdentityRoutesRepository = Data>; pub type IdentityUserCqrsExec = Arc>; pub type IdentityUserCqrsView = Arc>; diff --git a/src/identity/application/services/mod.rs b/src/identity/application/services/mod.rs index d468359..d11ba06 100644 --- a/src/identity/application/services/mod.rs +++ b/src/identity/application/services/mod.rs @@ -1,6 +1,8 @@ +use std::hash::RandomState; // SPDX-FileCopyrightText: 2024 Aravinth Manivannan // // SPDX-License-Identifier: AGPL-3.0-or-later +use std::sync::Arc; use derive_builder::Builder; use mockall::predicate::*; @@ -8,7 +10,7 @@ use mockall::*; use serde::{Deserialize, Serialize}; pub mod delete_user; -pub mod employee_accept_invite_service; +//pub mod employee_accept_invite_service; pub mod employee_exit_organization_service; pub mod employee_login_service; pub mod employee_register_service; @@ -25,10 +27,46 @@ pub mod set_user_admin; pub mod update_email; pub mod update_password; +pub mod add_store_service; +pub mod update_store_service; + +use add_store_service::*; +use delete_user::{service::*, *}; +//use employee_accept_invite_service::*; +use employee_exit_organization_service::*; +use employee_login_service::*; +use employee_register_service::*; +use employee_resend_login_otp_service::*; +use employee_resend_verification_otp_service::*; +use employee_verify_phone_number_service::*; +use login::{service::*, *}; +use mark_user_verified::{service::*, *}; +use register_user::{service::*, *}; +use resend_verification_email::{service::*, *}; +use set_user_admin::{service::*, *}; +use update_email::{service::*, *}; +use update_password::{service::*, *}; +use update_store_service::*; + +use errors::*; +use events::*; + use crate::identity::domain::{ - accept_invite_command::*, change_phone_number_command::*, employee_login_command::*, - employee_register_command::*, exit_organization_command::*, resend_login_otp_command::*, - resend_verification_otp_command::*, verify_phone_number_command::*, + // accept_invite_command::*, + add_store_command::*, + change_phone_number_command::*, + employee_login_command::*, + employee_register_command::*, + exit_organization_command::*, + resend_login_otp_command::*, + resend_verification_otp_command::*, + update_store_command::*, + verify_phone_number_command::*, +}; +use crate::utils::{ + random_number::{self, *}, + random_string::*, + uuid::*, }; use delete_user::command::*; use login::command::*; @@ -39,6 +77,18 @@ use set_user_admin::command::*; use update_email::command::*; use update_password::command::*; +use crate::identity::application::port::output::{ + db::{ + create_login_otp::*, create_verification_otp::*, create_verification_secret::*, + delete_login_otp::*, delete_verification_otp::*, delete_verification_secret::*, + email_exists::*, emp_id_exists::*, get_emp_id_from_phone_number::*, get_login_otp::*, + get_verification_otp::*, get_verification_secret::*, phone_exists::*, store_id_exists::*, + store_name_exists::*, user_id_exists::*, verification_secret_exists::*, + }, + mailer::account_validation_link::*, + phone::{account_login_otp::*, account_validation_otp::*}, +}; + #[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq, Ord, PartialOrd)] pub enum IdentityCommand { RegisterUser(RegisterUserCommand), @@ -57,125 +107,348 @@ pub enum IdentityCommand { EmployeeVerifyPhoneNumber(VerifyPhoneNumberCommand), EmployeeResendVerificationOTP(ResendVerificationOTPCommand), EmployeeChangePhoneNumber(ChangePhoneNumberCommand), - EmployeeAcceptInvite(AcceptInviteCommand), + // EmployeeAcceptInvite(AcceptInviteCommand), EmployeeExitOrganization(ExitOrganizationCommand), + + AddStore(AddStoreCommand), + UpdateStore(UpdateStoreCommand), } #[automock] pub trait IdentityServicesInterface: Send + Sync { - fn delete_user(&self) -> delete_user::DeleteUserServiceObj; - fn login(&self) -> login::LoginServiceObj; - fn mark_user_verified(&self) -> mark_user_verified::MarkUserVerifiedServiceObj; - fn register_user(&self) -> register_user::RegisterUserServiceObj; - fn resend_verification_email( - &self, - ) -> resend_verification_email::ResendVerificationEmailServiceObj; - fn set_user_admin(&self) -> set_user_admin::SetUserAdminServiceObj; - fn update_email(&self) -> update_email::UpdateEmailServiceObj; - fn update_password(&self) -> update_password::UpdatePasswordServiceObj; + fn delete_user(&self) -> DeleteUserServiceObj; + fn login(&self) -> LoginServiceObj; + fn mark_user_verified(&self) -> MarkUserVerifiedServiceObj; + fn register_user(&self) -> RegisterUserServiceObj; + fn resend_verification_email(&self) -> ResendVerificationEmailServiceObj; + fn set_user_admin(&self) -> SetUserAdminServiceObj; + fn update_email(&self) -> UpdateEmailServiceObj; + fn update_password(&self) -> UpdatePasswordServiceObj; // employee - fn employee_accept_invite_service( - &self, - ) -> employee_accept_invite_service::EmployeeAcceptInviteServiceObj; - fn employee_exit_organization_service( - &self, - ) -> employee_exit_organization_service::EmployeeExitOrganizationServiceObj; - fn employee_login_service(&self) -> employee_login_service::EmployeeLoginServiceObj; - fn employee_register_service(&self) -> employee_register_service::EmployeeRegisterServiceObj; - fn employee_resend_login_otp_service( - &self, - ) -> employee_resend_login_otp_service::EmployeeResendLoginOTPServiceObj; - fn employee_resend_verification_otp_service( - &self, - ) -> employee_resend_verification_otp_service::EmployeeResendVerificationOTPServiceObj; - fn employee_verify_phone_number_service( - &self, - ) -> employee_verify_phone_number_service::EmployeeVerifyPhoneNumberServiceObj; + // fn employee_accept_invite_service(&self) -> EmployeeAcceptInviteServiceObj; + fn employee_exit_organization_service(&self) -> EmployeeExitOrganizationServiceObj; + fn employee_login_service(&self) -> EmployeeLoginServiceObj; + fn employee_register_service(&self) -> EmployeeRegisterServiceObj; + fn employee_resend_login_otp_service(&self) -> EmployeeResendLoginOTPServiceObj; + fn employee_resend_verification_otp_service(&self) -> EmployeeResendVerificationOTPServiceObj; + fn employee_verify_phone_number_service(&self) -> EmployeeVerifyPhoneNumberServiceObj; + + // store + fn add_store(&self) -> AddStoreServiceObj; + fn update_store(&self) -> UpdateStoreServiceObj; } +pub type IdentityServicesObj = Arc; + #[derive(Clone, Builder)] pub struct IdentityServices { - delete_user: delete_user::DeleteUserServiceObj, - login: login::LoginServiceObj, - mark_user_verified: mark_user_verified::MarkUserVerifiedServiceObj, - register_user: register_user::RegisterUserServiceObj, - resend_verification_email: resend_verification_email::ResendVerificationEmailServiceObj, - set_user_admin: set_user_admin::SetUserAdminServiceObj, - update_email: update_email::UpdateEmailServiceObj, - update_password: update_password::UpdatePasswordServiceObj, + delete_user: DeleteUserServiceObj, + login: LoginServiceObj, + mark_user_verified: MarkUserVerifiedServiceObj, + register_user: RegisterUserServiceObj, + resend_verification_email: ResendVerificationEmailServiceObj, + set_user_admin: SetUserAdminServiceObj, + update_email: UpdateEmailServiceObj, + update_password: UpdatePasswordServiceObj, - employee_accept_invite_service: employee_accept_invite_service::EmployeeAcceptInviteServiceObj, - employee_exit_organization_service: - employee_exit_organization_service::EmployeeExitOrganizationServiceObj, - employee_login_service: employee_login_service::EmployeeLoginServiceObj, - employee_register_service: employee_register_service::EmployeeRegisterServiceObj, - employee_resend_login_otp_service: - employee_resend_login_otp_service::EmployeeResendLoginOTPServiceObj, - employee_resend_verification_otp_service: - employee_resend_verification_otp_service::EmployeeResendVerificationOTPServiceObj, - employee_verify_phone_number_service: - employee_verify_phone_number_service::EmployeeVerifyPhoneNumberServiceObj, + // employee_accept_invite_service: EmployeeAcceptInviteServiceObj, + employee_exit_organization_service: EmployeeExitOrganizationServiceObj, + employee_login_service: EmployeeLoginServiceObj, + employee_register_service: EmployeeRegisterServiceObj, + employee_resend_login_otp_service: EmployeeResendLoginOTPServiceObj, + employee_resend_verification_otp_service: EmployeeResendVerificationOTPServiceObj, + employee_verify_phone_number_service: EmployeeVerifyPhoneNumberServiceObj, + + add_store: AddStoreServiceObj, + update_store: UpdateStoreServiceObj, } impl IdentityServicesInterface for IdentityServices { - fn delete_user(&self) -> delete_user::DeleteUserServiceObj { + fn delete_user(&self) -> DeleteUserServiceObj { self.delete_user.clone() } - fn login(&self) -> login::LoginServiceObj { + fn login(&self) -> LoginServiceObj { self.login.clone() } - fn mark_user_verified(&self) -> mark_user_verified::MarkUserVerifiedServiceObj { + fn mark_user_verified(&self) -> MarkUserVerifiedServiceObj { self.mark_user_verified.clone() } - fn register_user(&self) -> register_user::RegisterUserServiceObj { + fn register_user(&self) -> RegisterUserServiceObj { self.register_user.clone() } - fn resend_verification_email( - &self, - ) -> resend_verification_email::ResendVerificationEmailServiceObj { + fn resend_verification_email(&self) -> ResendVerificationEmailServiceObj { self.resend_verification_email.clone() } - fn set_user_admin(&self) -> set_user_admin::SetUserAdminServiceObj { + fn set_user_admin(&self) -> SetUserAdminServiceObj { self.set_user_admin.clone() } - fn update_email(&self) -> update_email::UpdateEmailServiceObj { + fn update_email(&self) -> UpdateEmailServiceObj { self.update_email.clone() } - fn update_password(&self) -> update_password::UpdatePasswordServiceObj { + fn update_password(&self) -> UpdatePasswordServiceObj { self.update_password.clone() } // employee - fn employee_accept_invite_service( - &self, - ) -> employee_accept_invite_service::EmployeeAcceptInviteServiceObj { - self.employee_accept_invite_service.clone() - } - fn employee_exit_organization_service( - &self, - ) -> employee_exit_organization_service::EmployeeExitOrganizationServiceObj { + // fn employee_accept_invite_service(&self) -> EmployeeAcceptInviteServiceObj { + // self.employee_accept_invite_service.clone() + // } + fn employee_exit_organization_service(&self) -> EmployeeExitOrganizationServiceObj { self.employee_exit_organization_service.clone() } - fn employee_login_service(&self) -> employee_login_service::EmployeeLoginServiceObj { + fn employee_login_service(&self) -> EmployeeLoginServiceObj { self.employee_login_service.clone() } - fn employee_register_service(&self) -> employee_register_service::EmployeeRegisterServiceObj { + fn employee_register_service(&self) -> EmployeeRegisterServiceObj { self.employee_register_service.clone() } - fn employee_resend_login_otp_service( - &self, - ) -> employee_resend_login_otp_service::EmployeeResendLoginOTPServiceObj { + fn employee_resend_login_otp_service(&self) -> EmployeeResendLoginOTPServiceObj { self.employee_resend_login_otp_service.clone() } - fn employee_resend_verification_otp_service( - &self, - ) -> employee_resend_verification_otp_service::EmployeeResendVerificationOTPServiceObj { + fn employee_resend_verification_otp_service(&self) -> EmployeeResendVerificationOTPServiceObj { self.employee_resend_verification_otp_service.clone() } - fn employee_verify_phone_number_service( - &self, - ) -> employee_verify_phone_number_service::EmployeeVerifyPhoneNumberServiceObj { + fn employee_verify_phone_number_service(&self) -> EmployeeVerifyPhoneNumberServiceObj { self.employee_verify_phone_number_service.clone() } + + fn add_store(&self) -> AddStoreServiceObj { + self.add_store.clone() + } + fn update_store(&self) -> UpdateStoreServiceObj { + self.update_store.clone() + } +} + +impl IdentityServices { + pub fn new( + out_db_create_login_otp: CreateLoginOTPOutDBPortObj, + out_db_create_verification_otp: CreateVerificationOTPOutDBPortObj, + out_db_create_verification_secret: CreateVerificationSecretOutDBPortObj, + out_db_delete_login_otp: DeleteLoginOTPOutDBPortObj, + out_db_delete_verification_otp: DeleteVerificationOTPOutDBPortObj, + out_db_delete_verification_secret: DeleteVerificationSecretOutDBPortObj, + out_db_email_exists: EmailExistsOutDBPortObj, + out_db_emp_id_exists: EmpIDExistsOutDBPortObj, + out_db_get_emp_id_from_phone_number: GetEmpIDFromPhoneNumberOutDBPortObj, + out_db_get_login_otp: GetLoginOTPOutDBPortObj, + out_db_get_verification_otp: GetVerificationOTPOutDBPortObj, + out_db_get_verification_secret: GetVerificationSecretOutDBPortObj, + out_db_phone_exists: PhoneNumberExistsOutDBPortObj, + out_db_store_id_exists: StoreIDExistsDBPortObj, + out_db_store_name_exists: StoreNameExistsDBPortObj, + out_db_user_id_exists: UserIDExistsOutDBPortObj, + out_db_verification_secret_exists: VerificationSecretExistsOutDBPortObj, + + out_mailer_account_validating_link: AccountValidationLinkOutMailerPortObj, + + out_phone_account_validation_otp: AccountValidationOTPOutPhonePortObj, + out_phone_account_login_otp: AccountLoginOTPOutPhonePortObj, + + get_uuid: GetUUIDInterfaceObj, + random_string: GenerateRandomStringInterfaceObj, + random_number: GenerateRandomNumberInterfaceObj, + ) -> IdentityServicesObj { + let delete_user: DeleteUserServiceObj = Arc::new(DeleteUserService); + let login: LoginServiceObj = Arc::new(LoginService {}); + + let mark_user_verified: MarkUserVerifiedServiceObj = Arc::new( + MarkUserVerifiedServiceBuilder::default() + .db_verification_secret_exists_adapter(out_db_verification_secret_exists.clone()) + .db_delete_verification_secret_adapter(out_db_delete_verification_secret.clone()) + .build() + .unwrap(), + ); + let register_user: RegisterUserServiceObj = Arc::new( + RegisterUserServiceBuilder::default() + .db_email_exists_adapter(out_db_email_exists.clone()) + .db_user_id_exists_adapter(out_db_user_id_exists.clone()) + .db_create_verification_secret_adapter(out_db_create_verification_secret.clone()) + .mailer_account_validation_link_adapter(out_mailer_account_validating_link.clone()) + .get_uuid(get_uuid.clone()) + .random_string_adapter(random_string.clone()) + .build() + .unwrap(), + ); + + let resend_verification_email: ResendVerificationEmailServiceObj = Arc::new( + ResendVerificationEmailServiceBuilder::default() + .db_email_exists_adapter(out_db_email_exists.clone()) + .db_get_verification_secret_adapter(out_db_get_verification_secret.clone()) + .mailer_account_validation_link_adapter(out_mailer_account_validating_link.clone()) + .build() + .unwrap(), + ); + + let set_user_admin: SetUserAdminServiceObj = Arc::new(SetUserAdminService); + + let update_email: UpdateEmailServiceObj = Arc::new( + UpdateEmailServiceBuilder::default() + .db_email_exists_adapter(out_db_email_exists.clone()) + .db_create_verification_secret_adapter(out_db_create_verification_secret.clone()) + .mailer_account_validation_link_adapter(out_mailer_account_validating_link.clone()) + .random_string_adapter(random_string.clone()) + .build() + .unwrap(), + ); + + let update_password: UpdatePasswordServiceObj = Arc::new(UpdatePasswordService); + + // let employee_accept_invite_service: EmployeeAcceptInviteServiceObj = Arc::new( + // EmployeeAcceptInviteServiceBuilder::default() + // .db_get_invite_adapter(unimplemented!()) + // .db_emp_id_exists_adapter(out_db_emp_id_exists.clone()) + // .build() + // .unwrap(), + // ); + let employee_exit_organization_service: EmployeeExitOrganizationServiceObj = Arc::new( + EmployeeExitOrganizationServiceBuilder::default() + .db_emp_id_exists_adapter(out_db_emp_id_exists.clone()) + .db_store_id_exists_adapter(out_db_store_id_exists.clone()) + .build() + .unwrap(), + ); + + let employee_login_service: EmployeeLoginServiceObj = Arc::new( + EmployeeLoginServiceBuilder::default() + .db_phone_exists_adapter(out_db_phone_exists.clone()) + .db_get_emp_id_from_phone_number_adapter( + out_db_get_emp_id_from_phone_number.clone(), + ) + .db_create_login_otp_adapter(out_db_create_login_otp.clone()) + .db_delete_login_otp(out_db_delete_login_otp.clone()) + .db_get_login_otp(out_db_get_login_otp.clone()) + .random_number_adapter(random_number.clone()) + .phone_login_otp_adapter(out_phone_account_login_otp.clone()) + .build() + .unwrap(), + ); + + let employee_register_service: EmployeeRegisterServiceObj = Arc::new( + EmployeeRegisterUserServiceBuilder::default() + .db_phone_exists_adapter(out_db_phone_exists.clone()) + .db_emp_id_exists_adapter(out_db_emp_id_exists.clone()) + .db_create_verification_otp_adapter(out_db_create_verification_otp.clone()) + .phone_account_validation_otp_adapter(out_phone_account_validation_otp.clone()) + .random_number_adapter(random_number.clone()) + .build() + .unwrap(), + ); + + let employee_resend_login_otp_service: EmployeeResendLoginOTPServiceObj = Arc::new( + EmployeeResendLoginOTPServiceBuilder::default() + .db_phone_exists_adapter(out_db_phone_exists.clone()) + .db_get_emp_id_from_phone_number_adapter( + out_db_get_emp_id_from_phone_number.clone(), + ) + .db_get_login_otp(out_db_get_login_otp.clone()) + .phone_login_otp_adapter(out_phone_account_login_otp.clone()) + .build() + .unwrap(), + ); + + let employee_resend_verification_otp_service: EmployeeResendVerificationOTPServiceObj = + Arc::new( + EmployeeResendVerificationOTPServiceBuilder::default() + .db_phone_exists_adapter(out_db_phone_exists.clone()) + .db_get_emp_id_from_phone_number_adapter( + out_db_get_emp_id_from_phone_number.clone(), + ) + .db_get_verification_otp(out_db_get_verification_otp.clone()) + .phone_account_validation_otp_adapter(out_phone_account_validation_otp.clone()) + .build() + .unwrap(), + ); + + let employee_verify_phone_number_service: EmployeeVerifyPhoneNumberServiceObj = Arc::new( + EmployeeVerifyPhoneNumberServiceBuilder::default() + .db_get_emp_id_from_phone_number_adapter( + out_db_get_emp_id_from_phone_number.clone(), + ) + .db_delete_verification_otp(out_db_delete_verification_otp.clone()) + .db_get_verification_otp(out_db_get_verification_otp.clone()) + .build() + .unwrap(), + ); + + let add_store: AddStoreServiceObj = 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 update_store: UpdateStoreServiceObj = 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 { + delete_user, + login, + mark_user_verified, + register_user, + resend_verification_email, + set_user_admin, + update_email, + update_password, + + // employee_accept_invite_service, + employee_exit_organization_service, + employee_login_service, + employee_register_service, + employee_resend_login_otp_service, + employee_resend_verification_otp_service, + employee_verify_phone_number_service, + + add_store, + update_store, + }) + } +} + +#[cfg(test)] +mod tests { + use random_number::tests::mock_generate_random_number; + + use crate::{ + tests::bdd::IS_NEVER_CALLED, + utils::{random_string::tests::mock_generate_random_string, uuid::tests::mock_get_uuid}, + }; + + use super::*; + + #[test] + fn services_init_works() { + let s = IdentityServices::new( + mock_create_login_otp_db_port(IS_NEVER_CALLED), + mock_create_verification_otp_db_port(IS_NEVER_CALLED), + mock_create_verification_secret_db_port(IS_NEVER_CALLED), + mock_delete_login_otp_db_port(IS_NEVER_CALLED), + mock_delete_verification_otp_db_port(IS_NEVER_CALLED), + mock_delete_verification_secret_db_port(IS_NEVER_CALLED), + mock_email_exists_db_port(IS_NEVER_CALLED, false), + mock_emp_id_exists_db_port(IS_NEVER_CALLED, false), + mock_get_emp_id_from_phone_number_db_port(IS_NEVER_CALLED), + mock_get_login_otp_db_port(IS_NEVER_CALLED), + mock_get_verification_otp_db_port(IS_NEVER_CALLED), + mock_get_verification_secret_db_port(IS_NEVER_CALLED, "".into()), + mock_phone_exists_db_port(IS_NEVER_CALLED, false), + mock_store_id_exists_db_port_true(IS_NEVER_CALLED), + mock_store_name_exists_db_port_true(IS_NEVER_CALLED), + mock_user_id_exists_db_port(IS_NEVER_CALLED, false), + mock_verification_secret_exists_db_port(IS_NEVER_CALLED, false), + mock_account_validation_link_mailer_port(IS_NEVER_CALLED), + mock_account_validation_otp_phone_port(IS_NEVER_CALLED), + mock_account_login_otp_phone_port(IS_NEVER_CALLED), + mock_get_uuid(IS_NEVER_CALLED), + mock_generate_random_string(IS_NEVER_CALLED, "".into()), + mock_generate_random_number(IS_NEVER_CALLED, 0), + ); + } } diff --git a/src/identity/mod.rs b/src/identity/mod.rs index 7272406..10dac6e 100644 --- a/src/identity/mod.rs +++ b/src/identity/mod.rs @@ -2,6 +2,6 @@ // // SPDX-License-Identifier: AGPL-3.0-or-later -mod adapters; +pub(crate) mod adapters; mod application; mod domain; diff --git a/src/main.rs b/src/main.rs index 6ed9eb3..6ee53c1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -62,6 +62,14 @@ async fn main() { db.pool.clone(), settings.clone(), )) + .configure(identity::adapters::load_adapters( + db.pool.clone(), + settings.clone(), + )) + .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())