2020-11-29 00:12:23 +01:00
|
|
|
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<DbPool>,
|
|
|
|
|
id: web::Path<String>,
|
|
|
|
|
) -> Result<HttpResponse, ServerError> {
|
|
|
|
|
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<DbPool>,
|
|
|
|
|
data: web::Json<Work>,
|
|
|
|
|
) -> Result<HttpResponse, ServerError> {
|
|
|
|
|
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<DbPool>,
|
|
|
|
|
composer_id: web::Path<String>,
|
|
|
|
|
) -> Result<HttpResponse, ServerError> {
|
|
|
|
|
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<DbPool>,
|
|
|
|
|
id: web::Path<String>,
|
|
|
|
|
) -> Result<HttpResponse, ServerError> {
|
|
|
|
|
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())
|
|
|
|
|
}
|