use rocket::{ form::Form, get, post, request::FlashMessage, response::{Flash, Redirect}, routes, FromForm, Route, State, }; use rocket_dyn_templates::Template; use sqlx::SqlitePool; use tera::Context; use crate::model::{ boat::Boat, boatdamage::{BoatDamage, BoatDamageFixed, BoatDamageToAdd, BoatDamageVerified}, user::{CoxUser, TechUser, User}, }; #[get("/")] async fn index(db: &State, flash: Option>, user: User) -> Template { let boatdamages = BoatDamage::all(db).await; let boats = Boat::all(db).await; let mut context = Context::new(); if let Some(msg) = flash { context.insert("flash", &msg.into_inner()); } context.insert("boatdamages", &boatdamages); context.insert("boats", &boats); context.insert("loggedin_user", &user); Template::render("boatdamages", context.into_json()) } #[derive(FromForm)] pub struct FormBoatDamageToAdd<'r> { pub boat_id: i64, pub desc: &'r str, pub lock_boat: bool, } #[post("/", data = "")] async fn create<'r>( db: &State, data: Form>, coxuser: CoxUser, ) -> Flash { let boatdamage_to_add = BoatDamageToAdd { boat_id: data.boat_id, desc: data.desc, lock_boat: data.lock_boat, user_id_created: coxuser.id as i32, }; match BoatDamage::create(db, boatdamage_to_add).await { Ok(_) => Flash::success( Redirect::to("/boatdamage"), "Ausfahrt erfolgreich hinzugefĆ¼gt", ), Err(e) => Flash::error(Redirect::to("/boatdamage"), format!("Fehler: {e}")), } } #[derive(FromForm)] pub struct FormBoatDamageFixed<'r> { pub desc: &'r str, } #[post("//fixed", data = "")] async fn fixed<'r>( db: &State, data: Form>, boatdamage_id: i32, coxuser: CoxUser, ) -> Flash { let boatdamage = BoatDamage::find_by_id(db, boatdamage_id).await.unwrap(); //TODO: Fix let boatdamage_fixed = BoatDamageFixed { desc: data.desc, user_id_fixed: coxuser.id as i32, }; match boatdamage.fixed(db, boatdamage_fixed).await { Ok(_) => Flash::success(Redirect::to("/boatdamage"), "Successfully fixed the boat."), Err(e) => Flash::error(Redirect::to("/boatdamage"), format!("Error: {e}")), } } #[derive(FromForm)] pub struct FormBoatDamageVerified<'r> { pub desc: &'r str, } #[post("//verified", data = "")] async fn verified<'r>( db: &State, data: Form>, boatdamage_id: i32, techuser: TechUser, ) -> Flash { let boatdamage = BoatDamage::find_by_id(db, boatdamage_id).await.unwrap(); //TODO: Fix let boatdamage_verified = BoatDamageVerified { desc: data.desc, user_id_verified: techuser.id as i32, }; match boatdamage.verified(db, boatdamage_verified).await { Ok(_) => Flash::success( Redirect::to("/boatdamage"), "Successfully verified the boat.", ), Err(e) => Flash::error(Redirect::to("/boatdamage"), format!("Error: {e}")), } } pub fn routes() -> Vec { routes![index, create, fixed, verified] }