doido-auth 0.0.20

Unified authentication for Doido — AuthUser trait, extractors, strategies, and auth generators.
Documentation
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("/"))
    }
}