user-service 0.4.1

A user management microservice.
Documentation
use super::*;

#[derive(Deserialize)]
pub struct Request {
    pub email: String,
    pub password: String,
}

#[derive(Serialize, Queryable, Selectable)]
#[diesel(table_name = schema::user)]
pub struct Response {
    pub id: i32,
}

#[get("")]
pub async fn route(
    db: web::Data<Database>,
    req: web::Json<Request>,
) -> Result<impl Responder, impl ResponseError> {
    let req = req.into_inner();

    let returned: Result<(i32, String), diesel::result::Error> = web::block(move || {
        use schema::user::dsl::*;
        let mut conn = db.get_conn();

        conn.transaction(|conn| {
            user.select((id, password))
                .filter(email.eq(req.email))
                .first(conn)
        })
    })
    .await
    .unwrap();

    let returned = match returned {
        Err(_) => return Err(ErrorCode::NotFound),
        Ok(returned) => returned,
    };

    match hashing::validate(&returned.1, &req.password) {
        false => Err(ErrorCode::Unauthorised),
        true => Ok(web::Json(Response { id: returned.0 })),
    }
}