diff --git a/entity_api/src/agreement.rs b/entity_api/src/agreement.rs index 840628d..7e413c2 100644 --- a/entity_api/src/agreement.rs +++ b/entity_api/src/agreement.rs @@ -61,6 +61,26 @@ pub async fn update(db: &DatabaseConnection, id: Id, model: Model) -> Result Result<(), Error> { + let result = find_by_id(db, id).await?; + + match result { + Some(agreement_model) => { + debug!( + "Existing Agreement model to be deleted: {:?}", + agreement_model + ); + + agreement_model.delete(db).await?; + Ok(()) + } + None => Err(Error { + inner: None, + error_code: EntityApiErrorCode::RecordNotFound, + }), + } +} + pub async fn find_by_id(db: &DatabaseConnection, id: Id) -> Result, Error> { match Entity::find_by_id(id).one(db).await { Ok(Some(agreement)) => { diff --git a/web/src/controller/agreement_controller.rs b/web/src/controller/agreement_controller.rs index db70a1f..d86061d 100644 --- a/web/src/controller/agreement_controller.rs +++ b/web/src/controller/agreement_controller.rs @@ -9,6 +9,7 @@ use axum::response::IntoResponse; use axum::Json; use entity::{agreements::Model, Id}; use entity_api::agreement as AgreementApi; +use serde_json::json; use service::config::ApiVersion; use std::collections::HashMap; @@ -149,3 +150,32 @@ pub async fn index( Ok(Json(ApiResponse::new(StatusCode::OK.into(), agreements))) } + +/// DELETE an Agreement specified by its primary key. +#[utoipa::path( + delete, + path = "/agreements/{id}", + params( + ApiVersion, + ("id" = i32, Path, description = "Agreement id to delete") + ), + responses( + (status = 200, description = "Successfully deleted a certain Agreement by its id", body = [i32]), + (status = 401, description = "Unauthorized"), + (status = 404, description = "Agreement not found"), + (status = 405, description = "Method not allowed") + ), + security( + ("cookie_auth" = []) + ) +)] +pub async fn delete( + CompareApiVersion(_v): CompareApiVersion, + State(app_state): State, + Path(id): Path, +) -> Result { + debug!("DELETE Agreement by id: {}", id); + + AgreementApi::delete_by_id(app_state.db_conn_ref(), id).await?; + Ok(Json(json!({"id": id}))) +} diff --git a/web/src/router.rs b/web/src/router.rs index c4cc934..7d1fefa 100644 --- a/web/src/router.rs +++ b/web/src/router.rs @@ -34,6 +34,7 @@ use utoipa_rapidoc::RapiDoc; agreement_controller::update, agreement_controller::index, agreement_controller::read, + agreement_controller::delete, note_controller::create, note_controller::update, note_controller::index, @@ -132,6 +133,7 @@ fn agreement_routes(app_state: AppState) -> Router { .route("/agreements/:id", put(agreement_controller::update)) .route("/agreements", get(agreement_controller::index)) .route("/agreements/:id", get(agreement_controller::read)) + .route("/agreements/:id", delete(agreement_controller::delete)) .route_layer(login_required!(Backend, login_url = "/login")) .with_state(app_state) }