From 9e932e1aca56b457be3cd30052c7e94645c05fb6 Mon Sep 17 00:00:00 2001 From: Simon Goller Date: Thu, 27 Jun 2024 21:05:42 +0200 Subject: [PATCH] Fix deleting extra hours --- ...3f8b7e3994e0d4edf0e36275619d11a233f3.json} | 4 +-- ...5fc7048bb63735b359dc1365abbba68774a93.json | 12 +++++++++ ...963c7eec7158004bc002b5fd81cffd0e17e2.json} | 4 +-- dao_impl/src/extra_hours.rs | 26 +++++++++++++++---- rest/src/extra_hours.rs | 4 +-- service_impl/src/extra_hours.rs | 14 +++++++--- 6 files changed, 50 insertions(+), 14 deletions(-) rename .sqlx/{query-66842d4f10b73e2a5a1e7e25bbb40aec095fee47a0334c5b2126e746fb14d9e7.json => query-1c8be5c0021c10a1377ac2a03d9b3f8b7e3994e0d4edf0e36275619d11a233f3.json} (91%) create mode 100644 .sqlx/query-77e028e8c559bdb0a725d6af0b75fc7048bb63735b359dc1365abbba68774a93.json rename .sqlx/{query-1adc3ff219a135b40566e2a0a94ff507b51f6a71163a404e12b2cab65376e187.json => query-a90b5c6c759c7d5dc7beb05c8e90963c7eec7158004bc002b5fd81cffd0e17e2.json} (91%) diff --git a/.sqlx/query-66842d4f10b73e2a5a1e7e25bbb40aec095fee47a0334c5b2126e746fb14d9e7.json b/.sqlx/query-1c8be5c0021c10a1377ac2a03d9b3f8b7e3994e0d4edf0e36275619d11a233f3.json similarity index 91% rename from .sqlx/query-66842d4f10b73e2a5a1e7e25bbb40aec095fee47a0334c5b2126e746fb14d9e7.json rename to .sqlx/query-1c8be5c0021c10a1377ac2a03d9b3f8b7e3994e0d4edf0e36275619d11a233f3.json index 85014e7..562b326 100644 --- a/.sqlx/query-66842d4f10b73e2a5a1e7e25bbb40aec095fee47a0334c5b2126e746fb14d9e7.json +++ b/.sqlx/query-1c8be5c0021c10a1377ac2a03d9b3f8b7e3994e0d4edf0e36275619d11a233f3.json @@ -1,6 +1,6 @@ { "db_name": "SQLite", - "query": "SELECT id, sales_person_id, amount, category, description, date_time, created, deleted, update_version FROM extra_hours WHERE sales_person_id = ? AND CAST(strftime('%Y', date_time) AS INTEGER) = ?", + "query": "SELECT id, sales_person_id, amount, category, description, date_time, created, deleted, update_version FROM extra_hours WHERE sales_person_id = ? AND CAST(strftime('%Y', date_time) AS INTEGER) = ? AND deleted IS NULL", "describe": { "columns": [ { @@ -64,5 +64,5 @@ false ] }, - "hash": "66842d4f10b73e2a5a1e7e25bbb40aec095fee47a0334c5b2126e746fb14d9e7" + "hash": "1c8be5c0021c10a1377ac2a03d9b3f8b7e3994e0d4edf0e36275619d11a233f3" } diff --git a/.sqlx/query-77e028e8c559bdb0a725d6af0b75fc7048bb63735b359dc1365abbba68774a93.json b/.sqlx/query-77e028e8c559bdb0a725d6af0b75fc7048bb63735b359dc1365abbba68774a93.json new file mode 100644 index 0000000..feba609 --- /dev/null +++ b/.sqlx/query-77e028e8c559bdb0a725d6af0b75fc7048bb63735b359dc1365abbba68774a93.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "UPDATE extra_hours SET deleted = ?, update_version = ?, update_process = ? WHERE id = ?", + "describe": { + "columns": [], + "parameters": { + "Right": 4 + }, + "nullable": [] + }, + "hash": "77e028e8c559bdb0a725d6af0b75fc7048bb63735b359dc1365abbba68774a93" +} diff --git a/.sqlx/query-1adc3ff219a135b40566e2a0a94ff507b51f6a71163a404e12b2cab65376e187.json b/.sqlx/query-a90b5c6c759c7d5dc7beb05c8e90963c7eec7158004bc002b5fd81cffd0e17e2.json similarity index 91% rename from .sqlx/query-1adc3ff219a135b40566e2a0a94ff507b51f6a71163a404e12b2cab65376e187.json rename to .sqlx/query-a90b5c6c759c7d5dc7beb05c8e90963c7eec7158004bc002b5fd81cffd0e17e2.json index 3dcbebe..b26757e 100644 --- a/.sqlx/query-1adc3ff219a135b40566e2a0a94ff507b51f6a71163a404e12b2cab65376e187.json +++ b/.sqlx/query-a90b5c6c759c7d5dc7beb05c8e90963c7eec7158004bc002b5fd81cffd0e17e2.json @@ -1,6 +1,6 @@ { "db_name": "SQLite", - "query": "SELECT id, sales_person_id, amount, category, description, date_time, created, deleted, update_version FROM extra_hours WHERE id = ?", + "query": "SELECT id, sales_person_id, amount, category, description, date_time, created, deleted, update_version FROM extra_hours WHERE id = ? AND deleted IS NULL", "describe": { "columns": [ { @@ -64,5 +64,5 @@ false ] }, - "hash": "1adc3ff219a135b40566e2a0a94ff507b51f6a71163a404e12b2cab65376e187" + "hash": "a90b5c6c759c7d5dc7beb05c8e90963c7eec7158004bc002b5fd81cffd0e17e2" } diff --git a/dao_impl/src/extra_hours.rs b/dao_impl/src/extra_hours.rs index 02601d0..11f0404 100644 --- a/dao_impl/src/extra_hours.rs +++ b/dao_impl/src/extra_hours.rs @@ -73,7 +73,7 @@ impl ExtraHoursDao for ExtraHoursDaoImpl { let id_vec = id.as_bytes().to_vec(); Ok(query_as!( ExtraHoursDb, - "SELECT id, sales_person_id, amount, category, description, date_time, created, deleted, update_version FROM extra_hours WHERE id = ?", + "SELECT id, sales_person_id, amount, category, description, date_time, created, deleted, update_version FROM extra_hours WHERE id = ? AND deleted IS NULL", id_vec, ).fetch_optional(self.pool.as_ref()) .await @@ -91,7 +91,7 @@ impl ExtraHoursDao for ExtraHoursDaoImpl { let id_vec = sales_person_id.as_bytes().to_vec(); Ok(query_as!( ExtraHoursDb, - "SELECT id, sales_person_id, amount, category, description, date_time, created, deleted, update_version FROM extra_hours WHERE sales_person_id = ? AND CAST(strftime('%Y', date_time) AS INTEGER) = ?", + "SELECT id, sales_person_id, amount, category, description, date_time, created, deleted, update_version FROM extra_hours WHERE sales_person_id = ? AND CAST(strftime('%Y', date_time) AS INTEGER) = ? AND deleted IS NULL", id_vec, year, ).fetch_all(self.pool.as_ref()) @@ -142,10 +142,26 @@ impl ExtraHoursDao for ExtraHoursDaoImpl { } async fn update( &self, - _entity: &ExtraHoursEntity, - _process: &str, + entity: &ExtraHoursEntity, + process: &str, ) -> Result<(), crate::DaoError> { - unimplemented!() + let id_vec = entity.id.as_bytes().to_vec(); + let version_vec = entity.version.as_bytes().to_vec(); + let delete = entity + .deleted + .map(|date_time| date_time.format(&Iso8601::DATE_TIME)) + .transpose()?; + query!( + "UPDATE extra_hours SET deleted = ?, update_version = ?, update_process = ? WHERE id = ?", + delete, + version_vec, + process, + id_vec, + ) + .execute(self.pool.as_ref()) + .await + .map_db_error()?; + Ok(()) } async fn delete(&self, _id: Uuid, _process: &str) -> Result<(), crate::DaoError> { unimplemented!() diff --git a/rest/src/extra_hours.rs b/rest/src/extra_hours.rs index c5b4dd3..d104c74 100644 --- a/rest/src/extra_hours.rs +++ b/rest/src/extra_hours.rs @@ -4,7 +4,7 @@ use axum::{ body::Body, extract::{Path, Query, State}, response::Response, - routing::{get, post}, + routing::{delete, get, post}, Extension, Json, Router, }; use rest_types::ExtraHoursTO; @@ -18,7 +18,7 @@ use crate::{error_handler, Context, RestStateDef}; pub fn generate_route() -> Router { Router::new() .route("/", post(create_extra_hours::)) - .route("/:id", post(delete_extra_hours::)) + .route("/:id", delete(delete_extra_hours::)) .route( "/by-sales-person/:id", get(get_extra_hours_for_sales_person::), diff --git a/service_impl/src/extra_hours.rs b/service_impl/src/extra_hours.rs index 462efac..1ab8b0d 100644 --- a/service_impl/src/extra_hours.rs +++ b/service_impl/src/extra_hours.rs @@ -164,12 +164,20 @@ impl< .await? .ok_or(ServiceError::EntityNotFound(extra_hours_id))?; - self.sales_person_service - .verify_user_is_sales_person(extra_hours_entity.sales_person_id, context) - .await?; + let (hr_permission, user_permission) = join!( + self.permission_service + .check_permission(HR_PRIVILEGE, context.clone()), + self.sales_person_service + .verify_user_is_sales_person(extra_hours_entity.sales_person_id, context), + ); + hr_permission.or(user_permission)?; extra_hours_entity.deleted = Some(self.clock_service.date_time_now()); + self.extra_hours_dao + .update(&extra_hours_entity, "extra_hours_service::delete") + .await?; + Ok(()) } }