forked from Ruderverein-Donau-Linz/rowt
		
	don't allow to join as user if already cox
This commit is contained in:
		@@ -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<Registration> {
 | 
			
		||||
 
 | 
			
		||||
@@ -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,
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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<SqlitePool>, user: User, flash: Option<FlashMessage<'_
 | 
			
		||||
 | 
			
		||||
#[get("/join/<trip_details_id>")]
 | 
			
		||||
async fn join(db: &State<SqlitePool>, trip_details_id: i64, user: User) -> Flash<Redirect> {
 | 
			
		||||
    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!")
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user