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;
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |