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, responses( (status = 200, description = "Code verified; the verification-code row id is returned.", body = AppResponseData), (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, jar: CookieJar, cmd: AppRequest, ) -> Result< ( CookieJar, AppResponseData, ), 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))) }