use super::*;
#[derive(Deserialize)]
pub struct Request {
pub token: String,
}
#[derive(Serialize, Queryable, Selectable)]
#[diesel(table_name = schema::user)]
pub struct Response {
pub id: i32,
}
#[post("")]
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, diesel::result::Error> = web::block(move || {
use diesel::dsl::*;
let mut conn = db.get_conn();
conn.transaction(|conn| {
let user_id: Result<i32, diesel::result::Error> = schema::verify::table
.select(schema::verify::user)
.filter(schema::verify::token.eq(req.token))
.first(conn);
if user_id.is_err() {
return user_id;
}
let user_id = user_id.unwrap();
delete(schema::verify::table.filter(schema::verify::user.eq(user_id)))
.execute(conn)
.unwrap();
update(schema::user::table.filter(schema::user::id.eq(user_id)))
.set(schema::user::verified.eq(true))
.execute(conn)
.unwrap();
Ok(user_id)
})
})
.await
.unwrap();
match returned {
Err(_) => Err(ErrorCode::NotFound),
Ok(id) => Ok(web::Json(Response { id })),
}
}