algohub-server 0.1.18

Extremely fast async online judge backend based on Rust
Documentation
use crate::{
    models::{
        category::{Category, CreateCategory, ListCategories},
        error::Error,
        response::{Empty, Response},
        OwnedId,
    },
    utils::{category, session},
    Result,
};
use rocket::{post, serde::json::Json, State};
use surrealdb::{engine::remote::ws::Client, Surreal};

#[post("/create", data = "<category>")]
pub async fn create(
    db: &State<Surreal<Client>>,
    category: Json<CreateCategory<'_>>,
) -> Result<OwnedId> {
    if !session::verify(db, category.id, category.token).await {
        return Err(Error::Unauthorized(Json(
            "Failed to grant permission".into(),
        )));
    }

    let data = category::create(db, category.into_inner().data)
        .await?
        .ok_or(Error::ServerError(Json("Failed to create category".into())))?;

    Ok(Json(Response {
        success: true,
        message: "Category created successfully".into(),
        data: Some(OwnedId {
            id: data.id.unwrap().id.to_string(),
        }),
    }))
}

#[post("/delete/<id>", data = "<category>")]
pub async fn delete(
    db: &State<Surreal<Client>>,
    id: &str,
    category: Json<CreateCategory<'_>>,
) -> Result<Empty> {
    if !session::verify(db, category.id, category.token).await {
        return Err(Error::Unauthorized(Json(
            "Failed to grant permission".into(),
        )));
    }

    category::delete(db, id).await?;

    Ok(Response {
        success: true,
        message: "Category deleted successfully".into(),
        data: None,
    }
    .into())
}

#[post("/list", data = "<data>")]
pub async fn list(
    db: &State<Surreal<Client>>,
    data: Json<ListCategories>,
) -> Result<Vec<Category>> {
    let result = category::list(db, data.into_inner().owner.into())
        .await
        .map_err(|e| Error::ServerError(Json(e.to_string().into())))?;

    if result.is_empty() {
        return Err(Error::NotFound(Json("Category not found".into())));
    }

    Ok(Json(Response {
        success: true,
        message: "Category found successfully".to_string(),
        data: Some(result),
    }))
}

pub fn routes() -> Vec<rocket::Route> {
    use rocket::routes;
    routes![create, delete, list]
}