forked from Ruderverein-Donau-Linz/rowt
		
	reduce amount of magic values, goal is to have specific states -> e.g. cancelled
This commit is contained in:
		@@ -34,11 +34,13 @@ pub struct Event {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Debug)]
 | 
			
		||||
pub struct EventWithUserAndTriptype {
 | 
			
		||||
pub struct EventWithDetails {
 | 
			
		||||
    #[serde(flatten)]
 | 
			
		||||
    pub event: Event,
 | 
			
		||||
    trip_type: Option<TripType>,
 | 
			
		||||
    tripdetails: TripDetails,
 | 
			
		||||
    cox_needed: bool,
 | 
			
		||||
    cancelled: bool,
 | 
			
		||||
    cox: Vec<Registration>,
 | 
			
		||||
    rower: Vec<Registration>,
 | 
			
		||||
}
 | 
			
		||||
@@ -116,6 +118,12 @@ pub struct EventUpdate<'a> {
 | 
			
		||||
    pub trip_type_id: Option<i64>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl EventUpdate<'_> {
 | 
			
		||||
    fn cancelled(&self) -> bool {
 | 
			
		||||
        self.max_people == -1
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Event {
 | 
			
		||||
    pub async fn find_by_id(db: &SqlitePool, id: i64) -> Option<Self> {
 | 
			
		||||
        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<EventWithUserAndTriptype> {
 | 
			
		||||
    pub async fn get_pinned_for_day(db: &SqlitePool, day: NaiveDate) -> Vec<EventWithDetails> {
 | 
			
		||||
        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<EventWithUserAndTriptype> {
 | 
			
		||||
    pub async fn get_for_day(db: &SqlitePool, day: NaiveDate) -> Vec<EventWithDetails> {
 | 
			
		||||
        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 {
 | 
			
		||||
 
 | 
			
		||||
@@ -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<EventWithUserAndTriptype>,
 | 
			
		||||
    events: Vec<EventWithDetails>,
 | 
			
		||||
    trips: Vec<TripWithUserAndType>,
 | 
			
		||||
    is_pinned: bool,
 | 
			
		||||
    regular_sees_this_day: bool,
 | 
			
		||||
 
 | 
			
		||||
@@ -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,
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -124,7 +124,7 @@
 | 
			
		||||
                                                {% if event.always_show and not day.regular_sees_this_day %}
 | 
			
		||||
                                                    <span title="Du siehst diese Ausfahrt schon, obwohl sie mehr als {{ amount_days_to_show_trips_ahead }} Tage in der Zukunft liegt. Du Magier!">🔮</span>
 | 
			
		||||
                                                {% endif -%}
 | 
			
		||||
                                                {%- if event.max_people == 0 %}
 | 
			
		||||
                                                {%- if event.cancelled %}
 | 
			
		||||
                                                    <strong class="text-[#f43f5e]">⚠ Absage
 | 
			
		||||
                                                        {{ event.planned_starting_time }}
 | 
			
		||||
                                                        Uhr
 | 
			
		||||
@@ -202,7 +202,7 @@
 | 
			
		||||
                                            <div id="event{{ event.trip_details_id }}">
 | 
			
		||||
                                                {# --- 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 @@
 | 
			
		||||
                                                        <input type="hidden" name="_method" value="put" />
 | 
			
		||||
                                                        <input type="hidden" name="id" value="{{ event.id }}" />
 | 
			
		||||
                                                        {{ 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 @@
 | 
			
		||||
                                                        </a>
 | 
			
		||||
                                                    </div>
 | 
			
		||||
                                                {% else %}
 | 
			
		||||
                                                    {% if event.max_people == 0 %}
 | 
			
		||||
                                                    {% if event.cancelled %}
 | 
			
		||||
                                                        Wenn du deine Absage absagen (:^)) willst, einfach entsprechende Anzahl an Ruderer oben eintragen.
 | 
			
		||||
                                                    {% else %}
 | 
			
		||||
                                                        <div class="bg-gray-100 dark:bg-primary-900 p-3 mt-4 rounded-md">
 | 
			
		||||
@@ -269,9 +269,8 @@
 | 
			
		||||
                                                                <input type="hidden" name="_method" value="put" />
 | 
			
		||||
                                                                <input type="hidden" name="id" value="{{ event.id }}" />
 | 
			
		||||
                                                                {{ 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 @@
 | 
			
		||||
                                                    <div class="bg-gray-100 dark:bg-primary-900 p-3 mt-4 rounded-md">
 | 
			
		||||
                                                        <h3 class="text-primary-950 dark:text-white font-bold uppercase tracking-wide mb-2">Ausfahrt absagen</h3>
 | 
			
		||||
                                                        <form action="/cox/trip/{{ trip.id }}" method="post" class="grid">
 | 
			
		||||
                                                            {{ 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) }}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user