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<Pinussy>, form: web::Form<SignupForm>) -> Result<HttpResponse> {
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(),
));
}
};
}