use rocket::{ form::Form, response::{Flash, Redirect}, Route, State, }; use sea_orm::{ActiveModelTrait, DatabaseConnection, EntityTrait, Set}; use crate::models::{day, trip, user}; use super::NaiveDateForm; #[derive(FromForm)] struct RegisterForm { day: NaiveDateForm, #[field(validate = len(3..))] name: String, } #[put("/", data = "")] async fn register( db: &State, register: Form, user: user::Model, ) -> Redirect { let day = day::Entity::find_by_id(*register.day) .one(db.inner()) .await .unwrap() .expect("There's no trip on this date (yet)"); if !(day.open_registration || user.is_cox) { log::error!("{} tried to register, even though the user it should not be possible to do so via UI -> manually crafted request?", user.name); return Redirect::to("/"); } let user = user::Model::find_or_create_user(®ister.name, db.inner()).await; let day = format!("{}", day.day.format("%Y-%m-%d")); let trip = trip::ActiveModel { day: Set(day), user_id: Set(user.id), ..Default::default() }; log::info!("{} registered for {:?}", user.name, trip); trip.insert(db.inner()).await.unwrap(); Redirect::to("/") } #[derive(FromForm)] struct DeleteForm { day: NaiveDateForm, user: i32, } #[delete("/", data = "")] async fn delete( db: &State, delete: Form, user: user::Model, ) -> Flash { let day = day::Entity::find_by_id(*delete.day) .one(db.inner()) .await .unwrap() .expect("There's no trip on this date (yet)"); if delete.user != user.id { log::error!("{} tried to delete a registration from user_id {} on day {:?} (probably hand-crafted request)", user.name, delete.user, delete.day); return Flash::error( Redirect::to("/"), "Du kannst nur deine eigenen Anmeldungen löschen!", ); } let trip = trip::Entity::find_by_id((format!("{}", day.day.format("%Y-%m-%d")), user.id)) .one(db.inner()) .await .unwrap(); match trip { None => { log::error!("Tried to register w/o being authenticated (prob. hand crafted request (user.name = {})", user.name); return Flash::error(Redirect::to("/"), "Du bist gar nicht angemeldet!"); } Some(trip) => { log::info!("User {} deleted the registration for {:?}", user.name, trip); trip::Entity::delete(trip::ActiveModel { day: Set(trip.day), user_id: Set(trip.user_id), ..Default::default() }) .exec(db.inner()) .await .unwrap(); } } Flash::success(Redirect::to("/"), "Anmeldung erfolgreich gelöscht") } pub fn routes() -> Vec { routes![register, delete] }