Skip to content
Clone
a06673b
52 lines 1.7 KB Rust
use axum::extract::State;
use axum_extra::extract::cookie::CookieJar;
use crate::error::AuthError;
use crate::features::AuthService;
use export::data::{AppRequest, AppRequestData, AppResponseData};
use super::super::cookies;
#[utoipa::path(
post,
path = "/auth/email/verify",
tag = "auth",
request_body = AppRequestData<crate::features::email_code::types::VerifyCodeCmd>,
responses(
(status = 200, description = "Code verified; the verification-code row id is returned.", body = AppResponseData<crate::features::email_code::types::VerifyCodeResult>),
(status = 400, description = "Invalid code, missing temp_key cookie, or expired.", body = super::super::openapi::ErrorBody),
(status = 401, description = "Unauthorized.", body = super::super::openapi::ErrorBody),
(status = 429, description = "Rate limited.", body = super::super::openapi::ErrorBody),
),
)]
pub(crate) async fn handler(
State(svc): State<AuthService>,
jar: CookieJar,
cmd: AppRequest<crate::features::email_code::types::VerifyCodeCmd>,
) -> Result<
(
CookieJar,
AppResponseData<crate::features::email_code::types::VerifyCodeResult>,
),
AuthError,
> {
let cmd = cmd.into_inner();
let purpose = cmd.purpose;
let email = cmd.email;
let user_id = cmd.user_id;
let code = cmd.code;
let temp_key_value = cmd.temp_key_value;
let cookie_name = crate::features::email_code::usecase::cookie_name(
&svc.config.cookie_name_prefix,
purpose,
&email,
);
let result = svc
.verify_verification_code(&email, user_id, purpose, &code, &temp_key_value)
.await?;
let jar = cookies::remove_cookie(jar, &cookie_name);
Ok((jar, AppResponseData::ok(result)))
}