use actix_web::{get, post, put, delete, web, HttpResponse, HttpRequest, ResponseError}; use serde::{Serialize, Deserialize}; use crate::db::{spells::QuerySpell, GetResponse, Metadata}; use super::{Spell, InsertSpell}; #[derive(Serialize, Deserialize)] struct GetAllParams { limit: Option, page: Option, } #[get("/spells")] async fn get_all(req: HttpRequest) -> HttpResponse { let params = web::Query::::from_query(req.query_string()).unwrap(); let limit = params.limit.unwrap_or(20); let page = params.page.unwrap_or(1); match web::block(move || QuerySpell::get_all(limit, page)).await.unwrap() { Ok(spells) => { let mut response: Vec = Vec::new(); for spell in spells { response.push(Spell::from(spell)); } let total_count = QuerySpell::get_count().unwrap(); HttpResponse::Ok().json(GetResponse { data: response, metadata: Some(Metadata { total: total_count as i32, limit, page }) }) }, Err(err) => ResponseError::error_response(&err) } } #[get("/spells/{id}")] async fn get_by_id(id: web::Path) -> HttpResponse { match web::block(move || QuerySpell::get_by_id(id.into_inner())).await.unwrap() { Ok(spell) => HttpResponse::Ok().json(GetResponse { data: Spell::from(spell), metadata: None }), Err(err) => ResponseError::error_response(&err) } } #[post("/spells")] async fn create(spell: web::Json) -> HttpResponse { match InsertSpell::insert(spell.into_inner().into()) { Ok(spell) => HttpResponse::Created().json(Spell::from(spell)), Err(err) => ResponseError::error_response(&err) } } #[put("/spells/{id}")] async fn update(id: web::Path, spell: web::Json) -> HttpResponse { match web::block(move || InsertSpell::update(id.into_inner(), spell.into_inner().into())).await.unwrap() { Ok(spell) => HttpResponse::Ok().json(Spell::from(spell)), Err(err) => ResponseError::error_response(&err) } } #[delete("/spells/{id}")] async fn delete(id: web::Path) -> HttpResponse { match web::block(move || QuerySpell::delete(id.into_inner())).await.unwrap() { Ok(spell) => HttpResponse::Ok().json(Spell::from(spell)), Err(err) => ResponseError::error_response(&err) } } pub fn init_routes(config: &mut web::ServiceConfig) { config.service(get_all); config.service(get_by_id); config.service(create); config.service(delete); }