use super::Trip; use crate::model::{ notification::Notification, tripdetails::TripDetails, triptype::TripType, user::{ErgoUser, SteeringUser, User}, }; use sqlx::SqlitePool; impl Trip { /// Cox decides to create own trip. pub async fn new_own(db: &SqlitePool, cox: &SteeringUser, trip_details: TripDetails) { Self::perform_new(db, &cox.user, trip_details).await } /// ErgoUser decides to create ergo 'trip'. Returns false, if trip is not a ergo-session (and /// thus User is not allowed to create such a trip) pub async fn new_own_ergo(db: &SqlitePool, ergo: &ErgoUser, trip_details: TripDetails) -> bool { if let Some(typ) = trip_details.triptype(db).await { let allowed_type = TripType::find_by_id(db, 4).await.unwrap(); if typ == allowed_type { Self::perform_new(db, &ergo.user, trip_details).await; return true; } } false } async fn perform_new(db: &SqlitePool, user: &User, trip_details: TripDetails) { let _ = sqlx::query!( "INSERT INTO trip (cox_id, trip_details_id) VALUES(?, ?)", user.id, trip_details.id ) .execute(db) .await; Self::notify_trips_same_datetime(db, trip_details, user).await; } async fn notify_trips_same_datetime(db: &SqlitePool, trip_details: TripDetails, user: &User) { let same_starting_datetime = TripDetails::find_by_startingdatetime( db, trip_details.day, trip_details.planned_starting_time, ) .await; for notify in same_starting_datetime { // don't notify oneself if notify.id == trip_details.id { continue; } // don't notify people who have cancelled their trip if notify.cancelled() { continue; } if let Some(trip) = Trip::find_by_trip_details(db, notify.id).await { let user_earlier_trip = User::find_by_id(db, trip.cox_id as i32).await.unwrap(); Notification::create( db, &user_earlier_trip, &format!( "{user} hat eine Ausfahrt zur selben Zeit ({} um {}) wie du erstellt", trip.day, trip.planned_starting_time ), "Neue Ausfahrt zur selben Zeit", None, None, ) .await; } } } }