use crate::constants::StaticConstraints; use crate::services::users_service; use actix_remote_ip::RemoteIP; use actix_web::error::ErrorInternalServerError; use actix_web::{web, HttpResponse}; #[derive(serde::Deserialize)] pub struct CreateAccountBody { name: String, email: String, } /// Create a new account pub async fn create_account( _remote_ip: RemoteIP, req: web::Json, ) -> actix_web::Result { // TODO : rate limiting // Check if email is valid if !mailchecker::is_valid(&req.email) { return Ok(HttpResponse::BadRequest().json("Email address is invalid!")); } // Check parameters let constraints = StaticConstraints::default(); if !constraints.user_name_len.validate(&req.name) || !constraints.mail_len.validate(&req.email) { return Ok(HttpResponse::BadRequest().json("Size constraints were not respected!")); } // TODO : check the mail address // Create the account let user_id = users_service::create_account(&req.name, &req.email) .await .map_err(|e| { log::error!("Failed to create user! {e}"); ErrorInternalServerError(e) })?; // TODO : trigger reset password (send mail) // Account successfully created Ok(HttpResponse::Created().finish()) }