Push
This commit is contained in:
79
src/rest/mod.rs
Normal file
79
src/rest/mod.rs
Normal 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
44
src/rest/restday.rs
Normal 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
39
src/rest/restreg.rs
Normal 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(®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()
|
||||
};
|
||||
|
||||
trip.insert(db.inner()).await.unwrap();
|
||||
|
||||
Redirect::to("/")
|
||||
}
|
||||
|
||||
pub fn routes() -> Vec<Route> {
|
||||
routes![register]
|
||||
}
|
Reference in New Issue
Block a user