forked from Ruderverein-Donau-Linz/rowt
		
	allow trip to be deleted if noone has registered yet
This commit is contained in:
		| @@ -3,7 +3,7 @@ | ||||
|  | ||||
| # Notes / Bugfixes | ||||
| - [ ] Allow cox to edit own trip | ||||
| 	- [ ] Nobody has registered yet -> deletable | ||||
| 	- [x] Nobody has registered yet -> deletable | ||||
| 	- [ ] Change max_people (to be settable to 0) | ||||
| 	- [ ] Change note | ||||
|  | ||||
|   | ||||
| @@ -50,7 +50,7 @@ WHERE day=? | ||||
|         ret | ||||
|     } | ||||
|  | ||||
|     async fn get_all_rower_for_id(db: &SqlitePool, id: i64) -> Vec<Registration> { | ||||
|     async fn get_all_rower_for_id(db: &SqlitePool, trip_id: i64) -> Vec<Registration> { | ||||
|         sqlx::query_as!( | ||||
|             Registration, | ||||
|             " | ||||
| @@ -58,7 +58,7 @@ 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 trip WHERE id = ?)", | ||||
|             id | ||||
|             trip_id | ||||
|         ) | ||||
|         .fetch_all(db) | ||||
|         .await | ||||
| @@ -112,7 +112,7 @@ FROM user_trip WHERE trip_details_id = (SELECT trip_details_id FROM trip WHERE i | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     pub async fn delete(db: &SqlitePool, user_id: i64, planned_event_id: i64) { | ||||
|     pub async fn delete_by_planned_event_id(db: &SqlitePool, user_id: i64, planned_event_id: i64) { | ||||
|         let _ = sqlx::query!( | ||||
|             "DELETE FROM trip WHERE cox_id = ? AND planned_event_id = ?", | ||||
|             user_id, | ||||
| @@ -122,9 +122,44 @@ FROM user_trip WHERE trip_details_id = (SELECT trip_details_id FROM trip WHERE i | ||||
|         .await | ||||
|         .is_ok(); | ||||
|     } | ||||
|  | ||||
|     pub(crate) async fn delete( | ||||
|         db: &SqlitePool, | ||||
|         user_id: i64, | ||||
|         trip_id: i64, | ||||
|     ) -> Result<(), TripDeleteError> { | ||||
|         let registered_rower = Self::get_all_rower_for_id(db, trip_id).await; | ||||
|         if registered_rower.len() > 0 { | ||||
|             return Err(TripDeleteError::SomebodyAlreadyRegistered); | ||||
|         } | ||||
|  | ||||
|         let trip_cox = sqlx::query!("SELECT cox_id FROM trip WHERE id = ?", trip_id) | ||||
|             .fetch_one(db) | ||||
|             .await | ||||
|             .unwrap(); //TODO: fixme | ||||
|         if trip_cox.cox_id != user_id { | ||||
|             return Err(TripDeleteError::NotYourTrip); | ||||
|         } | ||||
|  | ||||
|         sqlx::query!( | ||||
|             "DELETE FROM trip WHERE cox_id = ? AND id = ?", | ||||
|             user_id, | ||||
|             trip_id | ||||
|         ) | ||||
|         .execute(db) | ||||
|         .await | ||||
|         .unwrap(); //TODO: fixme | ||||
|  | ||||
|         Ok(()) | ||||
|     } | ||||
| } | ||||
|  | ||||
| pub enum CoxHelpError { | ||||
|     AlreadyRegisteredAsRower, | ||||
|     AlreadyRegisteredAsCox, | ||||
| } | ||||
|  | ||||
| pub enum TripDeleteError { | ||||
|     SomebodyAlreadyRegistered, | ||||
|     NotYourTrip, | ||||
| } | ||||
|   | ||||
| @@ -7,7 +7,7 @@ use rocket::{ | ||||
| use sqlx::SqlitePool; | ||||
|  | ||||
| use crate::model::{ | ||||
|     trip::{CoxHelpError, Trip}, | ||||
|     trip::{CoxHelpError, Trip, TripDeleteError}, | ||||
|     tripdetails::TripDetails, | ||||
|     user::CoxUser, | ||||
| }; | ||||
| @@ -53,15 +53,27 @@ async fn join(db: &State<SqlitePool>, planned_event_id: i64, cox: CoxUser) -> Fl | ||||
|     } | ||||
| } | ||||
|  | ||||
| #[get("/remove/trip/<trip_id>")] | ||||
| async fn remove_trip(db: &State<SqlitePool>, trip_id: i64, cox: CoxUser) -> Flash<Redirect> { | ||||
|     match Trip::delete(db, cox.id, trip_id).await { | ||||
|         Ok(_) => Flash::success(Redirect::to("/"), "Erfolgreich abgemeldet!"), | ||||
|         Err(TripDeleteError::SomebodyAlreadyRegistered) => Flash::error( | ||||
|             Redirect::to("/"), | ||||
|             "Ausfahrt kann nicht gelöscht werden, da bereits jemand registriert ist!", | ||||
|         ), | ||||
|         Err(TripDeleteError::NotYourTrip) => { | ||||
|             Flash::error(Redirect::to("/"), "Nicht deine Ausfahrt!") | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| #[get("/remove/<planned_event_id>")] | ||||
| async fn remove(db: &State<SqlitePool>, planned_event_id: i64, cox: CoxUser) -> Flash<Redirect> { | ||||
|     //TODO: Check if > 2 hrs to event | ||||
|  | ||||
|     Trip::delete(db, cox.id, planned_event_id).await; | ||||
|     Trip::delete_by_planned_event_id(db, cox.id, planned_event_id).await; | ||||
|  | ||||
|     Flash::success(Redirect::to("/"), "Erfolgreich abgemeldet!") | ||||
| } | ||||
|  | ||||
| pub fn routes() -> Vec<Route> { | ||||
|     routes![create, join, remove] | ||||
|     routes![create, join, remove, remove_trip] | ||||
| } | ||||
|   | ||||
| @@ -179,6 +179,7 @@ | ||||
|             </div> | ||||
|             {% endif %} | ||||
|           </div> | ||||
| 	  <div><a href="/cox/remove/trip/{{ trip.id }}">LÖSCHEN</a></div> | ||||
|         </div> | ||||
|         <div class="sidebar-overlay" data-trigger="detailTrip{{ trip.trip_details_id }}"></div> | ||||
|         {% endfor %} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user