diff options
author | Harald Eilertsen <haraldei@anduin.net> | 2020-08-23 14:40:03 +0200 |
---|---|---|
committer | Harald Eilertsen <haraldei@anduin.net> | 2020-08-23 14:40:03 +0200 |
commit | 129e8d34906584b5e6c3eeeb18958fc5e2c39c33 (patch) | |
tree | 1508b341155d08c5acc068bd3dc829c0f7049cf2 /src/controllers | |
parent | 39a0268aa235ddf94bdee074cf664221711a1bb7 (diff) | |
download | ramaskrik-social-129e8d34906584b5e6c3eeeb18958fc5e2c39c33.tar.gz ramaskrik-social-129e8d34906584b5e6c3eeeb18958fc5e2c39c33.tar.bz2 ramaskrik-social-129e8d34906584b5e6c3eeeb18958fc5e2c39c33.zip |
Implement adding screenings in the web ui.
Diffstat (limited to 'src/controllers')
-rw-r--r-- | src/controllers/screening.rs | 60 |
1 files changed, 56 insertions, 4 deletions
diff --git a/src/controllers/screening.rs b/src/controllers/screening.rs index 5052075..b76ae65 100644 --- a/src/controllers/screening.rs +++ b/src/controllers/screening.rs @@ -18,15 +18,67 @@ use crate::{ db, - models::AggregatedScreening, + models, }; -use rocket::get; +use std::result::Result; +use rocket::{get, post}; +use rocket::request::{Form, FromForm}; +use rocket::response::Redirect; use rocket_contrib::{ json::Json, + templates::Template, }; +use serde::Serialize; +use std::error::Error; -#[get("/")] -pub fn get_aggregated_screenings(db: db::Connection) -> Json<Vec<AggregatedScreening>> { +#[get("/", format = "application/json")] +pub fn get_aggregated_screenings(db: db::Connection) -> Json<Vec<models::AggregatedScreening>> { Json(db.get_aggregated_screenings().unwrap()) } + +#[get("/", rank = 2)] +pub fn list_screenings(db: db::Connection) -> Result<Template, Box<dyn Error>> { + #[derive(Serialize)] + struct Context { + screenings: Vec<models::AggregatedScreening>, + } + + let ctx = Context { screenings: db.get_aggregated_screenings()? }; + Ok(Template::render("screening/list", &ctx)) +} + +#[get("/new")] +pub fn new_screening(db: db::Connection) -> Result<Template, Box<dyn Error>> { + #[derive(Serialize)] + struct Context { + rooms: Vec<models::Room>, + films: Vec<models::Film>, + } + + let ctx = Context { + rooms: db.get_rooms()?, + films: db.get_films()?, + }; + + Ok(Template::render("screening/new", &ctx)) +} + +#[derive(FromForm)] +pub struct NewScreeningForm { + film_id: i32, + room_id: i32, + date: String, + start_time: String, + end_time: String, +} + +#[post("/", format = "application/x-www-form-urlencoded", data = "<screening>")] +pub fn create_screening(db: db::Connection, screening: Form<NewScreeningForm>) -> Result<Redirect, Box<dyn Error>> { + let date = chrono::NaiveDate::parse_from_str(dbg!(&screening.date), "%Y-%m-%d")?; + let start_time = chrono::NaiveTime::parse_from_str(dbg!(&screening.start_time), "%H:%M")?; + let end_time = chrono::NaiveTime::parse_from_str(dbg!(&screening.end_time), "%H:%M")?; + + db.create_screening(dbg!(screening.room_id), dbg!(screening.film_id), date, start_time, end_time)?; + Ok(Redirect::to("/screenings")) +} |