From 1b7a44b8cdbca78eadaaec94c489aa5275036e2d Mon Sep 17 00:00:00 2001 From: Max Hohlfeld Date: Tue, 8 Jul 2025 14:22:37 +0200 Subject: [PATCH] refactor: db availability into own files --- ...6920d845b62bf05249e4f5fb4acad79fe2b2.json} | 4 +- ...d634440dfff960c34404fe7acc16fbc9b0fc.json} | 4 +- ...nge_and_area_including_user_for_export.sql | 26 ++++++++ db/sql/availability/read_including_user.sql | 21 ++++++ db/src/models/assignment_changeset.rs | 2 +- db/src/models/availability.rs | 65 +++---------------- db/src/models/event_changeset.rs | 2 +- db/src/models/vehicle.rs | 2 +- web/src/endpoints/availability/delete.rs | 2 +- web/src/endpoints/availability/get_update.rs | 2 +- web/src/endpoints/availability/post_update.rs | 2 +- .../endpoints/export/get_availability_data.rs | 2 +- 12 files changed, 67 insertions(+), 67 deletions(-) rename db/.sqlx/{query-a05ae42af4e579697f6ddae93aa52fbc826a58edb71a23b54a589c56e1b50378.json => query-604c4d56e84c5b36a0c217a4b6fd6920d845b62bf05249e4f5fb4acad79fe2b2.json} (65%) rename db/.sqlx/{query-1b85bca9dc5c0ec4568a07846ccda76468e81d9335548ef6f8b25c6e290b9cd0.json => query-79daa9585c09f2f98db217067d7bd634440dfff960c34404fe7acc16fbc9b0fc.json} (66%) create mode 100644 db/sql/availability/read_all_by_daterange_and_area_including_user_for_export.sql create mode 100644 db/sql/availability/read_including_user.sql diff --git a/db/.sqlx/query-a05ae42af4e579697f6ddae93aa52fbc826a58edb71a23b54a589c56e1b50378.json b/db/.sqlx/query-604c4d56e84c5b36a0c217a4b6fd6920d845b62bf05249e4f5fb4acad79fe2b2.json similarity index 65% rename from db/.sqlx/query-a05ae42af4e579697f6ddae93aa52fbc826a58edb71a23b54a589c56e1b50378.json rename to db/.sqlx/query-604c4d56e84c5b36a0c217a4b6fd6920d845b62bf05249e4f5fb4acad79fe2b2.json index 7919570b..73a84e1d 100644 --- a/db/.sqlx/query-a05ae42af4e579697f6ddae93aa52fbc826a58edb71a23b54a589c56e1b50378.json +++ b/db/.sqlx/query-604c4d56e84c5b36a0c217a4b6fd6920d845b62bf05249e4f5fb4acad79fe2b2.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT\n availability.id,\n availability.userId,\n availability.startTimestamp,\n availability.endTimestamp,\n availability.comment,\n user_.name,\n user_.email,\n user_.password,\n user_.salt,\n user_.role AS \"role: Role\",\n user_.function AS \"function: UserFunction\",\n user_.areaId,\n user_.locked,\n user_.lastLogin,\n user_.receiveNotifications,\n area.name AS areaName\n FROM availability\n JOIN user_ ON availability.userId = user_.id\n JOIN area ON user_.areaId = area.id\n WHERE user_.areaId = $1 AND\n availability.starttimestamp::date >= $2 AND\n availability.starttimestamp::date <= $3;\n ", + "query": "SELECT\n availability.id,\n availability.userId,\n availability.startTimestamp,\n availability.endTimestamp,\n availability.comment,\n user_.name,\n user_.email,\n user_.password,\n user_.salt,\n user_.role AS \"role: Role\",\n user_.function AS \"function: UserFunction\",\n user_.areaId,\n user_.locked,\n user_.lastLogin,\n user_.receiveNotifications,\n area.name AS areaName\nFROM availability\nJOIN\n user_ ON availability.userId = user_.id\nJOIN\n area ON user_.areaId = area.id\nWHERE\n user_.areaId = $1\n AND availability.starttimestamp::date >= $2\n AND availability.starttimestamp::date <= $3;\n", "describe": { "columns": [ { @@ -139,5 +139,5 @@ false ] }, - "hash": "a05ae42af4e579697f6ddae93aa52fbc826a58edb71a23b54a589c56e1b50378" + "hash": "604c4d56e84c5b36a0c217a4b6fd6920d845b62bf05249e4f5fb4acad79fe2b2" } diff --git a/db/.sqlx/query-1b85bca9dc5c0ec4568a07846ccda76468e81d9335548ef6f8b25c6e290b9cd0.json b/db/.sqlx/query-79daa9585c09f2f98db217067d7bd634440dfff960c34404fe7acc16fbc9b0fc.json similarity index 66% rename from db/.sqlx/query-1b85bca9dc5c0ec4568a07846ccda76468e81d9335548ef6f8b25c6e290b9cd0.json rename to db/.sqlx/query-79daa9585c09f2f98db217067d7bd634440dfff960c34404fe7acc16fbc9b0fc.json index d4e43cc3..4ddd3c9f 100644 --- a/db/.sqlx/query-1b85bca9dc5c0ec4568a07846ccda76468e81d9335548ef6f8b25c6e290b9cd0.json +++ b/db/.sqlx/query-79daa9585c09f2f98db217067d7bd634440dfff960c34404fe7acc16fbc9b0fc.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT\n availability.id,\n availability.userId,\n availability.startTimestamp,\n availability.endTimestamp,\n availability.comment,\n user_.name,\n user_.email,\n user_.password,\n user_.salt,\n user_.role AS \"role: Role\",\n user_.function AS \"function: UserFunction\",\n user_.areaId,\n user_.locked,\n user_.lastLogin,\n user_.receiveNotifications\n FROM availability\n LEFT JOIN assignment ON availability.Id = assignment.availabilityId\n JOIN user_ ON availability.userId = user_.id\n WHERE availability.id = $1;\n ", + "query": "SELECT\n availability.id,\n availability.userId,\n availability.startTimestamp,\n availability.endTimestamp,\n availability.comment,\n user_.name,\n user_.email,\n user_.password,\n user_.salt,\n user_.role AS \"role: Role\",\n user_.function AS \"function: UserFunction\",\n user_.areaId,\n user_.locked,\n user_.lastLogin,\n user_.receiveNotifications\nFROM availability\nJOIN\n user_ ON availability.userId = user_.id\nWHERE\n availability.id = $1;\n", "describe": { "columns": [ { @@ -131,5 +131,5 @@ false ] }, - "hash": "1b85bca9dc5c0ec4568a07846ccda76468e81d9335548ef6f8b25c6e290b9cd0" + "hash": "79daa9585c09f2f98db217067d7bd634440dfff960c34404fe7acc16fbc9b0fc" } diff --git a/db/sql/availability/read_all_by_daterange_and_area_including_user_for_export.sql b/db/sql/availability/read_all_by_daterange_and_area_including_user_for_export.sql new file mode 100644 index 00000000..1dd8bd95 --- /dev/null +++ b/db/sql/availability/read_all_by_daterange_and_area_including_user_for_export.sql @@ -0,0 +1,26 @@ +SELECT + availability.id, + availability.userId, + availability.startTimestamp, + availability.endTimestamp, + availability.comment, + user_.name, + user_.email, + user_.password, + user_.salt, + user_.role AS "role: Role", + user_.function AS "function: UserFunction", + user_.areaId, + user_.locked, + user_.lastLogin, + user_.receiveNotifications, + area.name AS areaName +FROM availability +JOIN + user_ ON availability.userId = user_.id +JOIN + area ON user_.areaId = area.id +WHERE + user_.areaId = $1 + AND availability.starttimestamp::date >= $2 + AND availability.starttimestamp::date <= $3; diff --git a/db/sql/availability/read_including_user.sql b/db/sql/availability/read_including_user.sql new file mode 100644 index 00000000..24e86baf --- /dev/null +++ b/db/sql/availability/read_including_user.sql @@ -0,0 +1,21 @@ +SELECT + availability.id, + availability.userId, + availability.startTimestamp, + availability.endTimestamp, + availability.comment, + user_.name, + user_.email, + user_.password, + user_.salt, + user_.role AS "role: Role", + user_.function AS "function: UserFunction", + user_.areaId, + user_.locked, + user_.lastLogin, + user_.receiveNotifications +FROM availability +JOIN + user_ ON availability.userId = user_.id +WHERE + availability.id = $1; diff --git a/db/src/models/assignment_changeset.rs b/db/src/models/assignment_changeset.rs index 36ad5b31..aaba0302 100644 --- a/db/src/models/assignment_changeset.rs +++ b/db/src/models/assignment_changeset.rs @@ -28,7 +28,7 @@ impl<'a> AsyncValidate<'a> for AssignmentChangeset { context: &'a Self::Context, ) -> Result<(), crate::validation::AsyncValidateError> { let Some(availability) = - Availability::read_by_id_including_user(context.pool, context.availability_id).await? + Availability::read_including_user(context.pool, context.availability_id).await? else { return Err(AsyncValidateError::new( "Angegebener Verfügbarkeit des Nutzers existiert nicht.", diff --git a/db/src/models/availability.rs b/db/src/models/availability.rs index 25177c42..338b3b29 100644 --- a/db/src/models/availability.rs +++ b/db/src/models/availability.rs @@ -73,6 +73,7 @@ impl Availability { Ok(availabilities) } + /// loads availabilities for the area and the same day as the start date and which fully lie inside the daterange pub async fn read_all_by_daterange_and_area_including_user_for_event_planning( pool: &PgPool, date_range: (NaiveDateTime, NaiveDateTime), @@ -116,34 +117,10 @@ impl Availability { Ok(availabilities) } - pub async fn read_by_id_including_user(pool: &PgPool, id: i32) -> Result> { - let record = query!( - r##" - SELECT - availability.id, - availability.userId, - availability.startTimestamp, - availability.endTimestamp, - availability.comment, - user_.name, - user_.email, - user_.password, - user_.salt, - user_.role AS "role: Role", - user_.function AS "function: UserFunction", - user_.areaId, - user_.locked, - user_.lastLogin, - user_.receiveNotifications - FROM availability - LEFT JOIN assignment ON availability.Id = assignment.availabilityId - JOIN user_ ON availability.userId = user_.id - WHERE availability.id = $1; - "##, - id - ) - .fetch_optional(pool) - .await?; + pub async fn read_including_user(pool: &PgPool, id: i32) -> Result> { + let record = query_file!("sql/availability/read_including_user.sql", id) + .fetch_optional(pool) + .await?; let availability = record.map(|r| Availability { id: r.id, @@ -170,7 +147,7 @@ impl Availability { Ok(availability) } - pub async fn read_by_id(pool: &PgPool, id: i32) -> Result> { + pub async fn read(pool: &PgPool, id: i32) -> Result> { let record = query!("SELECT * FROM availability WHERE id = $1", id) .fetch_optional(pool) .await?; @@ -187,37 +164,13 @@ impl Availability { Ok(availability) } - pub async fn read_for_export( + pub async fn read_all_by_daterange_and_area_including_user_for_export( pool: &PgPool, date_range: (NaiveDate, NaiveDate), area_id: i32, ) -> Result> { - let records = query!( - r##" - SELECT - availability.id, - availability.userId, - availability.startTimestamp, - availability.endTimestamp, - availability.comment, - user_.name, - user_.email, - user_.password, - user_.salt, - user_.role AS "role: Role", - user_.function AS "function: UserFunction", - user_.areaId, - user_.locked, - user_.lastLogin, - user_.receiveNotifications, - area.name AS areaName - FROM availability - JOIN user_ ON availability.userId = user_.id - JOIN area ON user_.areaId = area.id - WHERE user_.areaId = $1 AND - availability.starttimestamp::date >= $2 AND - availability.starttimestamp::date <= $3; - "##, + let records = query_file!( + "sql/availability/read_all_by_daterange_and_area_including_user_for_export.sql", area_id, date_range.0, date_range.1 diff --git a/db/src/models/event_changeset.rs b/db/src/models/event_changeset.rs index ce8b7f97..8ba47b24 100644 --- a/db/src/models/event_changeset.rs +++ b/db/src/models/event_changeset.rs @@ -125,7 +125,7 @@ async fn time_can_be_extended_if_edit( let mut common_time = (start.and_time(START_OF_DAY), end.and_time(END_OF_DAY)); for assignment in assignments_for_event { - let availability = Availability::read_by_id(pool, assignment.availability_id) + let availability = Availability::read(pool, assignment.availability_id) .await? .unwrap(); let all_assignments = diff --git a/db/src/models/vehicle.rs b/db/src/models/vehicle.rs index e4de9d69..9b94d488 100644 --- a/db/src/models/vehicle.rs +++ b/db/src/models/vehicle.rs @@ -1,4 +1,4 @@ -use sqlx::{query, PgPool}; +use sqlx::{PgPool, query}; use super::Result; diff --git a/web/src/endpoints/availability/delete.rs b/web/src/endpoints/availability/delete.rs index a7df6bb9..6fb5a7e4 100644 --- a/web/src/endpoints/availability/delete.rs +++ b/web/src/endpoints/availability/delete.rs @@ -10,7 +10,7 @@ pub async fn delete( pool: web::Data, path: web::Path, ) -> Result { - let Some(availability) = Availability::read_by_id(pool.get_ref(), path.id).await? else { + let Some(availability) = Availability::read(pool.get_ref(), path.id).await? else { return Ok(HttpResponse::NotFound().finish()); }; diff --git a/web/src/endpoints/availability/get_update.rs b/web/src/endpoints/availability/get_update.rs index e9bcfebe..e25fd92b 100644 --- a/web/src/endpoints/availability/get_update.rs +++ b/web/src/endpoints/availability/get_update.rs @@ -14,7 +14,7 @@ pub async fn get( pool: web::Data, path: web::Path, ) -> Result { - let Some(availability) = Availability::read_by_id(pool.get_ref(), path.id).await? else { + let Some(availability) = Availability::read(pool.get_ref(), path.id).await? else { return Ok(HttpResponse::NotFound().finish()); }; diff --git a/web/src/endpoints/availability/post_update.rs b/web/src/endpoints/availability/post_update.rs index b7f4d315..30a3a766 100644 --- a/web/src/endpoints/availability/post_update.rs +++ b/web/src/endpoints/availability/post_update.rs @@ -18,7 +18,7 @@ pub async fn post( path: web::Path, form: web::Form, ) -> Result { - let Some(availability) = Availability::read_by_id(pool.get_ref(), path.id).await? else { + let Some(availability) = Availability::read(pool.get_ref(), path.id).await? else { return Ok(HttpResponse::NotFound().finish()); }; diff --git a/web/src/endpoints/export/get_availability_data.rs b/web/src/endpoints/export/get_availability_data.rs index c07525b5..ca09c6c6 100644 --- a/web/src/endpoints/export/get_availability_data.rs +++ b/web/src/endpoints/export/get_availability_data.rs @@ -62,7 +62,7 @@ pub async fn get( }; let availabilities = - Availability::read_for_export(pool.get_ref(), (start_date, end_date), area_id).await?; + Availability::read_all_by_daterange_and_area_including_user_for_export(pool.get_ref(), (start_date, end_date), area_id).await?; let export_availabilities = availabilities .into_iter()