From 10740f988dd145f78d6f58932d803df3a1db29bc Mon Sep 17 00:00:00 2001 From: Philipp Hofer Date: Fri, 18 Apr 2025 23:01:17 +0200 Subject: [PATCH] reduce amount of magic values, goal is to have specific states -> e.g. cancelled --- src/model/event.rs | 32 +++++++++++++++++++++----------- src/model/mod.rs | 4 ++-- src/model/notification.rs | 2 +- src/model/trip.rs | 18 ++++++++++++------ src/model/tripdetails.rs | 2 +- templates/planned.html.tera | 15 +++++++-------- 6 files changed, 44 insertions(+), 29 deletions(-) diff --git a/src/model/event.rs b/src/model/event.rs index fe63998..90eb9c0 100644 --- a/src/model/event.rs +++ b/src/model/event.rs @@ -34,11 +34,13 @@ pub struct Event { } #[derive(Serialize, Debug)] -pub struct EventWithUserAndTriptype { +pub struct EventWithDetails { #[serde(flatten)] pub event: Event, trip_type: Option, + tripdetails: TripDetails, cox_needed: bool, + cancelled: bool, cox: Vec, rower: Vec, } @@ -116,6 +118,12 @@ pub struct EventUpdate<'a> { pub trip_type_id: Option, } +impl EventUpdate<'_> { + fn cancelled(&self) -> bool { + self.max_people == -1 + } +} + impl Event { pub async fn find_by_id(db: &SqlitePool, id: i64) -> Option { sqlx::query_as!( @@ -134,16 +142,13 @@ WHERE planned_event.id like ? .ok() } - pub async fn get_pinned_for_day( - db: &SqlitePool, - day: NaiveDate, - ) -> Vec { + pub async fn get_pinned_for_day(db: &SqlitePool, day: NaiveDate) -> Vec { let mut events = Self::get_for_day(db, day).await; events.retain(|e| e.event.always_show); events } - pub async fn get_for_day(db: &SqlitePool, day: NaiveDate) -> Vec { + pub async fn get_for_day(db: &SqlitePool, day: NaiveDate) -> Vec { let day = format!("{day}"); let events = sqlx::query_as!( Event, @@ -164,10 +169,15 @@ WHERE day=?", if let Some(trip_type_id) = event.trip_type_id { trip_type = TripType::find_by_id(db, trip_type_id).await; } - ret.push(EventWithUserAndTriptype { + let tripdetails = TripDetails::find_by_id(db, event.trip_details_id) + .await + .expect("db constraints"); + ret.push(EventWithDetails { cox_needed: event.planned_amount_cox > cox.len() as i64, cox, rower: Registration::all_rower(db, event.trip_details_id).await, + cancelled: tripdetails.cancelled(), + tripdetails, event, trip_type, }); @@ -315,7 +325,7 @@ WHERE trip_details.id=? .unwrap(); //Okay, as planned_event can only be created with proper DB backing let tripdetails = self.trip_details(db).await; - let was_already_cancelled = tripdetails.max_people == 0; + let was_already_cancelled = tripdetails.cancelled(); sqlx::query!( "UPDATE trip_details SET max_people = ?, notes = ?, always_show = ?, is_locked = ?, trip_type_id = ? WHERE id = ?", @@ -340,7 +350,7 @@ WHERE trip_details.id=? .await; } - if update.max_people == 0 && !was_already_cancelled { + if update.cancelled() && !was_already_cancelled { let coxes = Registration::all_cox(db, self.id).await; for user in coxes { if let Some(user) = User::find_by_name(db, &user.name).await { @@ -389,7 +399,7 @@ WHERE trip_details.id=? } } } - if update.max_people > 0 && was_already_cancelled { + if !update.cancelled() && was_already_cancelled { Notification::delete_by_action( db, &format!("remove_user_trip_with_trip_details_id:{}", tripdetails.id), @@ -427,7 +437,7 @@ WHERE trip_details.id=? } pub fn is_cancelled(&self) -> bool { - self.max_people == 0 + self.max_people == -1 } pub async fn get_ics_feed(db: &SqlitePool) -> String { diff --git a/src/model/mod.rs b/src/model/mod.rs index 3a76436..b9d45d3 100644 --- a/src/model/mod.rs +++ b/src/model/mod.rs @@ -6,7 +6,7 @@ use waterlevel::WaterlevelDay; use crate::AMOUNT_DAYS_TO_SHOW_TRIPS_AHEAD; use self::{ - event::{Event, EventWithUserAndTriptype}, + event::{Event, EventWithDetails}, trip::{Trip, TripWithUserAndType}, waterlevel::Waterlevel, weather::Weather, @@ -44,7 +44,7 @@ pub mod weather; #[derive(Serialize, Debug)] pub struct Day { day: NaiveDate, - events: Vec, + events: Vec, trips: Vec, is_pinned: bool, regular_sees_this_day: bool, diff --git a/src/model/notification.rs b/src/model/notification.rs index 8a49f37..1c74a1a 100644 --- a/src/model/notification.rs +++ b/src/model/notification.rs @@ -278,7 +278,7 @@ mod test { let cancel_update = EventUpdate { name: &event.name, planned_amount_cox: event.planned_amount_cox as i32, - max_people: 0, + max_people: -1, notes: event.notes.as_deref(), always_show: event.always_show, is_locked: event.is_locked, diff --git a/src/model/trip.rs b/src/model/trip.rs index eb5f82f..7565ea0 100644 --- a/src/model/trip.rs +++ b/src/model/trip.rs @@ -46,6 +46,12 @@ pub struct TripUpdate<'a> { pub is_locked: bool, } +impl<'a> TripUpdate<'a> { + fn cancelled(&self) -> bool { + self.max_people == -1 + } +} + impl TripWithUserAndType { pub async fn from(db: &SqlitePool, trip: Trip) -> Self { let mut trip_type = None; @@ -245,7 +251,7 @@ WHERE trip.id=? return Err(CoxHelpError::DetailsLocked); } - if event.max_people == 0 { + if event.is_cancelled() { return Err(CoxHelpError::CanceledEvent); } @@ -309,9 +315,9 @@ WHERE day=? }; let tripdetails = TripDetails::find_by_id(db, trip_details_id).await.unwrap(); - let was_already_cancelled = tripdetails.max_people == 0; + let was_already_cancelled = tripdetails.cancelled(); - let is_locked = if update.max_people == 0 { + let is_locked = if update.cancelled() { false } else { update.is_locked @@ -329,7 +335,7 @@ WHERE day=? .await .unwrap(); //Okay, as trip_details can only be created with proper DB backing - if update.max_people == 0 && !was_already_cancelled { + if update.cancelled() && !was_already_cancelled { let rowers = TripWithUserAndType::from(db, update.trip.clone()) .await .rower; @@ -368,7 +374,7 @@ WHERE day=? .await; } - if update.max_people > 0 && was_already_cancelled { + if !update.cancelled() && was_already_cancelled { Notification::delete_by_action( db, &format!("remove_user_trip_with_trip_details_id:{}", trip_details_id), @@ -463,7 +469,7 @@ WHERE day=? } fn is_cancelled(&self) -> bool { - self.max_people == 0 + self.max_people == -1 } } diff --git a/src/model/tripdetails.rs b/src/model/tripdetails.rs index eebafce..46b74f5 100644 --- a/src/model/tripdetails.rs +++ b/src/model/tripdetails.rs @@ -95,7 +95,7 @@ WHERE day = ? AND planned_starting_time = ? } pub fn cancelled(&self) -> bool { - self.max_people == 0 + self.max_people == -1 } /// This function is called when a person registers to a trip or when the cox changes the diff --git a/templates/planned.html.tera b/templates/planned.html.tera index 4310925..e315430 100644 --- a/templates/planned.html.tera +++ b/templates/planned.html.tera @@ -124,7 +124,7 @@ {% if event.always_show and not day.regular_sees_this_day %} 🔮 {% endif -%} - {%- if event.max_people == 0 %} + {%- if event.cancelled %} ⚠ Absage {{ event.planned_starting_time }} Uhr @@ -202,7 +202,7 @@
{# --- START List Coxes --- #} {% if event.planned_amount_cox > 0 %} - {% if event.max_people == 0 %} + {% if event.cancelled %} {{ macros::box(participants=event.cox, empty_seats="", header='Absage', bg='[#f43f5e]') }} {% else %} {% if amount_cox_missing > 0 %} @@ -215,7 +215,7 @@ {# --- END List Coxes --- #} {# --- START List Rowers --- #} {% set amount_cur_rower = event.rower | length %} - {% if event.max_people == 0 %} + {% if event.cancelled %} {{ macros::box(header='Absage', bg='[#f43f5e]', participants=event.rower, trip_details_id=event.trip_details_id, allow_removing="manage_events" in loggedin_user.roles) }} {% else %} {{ macros::box(participants=event.rower, empty_seats=event.max_people - amount_cur_rower, bg='primary-100', color='black', trip_details_id=event.trip_details_id, allow_removing="manage_events" in loggedin_user.roles) }} @@ -240,7 +240,7 @@ {{ macros::input(label='Titel', name='name', type='input', value=event.name) }} - {{ macros::input(label='Anzahl Ruderer', name='max_people', type='number', required=true, value=event.max_people, min='1') }} + {{ macros::input(label='Anzahl Ruderer', name='max_people', type='number', required=true, value=event.max_people, min='0') }} {{ macros::input(label='Anzahl Steuerleute', name='planned_amount_cox', type='number', value=event.planned_amount_cox, required=true, min='0') }} {{ macros::checkbox(label='Immer anzeigen', name='always_show', id=event.id,checked=event.always_show) }} {{ macros::checkbox(label='Gesperrt', name='is_locked', id=event.id,checked=event.is_locked) }} @@ -260,7 +260,7 @@
{% else %} - {% if event.max_people == 0 %} + {% if event.cancelled %} Wenn du deine Absage absagen (:^)) willst, einfach entsprechende Anzahl an Ruderer oben eintragen. {% else %}
@@ -269,9 +269,8 @@ {{ macros::input(label='Grund der Absage', name='notes', type='input', value='') }} - {{ macros::input(label='', name='max_people', type='hidden', value=0) }} + {{ macros::input(label='', name='max_people', type='hidden', value=-1) }} {{ macros::input(label='', name='name', type='hidden', value=event.name) }} - {{ macros::input(label='', name='max_people', type='hidden', value=event.max_people) }} {{ macros::input(label='', name='planned_amount_cox', type='hidden', value=event.planned_amount_cox) }} {{ macros::input(label='', name='always_show', type='hidden', value=event.always_show) }} {{ macros::input(label='', name='is_locked', type='hidden', value=event.is_locked) }} @@ -398,7 +397,7 @@

Ausfahrt absagen

- {{ macros::input(label='', name='max_people', type='hidden', value=0) }} + {{ macros::input(label='', name='max_people', type='hidden', value=-1) }} {{ macros::input(label='Grund der Absage', name='notes', type='input', value='') }} {{ macros::input(label='', name='is_locked', type='hidden', value=trip.is_locked) }} {{ macros::input(label='', name='trip_type', type='hidden', value=trip.trip_type_id) }}