feat: load identity adapters into actix web
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
ci/woodpecker/pr/woodpecker Pipeline failed

This commit is contained in:
Aravinth Manivannan 2025-01-09 21:01:53 +05:30
parent 82c9c6b95d
commit 104961ed76
Signed by: realaravinth
GPG key ID: F8F50389936984FF
5 changed files with 456 additions and 84 deletions

View file

@ -2,5 +2,96 @@
// //
// SPDX-License-Identifier: AGPL-3.0-or-later // 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; mod input;
pub mod output; 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());
}
}

View file

@ -12,7 +12,7 @@ use postgres_es::PostgresCqrs;
use crate::identity::{ use crate::identity::{
adapters::{ adapters::{
// input::web::RoutesRepository, input::web::RoutesRepository,
output::db::postgres::{ output::db::postgres::{
employee_view::EmployeeView, store_view::StoreView, user_view::UserView, employee_view::EmployeeView, store_view::StoreView, user_view::UserView,
DBOutPostgresAdapter, DBOutPostgresAdapter,
@ -21,8 +21,8 @@ use crate::identity::{
application::services::{errors::IdentityError, IdentityCommand, IdentityServicesObj}, application::services::{errors::IdentityError, IdentityCommand, IdentityServicesObj},
domain::{aggregate::User, employee_aggregate::Employee, store_aggregate::Store}, domain::{aggregate::User, employee_aggregate::Employee, store_aggregate::Store},
}; };
//
////pub type WebIdentityRoutesRepository = Data<Arc<RoutesRegit.batspository>>; pub type WebIdentityRoutesRepository = Data<Arc<RoutesRepository>>;
pub type IdentityUserCqrsExec = Arc<PostgresCqrs<User>>; pub type IdentityUserCqrsExec = Arc<PostgresCqrs<User>>;
pub type IdentityUserCqrsView = Arc<dyn ViewRepository<UserView, User>>; pub type IdentityUserCqrsView = Arc<dyn ViewRepository<UserView, User>>;

View file

@ -1,6 +1,8 @@
use std::hash::RandomState;
// SPDX-FileCopyrightText: 2024 Aravinth Manivannan <realaravinth@batsense.net> // SPDX-FileCopyrightText: 2024 Aravinth Manivannan <realaravinth@batsense.net>
// //
// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-License-Identifier: AGPL-3.0-or-later
use std::sync::Arc;
use derive_builder::Builder; use derive_builder::Builder;
use mockall::predicate::*; use mockall::predicate::*;
@ -8,7 +10,7 @@ use mockall::*;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
pub mod delete_user; 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_exit_organization_service;
pub mod employee_login_service; pub mod employee_login_service;
pub mod employee_register_service; pub mod employee_register_service;
@ -25,10 +27,46 @@ pub mod set_user_admin;
pub mod update_email; pub mod update_email;
pub mod update_password; 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::{ use crate::identity::domain::{
accept_invite_command::*, change_phone_number_command::*, employee_login_command::*, // accept_invite_command::*,
employee_register_command::*, exit_organization_command::*, resend_login_otp_command::*, add_store_command::*,
resend_verification_otp_command::*, verify_phone_number_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 delete_user::command::*;
use login::command::*; use login::command::*;
@ -39,6 +77,18 @@ use set_user_admin::command::*;
use update_email::command::*; use update_email::command::*;
use update_password::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)] #[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq, Ord, PartialOrd)]
pub enum IdentityCommand { pub enum IdentityCommand {
RegisterUser(RegisterUserCommand), RegisterUser(RegisterUserCommand),
@ -57,125 +107,348 @@ pub enum IdentityCommand {
EmployeeVerifyPhoneNumber(VerifyPhoneNumberCommand), EmployeeVerifyPhoneNumber(VerifyPhoneNumberCommand),
EmployeeResendVerificationOTP(ResendVerificationOTPCommand), EmployeeResendVerificationOTP(ResendVerificationOTPCommand),
EmployeeChangePhoneNumber(ChangePhoneNumberCommand), EmployeeChangePhoneNumber(ChangePhoneNumberCommand),
EmployeeAcceptInvite(AcceptInviteCommand), // EmployeeAcceptInvite(AcceptInviteCommand),
EmployeeExitOrganization(ExitOrganizationCommand), EmployeeExitOrganization(ExitOrganizationCommand),
AddStore(AddStoreCommand),
UpdateStore(UpdateStoreCommand),
} }
#[automock] #[automock]
pub trait IdentityServicesInterface: Send + Sync { pub trait IdentityServicesInterface: Send + Sync {
fn delete_user(&self) -> delete_user::DeleteUserServiceObj; fn delete_user(&self) -> DeleteUserServiceObj;
fn login(&self) -> login::LoginServiceObj; fn login(&self) -> LoginServiceObj;
fn mark_user_verified(&self) -> mark_user_verified::MarkUserVerifiedServiceObj; fn mark_user_verified(&self) -> MarkUserVerifiedServiceObj;
fn register_user(&self) -> register_user::RegisterUserServiceObj; fn register_user(&self) -> RegisterUserServiceObj;
fn resend_verification_email( fn resend_verification_email(&self) -> ResendVerificationEmailServiceObj;
&self, fn set_user_admin(&self) -> SetUserAdminServiceObj;
) -> resend_verification_email::ResendVerificationEmailServiceObj; fn update_email(&self) -> UpdateEmailServiceObj;
fn set_user_admin(&self) -> set_user_admin::SetUserAdminServiceObj; fn update_password(&self) -> UpdatePasswordServiceObj;
fn update_email(&self) -> update_email::UpdateEmailServiceObj;
fn update_password(&self) -> update_password::UpdatePasswordServiceObj;
// employee // employee
fn employee_accept_invite_service( // fn employee_accept_invite_service(&self) -> EmployeeAcceptInviteServiceObj;
&self, fn employee_exit_organization_service(&self) -> EmployeeExitOrganizationServiceObj;
) -> employee_accept_invite_service::EmployeeAcceptInviteServiceObj; fn employee_login_service(&self) -> EmployeeLoginServiceObj;
fn employee_exit_organization_service( fn employee_register_service(&self) -> EmployeeRegisterServiceObj;
&self, fn employee_resend_login_otp_service(&self) -> EmployeeResendLoginOTPServiceObj;
) -> employee_exit_organization_service::EmployeeExitOrganizationServiceObj; fn employee_resend_verification_otp_service(&self) -> EmployeeResendVerificationOTPServiceObj;
fn employee_login_service(&self) -> employee_login_service::EmployeeLoginServiceObj; fn employee_verify_phone_number_service(&self) -> EmployeeVerifyPhoneNumberServiceObj;
fn employee_register_service(&self) -> employee_register_service::EmployeeRegisterServiceObj;
fn employee_resend_login_otp_service( // store
&self, fn add_store(&self) -> AddStoreServiceObj;
) -> employee_resend_login_otp_service::EmployeeResendLoginOTPServiceObj; fn update_store(&self) -> UpdateStoreServiceObj;
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;
} }
pub type IdentityServicesObj = Arc<dyn IdentityServicesInterface>;
#[derive(Clone, Builder)] #[derive(Clone, Builder)]
pub struct IdentityServices { pub struct IdentityServices {
delete_user: delete_user::DeleteUserServiceObj, delete_user: DeleteUserServiceObj,
login: login::LoginServiceObj, login: LoginServiceObj,
mark_user_verified: mark_user_verified::MarkUserVerifiedServiceObj, mark_user_verified: MarkUserVerifiedServiceObj,
register_user: register_user::RegisterUserServiceObj, register_user: RegisterUserServiceObj,
resend_verification_email: resend_verification_email::ResendVerificationEmailServiceObj, resend_verification_email: ResendVerificationEmailServiceObj,
set_user_admin: set_user_admin::SetUserAdminServiceObj, set_user_admin: SetUserAdminServiceObj,
update_email: update_email::UpdateEmailServiceObj, update_email: UpdateEmailServiceObj,
update_password: update_password::UpdatePasswordServiceObj, update_password: UpdatePasswordServiceObj,
employee_accept_invite_service: employee_accept_invite_service::EmployeeAcceptInviteServiceObj, // employee_accept_invite_service: EmployeeAcceptInviteServiceObj,
employee_exit_organization_service: employee_exit_organization_service: EmployeeExitOrganizationServiceObj,
employee_exit_organization_service::EmployeeExitOrganizationServiceObj, employee_login_service: EmployeeLoginServiceObj,
employee_login_service: employee_login_service::EmployeeLoginServiceObj, employee_register_service: EmployeeRegisterServiceObj,
employee_register_service: employee_register_service::EmployeeRegisterServiceObj, employee_resend_login_otp_service: EmployeeResendLoginOTPServiceObj,
employee_resend_login_otp_service: employee_resend_verification_otp_service: EmployeeResendVerificationOTPServiceObj,
employee_resend_login_otp_service::EmployeeResendLoginOTPServiceObj, employee_verify_phone_number_service: EmployeeVerifyPhoneNumberServiceObj,
employee_resend_verification_otp_service:
employee_resend_verification_otp_service::EmployeeResendVerificationOTPServiceObj, add_store: AddStoreServiceObj,
employee_verify_phone_number_service: update_store: UpdateStoreServiceObj,
employee_verify_phone_number_service::EmployeeVerifyPhoneNumberServiceObj,
} }
impl IdentityServicesInterface for IdentityServices { impl IdentityServicesInterface for IdentityServices {
fn delete_user(&self) -> delete_user::DeleteUserServiceObj { fn delete_user(&self) -> DeleteUserServiceObj {
self.delete_user.clone() self.delete_user.clone()
} }
fn login(&self) -> login::LoginServiceObj { fn login(&self) -> LoginServiceObj {
self.login.clone() self.login.clone()
} }
fn mark_user_verified(&self) -> mark_user_verified::MarkUserVerifiedServiceObj { fn mark_user_verified(&self) -> MarkUserVerifiedServiceObj {
self.mark_user_verified.clone() self.mark_user_verified.clone()
} }
fn register_user(&self) -> register_user::RegisterUserServiceObj { fn register_user(&self) -> RegisterUserServiceObj {
self.register_user.clone() self.register_user.clone()
} }
fn resend_verification_email( fn resend_verification_email(&self) -> ResendVerificationEmailServiceObj {
&self,
) -> resend_verification_email::ResendVerificationEmailServiceObj {
self.resend_verification_email.clone() 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() self.set_user_admin.clone()
} }
fn update_email(&self) -> update_email::UpdateEmailServiceObj { fn update_email(&self) -> UpdateEmailServiceObj {
self.update_email.clone() self.update_email.clone()
} }
fn update_password(&self) -> update_password::UpdatePasswordServiceObj { fn update_password(&self) -> UpdatePasswordServiceObj {
self.update_password.clone() self.update_password.clone()
} }
// employee // employee
fn employee_accept_invite_service( // fn employee_accept_invite_service(&self) -> EmployeeAcceptInviteServiceObj {
&self, // self.employee_accept_invite_service.clone()
) -> employee_accept_invite_service::EmployeeAcceptInviteServiceObj { // }
self.employee_accept_invite_service.clone() fn employee_exit_organization_service(&self) -> EmployeeExitOrganizationServiceObj {
}
fn employee_exit_organization_service(
&self,
) -> employee_exit_organization_service::EmployeeExitOrganizationServiceObj {
self.employee_exit_organization_service.clone() 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() 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() self.employee_register_service.clone()
} }
fn employee_resend_login_otp_service( fn employee_resend_login_otp_service(&self) -> EmployeeResendLoginOTPServiceObj {
&self,
) -> employee_resend_login_otp_service::EmployeeResendLoginOTPServiceObj {
self.employee_resend_login_otp_service.clone() self.employee_resend_login_otp_service.clone()
} }
fn employee_resend_verification_otp_service( fn employee_resend_verification_otp_service(&self) -> EmployeeResendVerificationOTPServiceObj {
&self,
) -> employee_resend_verification_otp_service::EmployeeResendVerificationOTPServiceObj {
self.employee_resend_verification_otp_service.clone() self.employee_resend_verification_otp_service.clone()
} }
fn employee_verify_phone_number_service( fn employee_verify_phone_number_service(&self) -> EmployeeVerifyPhoneNumberServiceObj {
&self,
) -> employee_verify_phone_number_service::EmployeeVerifyPhoneNumberServiceObj {
self.employee_verify_phone_number_service.clone() 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),
);
}
} }

View file

@ -2,6 +2,6 @@
// //
// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-License-Identifier: AGPL-3.0-or-later
mod adapters; pub(crate) mod adapters;
mod application; mod application;
mod domain; mod domain;

View file

@ -62,6 +62,14 @@ async fn main() {
db.pool.clone(), db.pool.clone(),
settings.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(auth::adapter::load_adapters(db.pool.clone(), &settings))
.configure(utils::random_string::GenerateRandomString::inject()) .configure(utils::random_string::GenerateRandomString::inject())
.configure(utils::uuid::GenerateUUID::inject()) .configure(utils::uuid::GenerateUUID::inject())