use actix_web::{Responder, Result, delete, get, post, put, web}; use sea_orm::prelude::Uuid; use serde::Deserialize; use crate::db::Database; use crate::error::ApiError; #[derive(Deserialize)] struct CreateProject { name: String, } #[derive(Deserialize)] struct UpdateProject { id: Uuid, name: String, } pub fn setup(cfg: &mut actix_web::web::ServiceConfig) { cfg.service(get_project) .service(get_projects) .service(create_project) .service(delete_project); } #[get("")] async fn get_projects( db: web::Data, ) -> Result>, ApiError> { let projects = db.get_projects().await?; Ok(web::Json(projects)) } #[get("/{id}")] async fn get_project( db: web::Data, path: web::Path, ) -> Result, ApiError> { let id = path.into_inner(); let project = db.get_project(&id).await?; Ok(web::Json(project.unwrap())) } #[post("")] async fn create_project( db: web::Data, create_project_struct: web::Json, ) -> Result, ApiError> { let result = db.create_project(&create_project_struct.name).await?; Ok(web::Json(result)) } #[put("")] async fn change_project( db: web::Data, update_project_struct: web::Json, ) -> Result, ApiError> { let updated_project = db .update_project(update_project_struct.into_inner()) .await?; Ok(web::Json(updated_project)) } #[delete("/{id}")] async fn delete_project( db: web::Data, path: web::Path, ) -> Result, ApiError> { let id = path.into_inner(); let result = db.delete_project(&id).await?; Ok(web::Json(format!( "Successfully deleted {} project/s with the id: {}", result.rows_affected, id ))) }