feat: load identity adapters into actix web
This commit is contained in:
parent
82c9c6b95d
commit
104961ed76
5 changed files with 456 additions and 84 deletions
|
@ -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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -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>>;
|
||||||
|
|
|
@ -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),
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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())
|
||||||
|
|
Loading…
Reference in a new issue