/* * This file is part of laurelin/api * Copyright (C) 2023 Jonni Liljamo * * Licensed under GPL-3.0-only. * See LICENSE for licensing information. */ use actix_web::{post, web, HttpResponse, Responder}; use email_address::EmailAddress; use laurelin_shared::error::api::APIError; use crate::{actions, models, PgPool}; #[post("/api/user")] pub(crate) async fn create( pool: web::Data, user: web::Json, ) -> impl Responder { if user.username.len() < 3 { return HttpResponse::BadRequest().json(APIError::UserUsernameTooShort); } if user.password.len() < 8 { return HttpResponse::BadRequest().json(APIError::UserPasswordTooShort); } if !EmailAddress::is_valid(&user.email) { return HttpResponse::BadRequest().json(APIError::UserEmailInvalid); } let user_create = web::block(move || { let mut conn = match pool.get() { Err(_) => return Err(APIError::DatabasePoolGetFailed), Ok(conn) => conn, }; actions::user::create(&mut conn, &user.0) }) .await; match user_create { Err(_err) => { // TODO: handle? return HttpResponse::InternalServerError().json(APIError::Undefined); } Ok(user_res) => match user_res { Err(err) => { return HttpResponse::InternalServerError().json(err); } Ok(user) => HttpResponse::Ok().json(user), }, } }