use chrono::NaiveDate; use serde::Serialize; use sqlx::SqlitePool; #[derive(Serialize, Clone)] pub struct PlannedEvent { id: i64, name: String, planned_amount_cox: i64, allow_guests: bool, trip_details_id: i64, planned_starting_time: String, max_people: i64, day: String, notes: Option, } #[derive(Serialize)] pub struct PlannedEventWithUser { #[serde(flatten)] planned_event: PlannedEvent, cox_needed: bool, cox: Vec, rower: Vec, } //TODO: move to appropriate place #[derive(Serialize)] pub struct Registration { pub name: String, pub registered_at: String, } impl PlannedEvent { pub async fn get_for_day(db: &SqlitePool, day: NaiveDate) -> Vec { let day = format!("{day}"); let events = sqlx::query_as!( PlannedEvent, "SELECT planned_event.id, name, planned_amount_cox, allow_guests, trip_details_id, planned_starting_time, max_people, day, notes FROM planned_event INNER JOIN trip_details ON planned_event.trip_details_id = trip_details.id WHERE day=?", day ) .fetch_all(db) .await .unwrap(); //TODO: fixme let mut ret = Vec::new(); for event in events { let cox = Self::get_all_cox_for_id(db, event.id).await; ret.push(PlannedEventWithUser { planned_event: event.clone(), cox_needed: event.planned_amount_cox > cox.len() as i64, cox, rower: Self::get_all_rower_for_id(db, event.id).await, }); } ret } pub async fn is_full(db: &SqlitePool, trip_details_id: i64) -> bool { let amount_currently_registered = sqlx::query!( "SELECT COUNT(*) as count FROM user_trip WHERE trip_details_id = ?", trip_details_id ) .fetch_one(db) .await .unwrap(); //TODO: fixme let amount_currently_registered = i64::from(amount_currently_registered.count); let amount_allowed_to_register = sqlx::query!( "SELECT max_people FROM trip_details WHERE id = ?", trip_details_id ) .fetch_one(db) .await .unwrap(); //TODO: fixme let amount_allowed_to_register = amount_allowed_to_register.max_people; amount_currently_registered >= amount_allowed_to_register } async fn get_all_cox_for_id(db: &SqlitePool, id: i64) -> Vec { sqlx::query_as!( Registration, " SELECT (SELECT name FROM user WHERE cox_id = id) as name, (SELECT created_at FROM user WHERE cox_id = id) as registered_at FROM trip WHERE planned_event_id = ? ", id ) .fetch_all(db) .await .unwrap() //TODO: fixme } async fn get_all_rower_for_id(db: &SqlitePool, id: i64) -> Vec { sqlx::query_as!( Registration, " SELECT (SELECT name FROM user WHERE user_trip.user_id = user.id) as name, (SELECT created_at FROM user WHERE user_trip.user_id = user.id) as registered_at FROM user_trip WHERE trip_details_id = (SELECT trip_details_id FROM planned_event WHERE id = ?) ", id ) .fetch_all(db) .await .unwrap() //TODO: fixme } pub async fn create( db: &SqlitePool, name: String, planned_amount_cox: i32, allow_guests: bool, trip_details_id: i64, ) { sqlx::query!( "INSERT INTO planned_event(name, planned_amount_cox, allow_guests, trip_details_id) VALUES(?, ?, ?, ?)", name, planned_amount_cox, allow_guests, trip_details_id ) .execute(db) .await .unwrap(); //TODO: fixme } pub async fn delete(db: &SqlitePool, id: i64) { sqlx::query!("DELETE FROM planned_event WHERE id = ?", id) .execute(db) .await .unwrap(); //TODO: fixme } }