94 lines
2.8 KiB
Rust
94 lines
2.8 KiB
Rust
// SPDX-FileCopyrightText: 2024 Aravinth Manivannan <realaravinth@batsense.net>
|
|
//
|
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
use derive_builder::Builder;
|
|
|
|
use super::*;
|
|
use crate::identity::application::port::output::db::{
|
|
delete_verification_secret::*, verification_secret_exists::*,
|
|
};
|
|
|
|
#[derive(Builder)]
|
|
pub struct MarkUserVerifiedService {
|
|
db_verification_secret_exists_adapter: VerificationSecretExistsOutDBPortObj,
|
|
db_delete_verification_secret_adapter: DeleteVerificationSecretOutDBPortObj,
|
|
}
|
|
|
|
#[async_trait::async_trait]
|
|
impl MarkUserVerifiedUseCase for MarkUserVerifiedService {
|
|
async fn mark_user_verified(
|
|
&self,
|
|
cmd: command::MarkUserVerifiedCommand,
|
|
) -> IdentityResult<()> {
|
|
let msg = VerifySecretExistsMsgBuilder::default()
|
|
.user_id(cmd.user_id().clone())
|
|
.secret(cmd.secret().into())
|
|
.build()
|
|
.unwrap();
|
|
if !self
|
|
.db_verification_secret_exists_adapter
|
|
.verification_secret_exists(&msg)
|
|
.await
|
|
.unwrap()
|
|
{
|
|
return Err(IdentityError::VerificationOTPSecretNotFound);
|
|
}
|
|
|
|
self.db_delete_verification_secret_adapter
|
|
.delete_verification_secret(&msg.into())
|
|
.await
|
|
.unwrap();
|
|
|
|
Ok(())
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
|
|
use crate::{tests::bdd::*, utils::uuid::tests::UUID};
|
|
|
|
#[actix_rt::test]
|
|
async fn test_service() {
|
|
let user_id = UUID;
|
|
let secret = "password";
|
|
let cmd = command::MarkUserVerifiedCommand::new(user_id.clone(), secret.into()).unwrap();
|
|
|
|
// happy case
|
|
{
|
|
let s = MarkUserVerifiedServiceBuilder::default()
|
|
.db_verification_secret_exists_adapter(mock_verification_secret_exists_db_port(
|
|
IS_CALLED_ONLY_ONCE,
|
|
RETURNS_TRUE,
|
|
))
|
|
.db_delete_verification_secret_adapter(mock_delete_verification_secret_db_port(
|
|
IS_CALLED_ONLY_ONCE,
|
|
))
|
|
.build()
|
|
.unwrap();
|
|
|
|
s.mark_user_verified(cmd.clone()).await.unwrap();
|
|
}
|
|
|
|
// error: secret doesn't exist
|
|
{
|
|
let s = MarkUserVerifiedServiceBuilder::default()
|
|
.db_verification_secret_exists_adapter(mock_verification_secret_exists_db_port(
|
|
IS_CALLED_ONLY_ONCE,
|
|
RETURNS_FALSE,
|
|
))
|
|
.db_delete_verification_secret_adapter(mock_delete_verification_secret_db_port(
|
|
IS_NEVER_CALLED,
|
|
))
|
|
.build()
|
|
.unwrap();
|
|
|
|
assert_eq!(
|
|
s.mark_user_verified(cmd.clone()).await.err(),
|
|
Some(IdentityError::VerificationOTPSecretNotFound)
|
|
);
|
|
}
|
|
}
|
|
}
|