add notification to all pot. coxes if trip is full
This commit is contained in:
@ -4,6 +4,11 @@ use rocket::FromForm;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use sqlx::{FromRow, SqlitePool};
|
||||
|
||||
use super::{
|
||||
notification::Notification,
|
||||
trip::{Trip, TripWithUserAndType},
|
||||
};
|
||||
|
||||
#[derive(FromRow, Debug, Serialize, Deserialize)]
|
||||
pub struct TripDetails {
|
||||
pub id: i64,
|
||||
@ -64,6 +69,57 @@ WHERE day = ? AND planned_starting_time = ?
|
||||
.await.unwrap()
|
||||
}
|
||||
|
||||
/// This function is called when a person registers to a trip or when the cox changes the
|
||||
/// amount of free places.
|
||||
pub async fn check_free_spaces(&self, db: &SqlitePool) {
|
||||
if !self.is_full(db).await {
|
||||
// We still have space for new people, no need to do anything
|
||||
return;
|
||||
}
|
||||
|
||||
let other_trips_same_time = Self::find_by_startingdatetime(
|
||||
db,
|
||||
self.day.clone(),
|
||||
self.planned_starting_time.clone(),
|
||||
)
|
||||
.await;
|
||||
|
||||
for trip in &other_trips_same_time {
|
||||
if !trip.is_full(db).await {
|
||||
// There are trips on the same time, with open places
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// We just got fully booked and there are no other trips with remaining rower places. Send
|
||||
// notification to all coxes which are registered as non-cox.
|
||||
for trip_details in other_trips_same_time {
|
||||
let Some(trip) = Trip::find_by_trip_details(db, trip_details.id).await else {
|
||||
// This trip_details belongs to a planned_event, no need to do anything
|
||||
continue;
|
||||
};
|
||||
let pot_coxes = TripWithUserAndType::from(db, trip.clone()).await;
|
||||
let pot_coxes = pot_coxes.rower;
|
||||
for user in pot_coxes {
|
||||
let cox = User::find_by_id(db, trip.cox_id as i32).await.unwrap();
|
||||
let Some(user) = User::find_by_name(db, &user.name).await else {
|
||||
// User is a guest, no need to bother.
|
||||
continue;
|
||||
};
|
||||
if !user.has_role(db, "cox").await {
|
||||
// User is no cox, no need to bother
|
||||
continue;
|
||||
}
|
||||
if user.id == cox.id {
|
||||
// User already offers a trip, no need to bother
|
||||
continue;
|
||||
}
|
||||
|
||||
Notification::create(db, &user, &format!("Du hast dich als Ruderer bei der Ausfahrt von {} am {} um {} angemeldet. Bei allen Ausfahrten zu dieser Zeit sind nun alle Plätze ausgebucht. Damit noch mehr (Nicht-Steuerleute) mitfahren können, wäre es super, wenn du eine eigene Ausfahrt zur selben Zeit ausschreiben könntest.", cox.name, self.day, self.planned_starting_time), "Volle Ausfahrt", None).await;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Creates a new entry in `trip_details` and returns its id.
|
||||
pub async fn create(db: &SqlitePool, tripdetails: TripDetailsToAdd<'_>) -> i64 {
|
||||
let query = sqlx::query!(
|
||||
|
Reference in New Issue
Block a user