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.rs49
1 files changed, 48 insertions, 1 deletions
diff --git a/src/controllers/screening.rs b/src/controllers/screening.rs
index 40eefd3..cf7d1b1 100644
--- a/src/controllers/screening.rs
+++ b/src/controllers/screening.rs
@@ -22,7 +22,7 @@ use crate::{
};
use std::result::Result;
-use rocket::{delete, get, post};
+use rocket::{delete, get, patch, post};
use rocket::request::{Form, FromForm};
use rocket::response::Redirect;
use rocket_contrib::{
@@ -96,6 +96,53 @@ pub fn create_screening(db: db::Connection, screening: Form<NewScreeningForm>) -
Ok(Redirect::to("/screenings"))
}
+#[get("/<id>")]
+pub fn edit(db: db::Connection, id: i32) -> Result<Template, Box<dyn Error>> {
+ #[derive(Serialize)]
+ struct Context {
+ screening: models::Screening,
+ rooms: Vec<models::Room>,
+ films: Vec<models::Film>,
+ }
+
+ let ctx = Context {
+ screening: db.get_screening(id)?,
+ rooms: db.get_rooms()?,
+ films: db.get_films()?,
+ };
+
+ Ok(Template::render("screening/edit", &ctx))
+}
+
+#[derive(FromForm)]
+pub struct EditScreeningForm {
+ id: i32,
+ film_id: i32,
+ room_id: i32,
+ date: String,
+ start_time: String,
+ end_time: String,
+}
+
+#[patch("/", format = "application/x-www-form-urlencoded", data = "<screening>")]
+pub fn update(db: db::Connection, screening: Form<EditScreeningForm>) -> Result<Redirect, Box<dyn Error>> {
+ let start_time = parse_datetime(&screening.date, &screening.start_time)?;
+ let mut end_time = parse_datetime(&screening.date, &screening.end_time)?;
+
+ if end_time < start_time {
+ end_time = end_time + chrono::Duration::days(1);
+ }
+
+ db.update_screening(
+ screening.id,
+ screening.room_id,
+ screening.film_id,
+ start_time,
+ end_time)?;
+
+ Ok(Redirect::to("/screenings"))
+}
+
#[derive(FromForm)]
pub struct DeleteScreeningForm {
screening_id: i32,