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 | # Notes / Bugfixes | ||||||
| - [ ] Allow cox to edit own trip | - [ ] 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 max_people (to be settable to 0) | ||||||
| 	- [ ] Change note | 	- [ ] Change note | ||||||
|  |  | ||||||
|   | |||||||
| @@ -50,7 +50,7 @@ WHERE day=? | |||||||
|         ret |         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!( |         sqlx::query_as!( | ||||||
|             Registration, |             Registration, | ||||||
|             " |             " | ||||||
| @@ -58,7 +58,7 @@ SELECT | |||||||
|     (SELECT name FROM user WHERE user_trip.user_id = user.id) as name, |     (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  |     (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 = ?)", | FROM user_trip WHERE trip_details_id = (SELECT trip_details_id FROM trip WHERE id = ?)", | ||||||
|             id |             trip_id | ||||||
|         ) |         ) | ||||||
|         .fetch_all(db) |         .fetch_all(db) | ||||||
|         .await |         .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!( |         let _ = sqlx::query!( | ||||||
|             "DELETE FROM trip WHERE cox_id = ? AND planned_event_id = ?", |             "DELETE FROM trip WHERE cox_id = ? AND planned_event_id = ?", | ||||||
|             user_id, |             user_id, | ||||||
| @@ -122,9 +122,44 @@ FROM user_trip WHERE trip_details_id = (SELECT trip_details_id FROM trip WHERE i | |||||||
|         .await |         .await | ||||||
|         .is_ok(); |         .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 { | pub enum CoxHelpError { | ||||||
|     AlreadyRegisteredAsRower, |     AlreadyRegisteredAsRower, | ||||||
|     AlreadyRegisteredAsCox, |     AlreadyRegisteredAsCox, | ||||||
| } | } | ||||||
|  |  | ||||||
|  | pub enum TripDeleteError { | ||||||
|  |     SomebodyAlreadyRegistered, | ||||||
|  |     NotYourTrip, | ||||||
|  | } | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ use rocket::{ | |||||||
| use sqlx::SqlitePool; | use sqlx::SqlitePool; | ||||||
|  |  | ||||||
| use crate::model::{ | use crate::model::{ | ||||||
|     trip::{CoxHelpError, Trip}, |     trip::{CoxHelpError, Trip, TripDeleteError}, | ||||||
|     tripdetails::TripDetails, |     tripdetails::TripDetails, | ||||||
|     user::CoxUser, |     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>")] | #[get("/remove/<planned_event_id>")] | ||||||
| async fn remove(db: &State<SqlitePool>, planned_event_id: i64, cox: CoxUser) -> Flash<Redirect> { | async fn remove(db: &State<SqlitePool>, planned_event_id: i64, cox: CoxUser) -> Flash<Redirect> { | ||||||
|     //TODO: Check if > 2 hrs to event |     Trip::delete_by_planned_event_id(db, cox.id, planned_event_id).await; | ||||||
|  |  | ||||||
|     Trip::delete(db, cox.id, planned_event_id).await; |  | ||||||
|  |  | ||||||
|     Flash::success(Redirect::to("/"), "Erfolgreich abgemeldet!") |     Flash::success(Redirect::to("/"), "Erfolgreich abgemeldet!") | ||||||
| } | } | ||||||
|  |  | ||||||
| pub fn routes() -> Vec<Route> { | pub fn routes() -> Vec<Route> { | ||||||
|     routes![create, join, remove] |     routes![create, join, remove, remove_trip] | ||||||
| } | } | ||||||
|   | |||||||
| @@ -179,6 +179,7 @@ | |||||||
|             </div> |             </div> | ||||||
|             {% endif %} |             {% endif %} | ||||||
|           </div> |           </div> | ||||||
|  | 	  <div><a href="/cox/remove/trip/{{ trip.id }}">LÖSCHEN</a></div> | ||||||
|         </div> |         </div> | ||||||
|         <div class="sidebar-overlay" data-trigger="detailTrip{{ trip.trip_details_id }}"></div> |         <div class="sidebar-overlay" data-trigger="detailTrip{{ trip.trip_details_id }}"></div> | ||||||
|         {% endfor %} |         {% endfor %} | ||||||
| @@ -259,4 +260,4 @@ | |||||||
|   {% endfor %} |   {% endfor %} | ||||||
| </div> | </div> | ||||||
| </div> | </div> | ||||||
| {% endblock content %} | {% endblock content %} | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user