use chrono::NaiveDateTime; 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, logbook::Logbook, logtype::LogType, user::{AdminUser, User}, }; #[get("/")] async fn index( db: &State, flash: Option>, adminuser: AdminUser, ) -> Template { let boats = Boat::all(db).await; let users = User::cox(db).await; let logtypes = LogType::all(db).await; let on_water = Logbook::on_water(db).await; let completed = Logbook::completed(db).await; let mut context = Context::new(); if let Some(msg) = flash { context.insert("flash", &msg.into_inner()); } context.insert("boats", &boats); context.insert("users", &users); context.insert("logtypes", &logtypes); context.insert("loggedin_user", &adminuser.user); context.insert("on_water", &on_water); context.insert("completed", &completed); Template::render("log", context.into_json()) } #[derive(FromForm)] struct LogAddForm { boat_id: i64, shipmaster: i64, shipmaster_only_steering: bool, departure: String, arrival: Option, destination: Option, distance_in_km: Option, comments: Option, logtype: Option, } #[post("/", data = "")] async fn create( db: &State, data: Form, _adminuser: AdminUser, ) -> Flash { if Logbook::create( db, data.boat_id, data.shipmaster, data.shipmaster_only_steering, NaiveDateTime::parse_from_str(&data.departure, "%Y-%m-%dT%H:%M").unwrap(), //TODO: fix data.arrival .clone() .map(|a| NaiveDateTime::parse_from_str(&a, "%Y-%m-%dT%H:%M").unwrap()), //TODO: fix data.destination.clone(), //TODO: fix data.distance_in_km, data.comments.clone(), //TODO: fix data.logtype, ) .await { Flash::success(Redirect::to("/log"), "Ausfahrt erfolgreich hinzugefügt") } else { Flash::error(Redirect::to("/log"), format!("Fehler beim hinzufügen!")) } } pub fn routes() -> Vec { routes![index, create] } #[cfg(test)] mod test {}