user-service 0.4.1

A user management microservice.
Documentation
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 })),
    }
}