use actix_web::{HttpResponse, web}; use crate::api::response::{ApiEmptyResponse, ApiErrorResponse}; use crate::error::AppError; use crate::service::AppService; use crate::service::auth::email::EmailChangeRequest; use crate::session::Session; #[utoipa::path( post, path = "/api/v1/auth/email/change", tag = "Auth", operation_id = "authRequestEmailChange", summary = "Request login email change", description = "After verifying the current user password, send a confirmation link to the new email address. password must be encrypted with the current session RSA public key. The token in the confirmation link is valid for 1 hour by default; the actual email switch is completed by calling /auth/email/verify.", request_body( content = EmailChangeRequest, description = "The new email address and encrypted current account password.", content_type = "application/json" ), responses( (status = 200, description = "The confirmation email has been queued for delivery.", body = ApiEmptyResponse), (status = 400, description = "The new email is empty, the password is incorrect, or RSA decryption failed.", body = ApiErrorResponse), (status = 401, description = "The current session is not authenticated.", body = ApiErrorResponse), (status = 409, description = "The new email is already in use.", body = ApiErrorResponse), (status = 500, description = "Cache, email service, or database read failed.", body = ApiErrorResponse) ) )] pub async fn handle( service: web::Data, session: Session, params: web::Json, ) -> Result { service .auth .auth_email_change_request(&session, params.into_inner()) .await?; Ok(HttpResponse::Ok().json(ApiEmptyResponse::ok("email change verification sent"))) }