use actix_web::{get, post, web, HttpResponse}; use serde::Deserialize; use crate::error::PinussyError; use crate::notification::{Kind as NotificationKind, Notification}; use crate::templates; use crate::users::User; use crate::Pinussy; use crate::Result; #[get("/signup")] async fn get() -> HttpResponse { HttpResponse::Ok().body(render!(templates::signup_html, None).unwrap()) } #[derive(Deserialize)] struct SignupForm { username: String, password: String, } #[post("/signup")] async fn post(state: web::Data, form: web::Form) -> Result { let new_user = User::new(form.username.clone(), form.password.clone())?; match state.db.users().create(new_user).await { Ok(_) => { return Ok(HttpResponse::Ok().body( render!( templates::signup_html, Some(Notification { kind: NotificationKind::Info, message: format!("you have successfully registered as {}", &form.username) }) ) .unwrap(), )) } Err(e) => { match e { PinussyError::Database(sqlx::Error::Database(e)) => { if e.is_unique_violation() { return Ok(HttpResponse::Conflict().body( render!( templates::signup_html, Some(Notification { kind: NotificationKind::Error, message: format!( "error: the username \"{}\" already exists", &form.username ) }) ) .unwrap(), )); } } // TODO: log error _ => {} } return Ok(HttpResponse::InternalServerError().body( render!( templates::signup_html, Some(Notification { kind: NotificationKind::Error, message: "there was an internal server error. please try again later." .to_owned() }) ) .unwrap(), )); } }; }