From 0ac32b7e08b270fccc54d93861c025fa01c68a89 Mon Sep 17 00:00:00 2001 From: Harald Eilertsen Date: Sun, 23 Aug 2020 13:24:01 +0200 Subject: Implement adding and listing films. --- src/controllers/film.rs | 42 +++++++++++++++++++++++++++++++++++++++--- src/db.rs | 7 +++++++ src/lib.rs | 2 +- templates/film/list.tera | 26 ++++++++++++++++++++++++++ templates/film/new.tera | 15 +++++++++++++++ 5 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 templates/film/list.tera create mode 100644 templates/film/new.tera diff --git a/src/controllers/film.rs b/src/controllers/film.rs index 827b3ab..70a6042 100644 --- a/src/controllers/film.rs +++ b/src/controllers/film.rs @@ -21,12 +21,48 @@ use crate::{ models, }; -use rocket::get; +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::collections::HashMap; +use std::error::Error; +use std::result::Result; -#[get("/")] -pub fn get_films(db: db::Connection) -> Json> { +#[get("/", format = "application/json", rank = 1)] +pub fn get_films_json(db: db::Connection) -> Json> { Json(db.get_films().unwrap()) } + +#[get("/", rank = 2)] +pub fn list_films(db: db::Connection) -> Result> { + #[derive(Serialize)] + struct Context { + films: Vec, + } + + let ctx = Context { films: db.get_films()? }; + Ok(Template::render("film/list", &ctx)) +} + +#[get("/new")] +pub fn new_film() -> Result> { + let ctx: HashMap = HashMap::new(); + Ok(Template::render("film/new", &ctx)) +} + +#[derive(FromForm)] +pub struct NewFilmForm { + title: String, + url: Option, +} + +#[post("/", format = "application/x-www-form-urlencoded", data = "")] +pub fn create_film(db: db::Connection, film: Form) -> Result> { + db.create_film(&film.title, &film.url)?; + Ok(Redirect::to("/films")) +} diff --git a/src/db.rs b/src/db.rs index 09b6f4f..60ff4fc 100644 --- a/src/db.rs +++ b/src/db.rs @@ -86,6 +86,13 @@ impl Connection { .get_result(&**self) } + pub fn create_film(&self, film_title: &str, film_url: &Option) -> QueryResult { + use crate::schema::films::dsl::*; + diesel::insert_into(films) + .values(&(title.eq(film_title), url.eq(film_url))) + .execute(&**self) + } + pub fn get_films(&self) -> QueryResult> { use crate::schema::films::dsl::*; films.load(&**self) diff --git a/src/lib.rs b/src/lib.rs index 41eea66..76e4df8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -45,6 +45,6 @@ pub fn build_rocket(db_url: &str) -> Result> { .attach(rocket_contrib::templates::Template::fairing()) .mount("/", rocket_contrib::serve::StaticFiles::from("./public")) .mount("/rooms", routes![room::get_rooms_json, room::list_rooms, room::new_room, room::create_room]) - .mount("/films", routes![film::get_films]) + .mount("/films", routes![film::get_films_json, film::list_films, film::new_film, film::create_film]) .mount("/screenings", routes![screening::get_aggregated_screenings])) } diff --git a/templates/film/list.tera b/templates/film/list.tera new file mode 100644 index 0000000..e5676b8 --- /dev/null +++ b/templates/film/list.tera @@ -0,0 +1,26 @@ + + + +Room list + + +

Films

+ +

+Add film

+ +{% if films | length <= 0%} +No films defined. +{% else %} + +{% endif %} + + diff --git a/templates/film/new.tera b/templates/film/new.tera new file mode 100644 index 0000000..30d567e --- /dev/null +++ b/templates/film/new.tera @@ -0,0 +1,15 @@ + + + +New film + + +

New film

+ +
+ + + +
+ + -- cgit v1.2.3