use actix_web::{HttpResponse, web}; use crate::api::response::{ApiEmptyResponse, ApiErrorResponse}; use crate::error::AppError; use crate::service::AppService; use crate::service::auth::email::EmailVerifyRequest; #[utoipa::path( post, path = "/api/v1/auth/email/verify", tag = "Auth", operation_id = "authVerifyEmailChange", summary = "Confirm email change", description = "Complete an email change using the token from the confirmation email. The endpoint checks again whether the target email is already taken, then marks old emails as unverified and inserts the new verified primary email in a transaction.", request_body( content = EmailVerifyRequest, description = "Email change confirmation token.", content_type = "application/json" ), responses( (status = 200, description = "Email changed successfully.", body = ApiEmptyResponse), (status = 400, description = "The token is empty.", body = ApiErrorResponse), (status = 404, description = "The token is invalid or expired.", body = ApiErrorResponse), (status = 409, description = "The target email was taken by another account before confirmation.", body = ApiErrorResponse), (status = 500, description = "Database transaction failed.", body = ApiErrorResponse) ) )] pub async fn handle( service: web::Data, params: web::Json, ) -> Result { service.auth.auth_email_verify(params.into_inner()).await?; Ok(HttpResponse::Ok().json(ApiEmptyResponse::ok("email verified"))) }