use crate::models::user::Model as User;
use doido::controller::{controller, Response};
use doido::model::password::HasSecurePassword;
use doido_auth::{sign_in, sign_out};
use serde::Deserialize;
#[derive(Deserialize)]
pub struct SignInForm {
pub email: String,
pub password: String,
}
pub struct SessionsController;
#[controller]
impl SessionsController {
/// GET /users/sign_in
pub async fn new(ctx: doido::controller::Context) -> Response {
ctx.render("auth/sign_in", serde_json::json!({}))
}
/// POST /users/sign_in
pub async fn create(mut ctx: doido::controller::Context) -> doido::Result<Response> {
let form: SignInForm = ctx.form().await?;
if let Some(user) = User::find_by_email(ctx.db(), &form.email).await? {
if user.authenticate(&form.password) {
sign_in(ctx, &user)?;
return Ok(ctx.redirect_to("/"));
}
}
Ok(ctx.render(
"auth/sign_in",
serde_json::json!({ "error": "Invalid email or password" }),
))
}
/// DELETE /users/sign_out
pub async fn destroy(mut ctx: doido::controller::Context) -> doido::Result<Response> {
sign_out(ctx)?;
Ok(ctx.redirect_to("/"))
}
}