aboutsummaryrefslogtreecommitdiffstats
path: root/src/controllers/screening.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/controllers/screening.rs')
-rw-r--r--src/controllers/screening.rs60
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"))
+}