From 465d6b0f0af40d3f87ab4d780e9dc6ade36aef82 Mon Sep 17 00:00:00 2001 From: Max Hohlfeld Date: Sun, 24 Aug 2025 18:40:46 +0200 Subject: [PATCH] feat: show event for areamanager of cross areal planned user --- ...l_by_date_range_and_assigned_user_in_other_area.sql | 10 ++++++---- .../read_all_by_date_and_area_and_user.sql | 3 +++ db/src/models/event.rs | 2 ++ db/src/models/event_for_calendar.rs | 4 +++- web/src/endpoints/availability/get_calendar.rs | 10 ++++++---- web/src/endpoints/availability/get_overview.rs | 7 +++++++ 6 files changed, 27 insertions(+), 9 deletions(-) diff --git a/db/sql/event/read_all_by_date_range_and_assigned_user_in_other_area.sql b/db/sql/event/read_all_by_date_range_and_assigned_user_in_other_area.sql index c3cb7255..52ac113a 100644 --- a/db/sql/event/read_all_by_date_range_and_assigned_user_in_other_area.sql +++ b/db/sql/event/read_all_by_date_range_and_assigned_user_in_other_area.sql @@ -19,6 +19,8 @@ FROM assignment JOIN availability ON assignment.availabilityid = availability.id +JOIN user_ ON + availability.userId = user_.id JOIN event ON assignment.eventid = "event".id JOIN location ON @@ -26,9 +28,9 @@ JOIN location ON JOIN clothing ON event.clothing = clothing.id WHERE - userid = $1 - AND event.starttimestamp::date >= $2 - AND event.starttimestamp::date <= $3 - AND location.areaId != $4 + (userid = $1 OR user_.areaId = $2) + AND event.starttimestamp::date >= $3 + AND event.starttimestamp::date <= $4 + AND location.areaId != $5 ORDER BY event.starttimestamp; diff --git a/db/sql/event_for_calendar/read_all_by_date_and_area_and_user.sql b/db/sql/event_for_calendar/read_all_by_date_and_area_and_user.sql index b82c6b0e..938c8e6f 100644 --- a/db/sql/event_for_calendar/read_all_by_date_and_area_and_user.sql +++ b/db/sql/event_for_calendar/read_all_by_date_and_area_and_user.sql @@ -49,9 +49,12 @@ LEFT JOIN ASSIGNMENT ON event.id = assignment.eventid LEFT JOIN availability ON assignment.availabilityid = availability.id +LEFT JOIN user_ ON + availability.userId = user_.id WHERE event.starttimestamp::date = $1 AND ( location.areaId = $2 OR availability.userId = $3 + OR user_.areaId = $4 ) diff --git a/db/src/models/event.rs b/db/src/models/event.rs index 022a9af7..49bbbe7d 100644 --- a/db/src/models/event.rs +++ b/db/src/models/event.rs @@ -168,10 +168,12 @@ impl Event { date_range: (&NaiveDate, &NaiveDate), user_id: i32, area_to_ignore: i32, + area_for_which_user_is_manager: Option, ) -> Result> { let records = query_file!( "sql/event/read_all_by_date_range_and_assigned_user_in_other_area.sql", user_id, + area_for_which_user_is_manager, date_range.0, date_range.1, area_to_ignore diff --git a/db/src/models/event_for_calendar.rs b/db/src/models/event_for_calendar.rs index 8dd015c0..aa5123b4 100644 --- a/db/src/models/event_for_calendar.rs +++ b/db/src/models/event_for_calendar.rs @@ -15,12 +15,14 @@ impl EventForCalendar { date: &NaiveDate, area: i32, user: i32, + area_for_which_user_is_manager: Option, ) -> Result> { let records = query_file!( "sql/event_for_calendar/read_all_by_date_and_area_and_user.sql", date, area, - user + user, + area_for_which_user_is_manager ) .fetch_all(pool) .await?; diff --git a/web/src/endpoints/availability/get_calendar.rs b/web/src/endpoints/availability/get_calendar.rs index 4851c445..b07e5643 100644 --- a/web/src/endpoints/availability/get_calendar.rs +++ b/web/src/endpoints/availability/get_calendar.rs @@ -67,20 +67,22 @@ async fn get( let availabilities_from_user = Availability::read_all_by_user_and_date(pool.get_ref(), user.id, &date).await?; - //println!("{availabilities_from_user:#?}"); let user_can_create_availability = availabilities_from_user.is_empty() || !find_free_date_time_slots(&availabilities_from_user).is_empty(); - //println!("{} || {} || {} = {user_can_create_availability}", availabilities_from_user.is_empty(), - // !only_one_availability_exists_and_is_whole_day(&availabilities_from_user), - // !find_free_time_slots(&availabilities_from_user).is_empty()); + let area_for_which_user_is_manager = if user.role == Role::Admin || user.role == Role::AreaManager { + Some(user.area_id) + } else { + None + }; let events = EventForCalendar::read_all_by_date_and_area_and_user( pool.get_ref(), &date, query.area.unwrap_or(user.area_id), user.id, + area_for_which_user_is_manager ) .await?; diff --git a/web/src/endpoints/availability/get_overview.rs b/web/src/endpoints/availability/get_overview.rs index 131140c5..f54cc324 100644 --- a/web/src/endpoints/availability/get_overview.rs +++ b/web/src/endpoints/availability/get_overview.rs @@ -43,11 +43,18 @@ async fn get( ) .await?; + let area_for_which_user_is_manager = if user.role == Role::Admin || user.role == Role::AreaManager { + Some(user.area_id) + } else { + None + }; + let mut foreign_events = Event::read_all_by_date_range_and_assigned_user_in_other_area( pool.get_ref(), date_range, user.id, user.area_id, + area_for_which_user_is_manager ) .await?;