From 8f05d1bdf477f15f25acda50c88389fcb1b6613a Mon Sep 17 00:00:00 2001 From: philipp Date: Wed, 5 Apr 2023 22:01:50 +0200 Subject: [PATCH] don't allow to join as user if already cox --- src/model/planned_event.rs | 4 ++-- src/model/usertrip.rs | 40 +++++++++++++++++++++++++++++++++++--- src/rest/mod.rs | 25 +++++++++++++++--------- 3 files changed, 55 insertions(+), 14 deletions(-) diff --git a/src/model/planned_event.rs b/src/model/planned_event.rs index e4a5df1..c1718c2 100644 --- a/src/model/planned_event.rs +++ b/src/model/planned_event.rs @@ -56,7 +56,7 @@ WHERE day=?", ret } - pub async fn rower_can_register(db: &SqlitePool, trip_details_id: i64) -> bool { + 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 @@ -75,7 +75,7 @@ WHERE day=?", .unwrap(); //TODO: fixme let amount_allowed_to_register = amount_allowed_to_register.max_people; - amount_currently_registered < amount_allowed_to_register + amount_currently_registered >= amount_allowed_to_register } async fn get_all_cox_for_id(db: &SqlitePool, id: i64) -> Vec { diff --git a/src/model/usertrip.rs b/src/model/usertrip.rs index ba0897a..cd701de 100644 --- a/src/model/usertrip.rs +++ b/src/model/usertrip.rs @@ -1,17 +1,45 @@ use sqlx::SqlitePool; +use super::planned_event::PlannedEvent; + pub struct UserTrip {} impl UserTrip { - pub async fn create(db: &SqlitePool, user_id: i64, trip_details_id: i64) -> bool { - sqlx::query!( + pub async fn create( + db: &SqlitePool, + user_id: i64, + trip_details_id: i64, + ) -> Result<(), UserTripError> { + if PlannedEvent::is_full(db, trip_details_id).await { + return Err(UserTripError::EventAlreadyFull); + } + + let is_cox = sqlx::query!( + "SELECT count(*) as amount + FROM trip + WHERE trip_details_id = ? + AND cox_id = ?", + trip_details_id, + user_id + ) + .fetch_one(db) + .await + .unwrap(); + if is_cox.amount > 0 { + return Err(UserTripError::AlreadyRegisteredAsCox); + } + + match sqlx::query!( "INSERT INTO user_trip (user_id, trip_details_id) VALUES(?, ?)", user_id, trip_details_id ) .execute(db) .await - .is_ok() + { + Ok(_) => Ok(()), + Err(_) => Err(UserTripError::AlreadyRegistered), + } } pub async fn delete(db: &SqlitePool, user_id: i64, trip_details_id: i64) { @@ -25,3 +53,9 @@ impl UserTrip { .is_ok(); } } + +pub enum UserTripError { + AlreadyRegistered, + AlreadyRegisteredAsCox, + EventAlreadyFull, +} diff --git a/src/rest/mod.rs b/src/rest/mod.rs index 6a466bf..0ab9548 100644 --- a/src/rest/mod.rs +++ b/src/rest/mod.rs @@ -10,7 +10,11 @@ use rocket::{ use rocket_dyn_templates::{tera::Context, Template}; use sqlx::SqlitePool; -use crate::model::{planned_event::PlannedEvent, user::User, usertrip::UserTrip, Day}; +use crate::model::{ + user::User, + usertrip::{UserTrip, UserTripError}, + Day, +}; mod admin; mod auth; @@ -45,14 +49,17 @@ async fn index(db: &State, user: User, flash: Option")] async fn join(db: &State, trip_details_id: i64, user: User) -> Flash { - if !PlannedEvent::rower_can_register(db, trip_details_id).await { - return Flash::error(Redirect::to("/"), "Bereits ausgebucht!"); - } - - if UserTrip::create(db, user.id, trip_details_id).await { - Flash::success(Redirect::to("/"), "Erfolgreich angemeldet!") - } else { - Flash::error(Redirect::to("/"), "Du nimmst bereits teil!") + match UserTrip::create(db, user.id, trip_details_id).await { + Ok(_) => Flash::success(Redirect::to("/"), "Erfolgreich angemeldet!"), + Err(UserTripError::EventAlreadyFull) => { + Flash::error(Redirect::to("/"), "Event bereits ausgebucht!") + } + Err(UserTripError::AlreadyRegistered) => { + Flash::error(Redirect::to("/"), "Du nimmst bereits teil!") + } + Err(UserTripError::AlreadyRegisteredAsCox) => { + Flash::error(Redirect::to("/"), "Du hilfst bereits als Steuerperson aus!") + } } }