This commit is contained in:
2023-02-09 15:29:44 +01:00
parent 03dcfc6255
commit 9a72413934
12 changed files with 293 additions and 254 deletions

79
src/rest/mod.rs Normal file
View File

@ -0,0 +1,79 @@
mod restday;
mod restreg;
use std::ops::Deref;
use chrono::{Duration, Local, NaiveDate};
use rocket::{
form::{self, Form, ValueField},
fs::FileServer,
http::{Cookie, CookieJar},
response::Redirect,
Build, Rocket, State,
};
use rocket_dyn_templates::{context, Template};
use sea_orm::{Database, DatabaseConnection};
use super::models::{all::DayWithTrips, day, user};
#[derive(Debug)]
struct NaiveDateForm(NaiveDate);
impl<'v> rocket::form::FromFormField<'v> for NaiveDateForm {
fn from_value(field: ValueField<'v>) -> form::Result<'v, NaiveDateForm> {
let naivedate = chrono::NaiveDate::parse_from_str(&field.value, "%Y-%m-%d").unwrap(); //TODO:
//fixme
Ok(NaiveDateForm(naivedate))
}
}
impl Deref for NaiveDateForm {
type Target = NaiveDate;
fn deref(&self) -> &Self::Target {
&self.0
}
}
#[get("/")]
async fn index(db: &State<DatabaseConnection>, user: user::Model) -> Template {
let mut data = Vec::new();
for i in 0..6 {
let date = (Local::now() + Duration::days(i)).date_naive();
let day = day::Model::find_or_create_day(date, db.inner()).await;
data.push(DayWithTrips::new(day, db.inner()).await);
}
Template::render("index", context! { data, user })
}
#[get("/name")]
fn name() -> Template {
Template::render("name", context! {})
}
#[derive(FromForm)]
struct NameForm {
name: String,
}
#[put("/name", data = "<name>")]
fn savename(name: Form<NameForm>, cookies: &CookieJar) -> Redirect {
cookies.add(Cookie::new("name", name.name.clone()));
Redirect::to("/")
}
#[catch(401)] //unauthorized
fn unauthorized_error() -> Redirect {
Redirect::to("/name")
}
pub async fn start() -> Rocket<Build> {
rocket::build()
.attach(Template::fairing())
.manage(Database::connect("sqlite://db.sqlite").await.unwrap())
.mount("/public", FileServer::from("static/"))
.mount("/", routes![index, name, savename])
.mount("/day", restday::routes())
.mount("/register", restreg::routes())
.register("/", catchers![unauthorized_error])
}

44
src/rest/restday.rs Normal file
View File

@ -0,0 +1,44 @@
use rocket::{form::Form, response::Redirect, Route, State};
use sea_orm::{ActiveModelTrait, DatabaseConnection, EntityTrait, Set};
use crate::models::day;
use super::NaiveDateForm;
#[derive(FromForm, Debug)]
struct DayForm {
day: NaiveDateForm,
#[field(validate = range(0..20))]
planned_amount_cox: i32,
planned_starting_time: Option<String>,
open_registration: bool,
}
#[put("/", data = "<day>")]
async fn create(db: &State<DatabaseConnection>, day: Form<DayForm>) -> Redirect {
let new_day = day::ActiveModel {
day: Set(*day.day),
planned_amount_cox: Set(day.planned_amount_cox),
planned_starting_time: Set(day.planned_starting_time.clone()),
open_registration: Set(day.open_registration),
};
let day: Option<day::Model> = day::Entity::find_by_id(*day.day)
.one(db.inner())
.await
.unwrap();
match day {
Some(_) => {
new_day.update(db.inner()).await.unwrap(); //TODO: fixme
}
None => {
new_day.insert(db.inner()).await.unwrap(); //TODO: fixme
}
}
Redirect::to("/")
}
pub fn routes() -> Vec<Route> {
routes![create]
}

39
src/rest/restreg.rs Normal file
View File

@ -0,0 +1,39 @@
use rocket::{form::Form, response::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 = "<register>")]
async fn register(db: &State<DatabaseConnection>, register: Form<RegisterForm>) -> Redirect {
let day = day::Entity::find_by_id(*register.day)
.one(db.inner())
.await
.unwrap()
.expect("There's no trip on this date (yet)");
let user = user::Model::find_or_create_user(&register.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()
};
trip.insert(db.inner()).await.unwrap();
Redirect::to("/")
}
pub fn routes() -> Vec<Route> {
routes![register]
}