use actix_web::{Result, delete, get, post, put, web}; use sea_orm::prelude::Uuid; use validator::Validate; use crate::db::Database; use crate::db::project::CreateProject; use crate::entity; use crate::error::ApiError; pub fn setup(cfg: &mut actix_web::web::ServiceConfig) { cfg.service(get_project) .service(get_projects) .service(create_project) .service(update_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: web::Json, ) -> Result, ApiError> { create_project.validate()?; let result = db.create_project(create_project.into_inner()).await?; Ok(web::Json(result)) } #[put("/{id}")] async fn update_project( db: web::Data, path: web::Path, update_project: web::Json, ) -> Result, ApiError> { let updated_project = db .update_project(&path, update_project.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 ))) }