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
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());
}
}

View file

@ -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<Arc<RoutesRegit.batspository>>;
pub type WebIdentityRoutesRepository = Data<Arc<RoutesRepository>>;
pub type IdentityUserCqrsExec = Arc<PostgresCqrs<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-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<dyn IdentityServicesInterface>;
#[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),
);
}
}

View file

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

View file

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