78 lines
2.6 KiB
Rust
78 lines
2.6 KiB
Rust
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;
|
|
}
|
|
}
|
|
}
|
|
}
|