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 })),
}
}