add kiosk mode
This commit is contained in:
105
src/tera/log.rs
105
src/tera/log.rs
@ -1,9 +1,9 @@
|
||||
use rocket::{
|
||||
form::Form,
|
||||
get, post,
|
||||
request::FlashMessage,
|
||||
request::{FlashMessage, FromRequest, self},
|
||||
response::{Flash, Redirect},
|
||||
routes, Route, State,
|
||||
routes, Route, State, Request, http::{CookieJar, Cookie}, time::{OffsetDateTime, Duration},
|
||||
};
|
||||
use rocket_dyn_templates::Template;
|
||||
use sqlx::SqlitePool;
|
||||
@ -16,6 +16,20 @@ use crate::model::{
|
||||
user::{AdminUser, User},
|
||||
};
|
||||
|
||||
pub struct KioskCookie(String);
|
||||
|
||||
#[rocket::async_trait]
|
||||
impl<'r> FromRequest<'r> for KioskCookie {
|
||||
type Error = std::convert::Infallible;
|
||||
|
||||
async fn from_request(request: &'r Request<'_>) -> request::Outcome<KioskCookie, Self::Error> {
|
||||
match request.cookies().get_private("kiosk") {
|
||||
Some(cookie) => request::Outcome::Success(KioskCookie(cookie.value().to_string())),
|
||||
None => request::Outcome::Forward(()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[get("/")]
|
||||
async fn index(
|
||||
db: &State<SqlitePool>,
|
||||
@ -48,7 +62,46 @@ async fn index(
|
||||
Template::render("log", context.into_json())
|
||||
}
|
||||
|
||||
#[post("/", data = "<data>")]
|
||||
|
||||
#[get("/kiosk/ekrv2019")]
|
||||
fn new_kiosk(
|
||||
flash: Option<FlashMessage<'_>>,
|
||||
cookies: &CookieJar<'_>,
|
||||
) -> Redirect {
|
||||
let mut cookie = Cookie::new("kiosk", format!("yes"));
|
||||
cookie.set_expires(OffsetDateTime::now_utc() + Duration::weeks(12));
|
||||
cookies.add_private(cookie);
|
||||
Redirect::to("/log/kiosk")
|
||||
}
|
||||
|
||||
#[get("/kiosk")]
|
||||
async fn kiosk(db: &State<SqlitePool>, flash: Option<FlashMessage<'_>>, _kiosk: KioskCookie) -> Template {
|
||||
let boats = Boat::all(db).await;
|
||||
let coxes = User::cox(db).await;
|
||||
let users = User::all(db).await;
|
||||
let logtypes = LogType::all(db).await;
|
||||
let distances = Logbook::distances(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("coxes", &coxes);
|
||||
context.insert("users", &users);
|
||||
context.insert("logtypes", &logtypes);
|
||||
context.insert("on_water", &on_water);
|
||||
context.insert("completed", &completed);
|
||||
context.insert("distances", &distances);
|
||||
|
||||
Template::render("kiosk", context.into_json())
|
||||
}
|
||||
|
||||
#[post("/", data = "<data>", rank=2)]
|
||||
async fn create(
|
||||
db: &State<SqlitePool>,
|
||||
data: Form<LogToAdd>,
|
||||
@ -68,7 +121,51 @@ async fn create(
|
||||
}
|
||||
}
|
||||
|
||||
#[post("/", data = "<data>")]
|
||||
async fn create_kiosk(
|
||||
db: &State<SqlitePool>,
|
||||
data: Form<LogToAdd>,
|
||||
) -> Flash<Redirect> {
|
||||
match Logbook::create(
|
||||
db,
|
||||
data.into_inner()
|
||||
)
|
||||
.await
|
||||
{
|
||||
Ok(_) => Flash::success(Redirect::to("/log/kiosk"), "Ausfahrt erfolgreich hinzugefügt"),
|
||||
Err(LogbookCreateError::BoatAlreadyOnWater) => Flash::error(Redirect::to("/log/kiosk"), format!("Boot schon am Wasser")),
|
||||
Err(LogbookCreateError::BoatLocked) => Flash::error(Redirect::to("/log/kiosk"), format!("Boot gesperrt")),
|
||||
Err(LogbookCreateError::BoatNotFound) => Flash::error(Redirect::to("/log/kiosk"), format!("Boot gibt's ned")),
|
||||
Err(LogbookCreateError::TooManyRowers(expected, actual)) => Flash::error(Redirect::to("/log/kiosk"), format!("Zu viele Ruderer (Boot fasst maximal {expected}, es wurden jedoch {actual} Ruderer ausgewählt)")),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#[post("/<logbook_id>", data = "<data>")]
|
||||
async fn home_kiosk(
|
||||
db: &State<SqlitePool>,
|
||||
data: Form<LogToFinalize>,
|
||||
logbook_id: i32,
|
||||
) -> Flash<Redirect> {
|
||||
let logbook = Logbook::find_by_id(db, logbook_id).await;
|
||||
let Some(logbook) = logbook else {
|
||||
return Flash::error(
|
||||
Redirect::to("/admin/log"),
|
||||
format!("Log with ID {} does not exist!", logbook_id),
|
||||
)
|
||||
};
|
||||
|
||||
match logbook.home(db, &User::find_by_id(db, logbook.shipmaster as i32).await.unwrap(), data.into_inner()).await {
|
||||
Ok(_) => Flash::success(Redirect::to("/log"), "Successfully updated log"),
|
||||
Err(_) => Flash::error(
|
||||
Redirect::to("/log"),
|
||||
format!("Logbook with ID {} could not be updated!", logbook_id),
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#[post("/<logbook_id>", data = "<data>", rank=2)]
|
||||
async fn home(
|
||||
db: &State<SqlitePool>,
|
||||
data: Form<LogToFinalize>,
|
||||
@ -93,7 +190,7 @@ async fn home(
|
||||
}
|
||||
|
||||
pub fn routes() -> Vec<Route> {
|
||||
routes![index, create, home]
|
||||
routes![index, create, create_kiosk, home, kiosk, home_kiosk, new_kiosk]
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
|
Reference in New Issue
Block a user