use super::authenticate; use crate::database; use crate::database::{DbPool, Work}; use crate::error::ServerError; use actix_web::{delete, get, post, web, HttpResponse}; use actix_web_httpauth::extractors::bearer::BearerAuth; /// Get an existing work. #[get("/works/{id}")] pub async fn get_work( db: web::Data, id: web::Path, ) -> Result { let data = web::block(move || { let conn = db.into_inner().get()?; database::get_work(&conn, &id.into_inner())?.ok_or(ServerError::NotFound) }) .await?; Ok(HttpResponse::Ok().json(data)) } /// Add a new work or update an existin one. The user must be authorized to do that. #[post("/works")] pub async fn update_work( auth: BearerAuth, db: web::Data, data: web::Json, ) -> Result { web::block(move || { let conn = db.into_inner().get()?; let user = authenticate(&conn, auth.token()).or(Err(ServerError::Unauthorized))?; database::update_work(&conn, &data.into_inner(), &user)?; Ok(()) }) .await?; Ok(HttpResponse::Ok().finish()) } #[get("/persons/{id}/works")] pub async fn get_works( db: web::Data, composer_id: web::Path, ) -> Result { let data = web::block(move || { let conn = db.into_inner().get()?; Ok(database::get_works(&conn, &composer_id.into_inner())?) }) .await?; Ok(HttpResponse::Ok().json(data)) } #[delete("/works/{id}")] pub async fn delete_work( auth: BearerAuth, db: web::Data, id: web::Path, ) -> Result { web::block(move || { let conn = db.into_inner().get()?; let user = authenticate(&conn, auth.token()).or(Err(ServerError::Unauthorized))?; database::delete_work(&conn, &id.into_inner(), &user)?; Ok(()) }) .await?; Ok(HttpResponse::Ok().finish()) }