diff options
author | Harald Eilertsen <haraldei@anduin.net> | 2020-08-23 13:24:01 +0200 |
---|---|---|
committer | Harald Eilertsen <haraldei@anduin.net> | 2020-08-23 13:24:01 +0200 |
commit | 0ac32b7e08b270fccc54d93861c025fa01c68a89 (patch) | |
tree | cb2939e0ef8029a46086b5bfaf9f643870e95be3 | |
parent | 2e611ce080ce4c9d3bb74ab9cd423a6b123e7043 (diff) | |
download | ramaskrik-social-0ac32b7e08b270fccc54d93861c025fa01c68a89.tar.gz ramaskrik-social-0ac32b7e08b270fccc54d93861c025fa01c68a89.tar.bz2 ramaskrik-social-0ac32b7e08b270fccc54d93861c025fa01c68a89.zip |
Implement adding and listing films.
-rw-r--r-- | src/controllers/film.rs | 42 | ||||
-rw-r--r-- | src/db.rs | 7 | ||||
-rw-r--r-- | src/lib.rs | 2 | ||||
-rw-r--r-- | templates/film/list.tera | 26 | ||||
-rw-r--r-- | templates/film/new.tera | 15 |
5 files changed, 88 insertions, 4 deletions
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<Vec<models::Film>> { +#[get("/", format = "application/json", rank = 1)] +pub fn get_films_json(db: db::Connection) -> Json<Vec<models::Film>> { Json(db.get_films().unwrap()) } + +#[get("/", rank = 2)] +pub fn list_films(db: db::Connection) -> Result<Template, Box<dyn Error>> { + #[derive(Serialize)] + struct Context { + films: Vec<models::Film>, + } + + let ctx = Context { films: db.get_films()? }; + Ok(Template::render("film/list", &ctx)) +} + +#[get("/new")] +pub fn new_film() -> Result<Template, Box<dyn Error>> { + let ctx: HashMap<String, String> = HashMap::new(); + Ok(Template::render("film/new", &ctx)) +} + +#[derive(FromForm)] +pub struct NewFilmForm { + title: String, + url: Option<String>, +} + +#[post("/", format = "application/x-www-form-urlencoded", data = "<film>")] +pub fn create_film(db: db::Connection, film: Form<NewFilmForm>) -> Result<Redirect, Box<dyn Error>> { + db.create_film(&film.title, &film.url)?; + Ok(Redirect::to("/films")) +} @@ -86,6 +86,13 @@ impl Connection { .get_result(&**self) } + pub fn create_film(&self, film_title: &str, film_url: &Option<String>) -> QueryResult<usize> { + 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<Vec<models::Film>> { use crate::schema::films::dsl::*; films.load(&**self) @@ -45,6 +45,6 @@ pub fn build_rocket(db_url: &str) -> Result<rocket::Rocket, Box<dyn Error>> { .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 @@ +<!DOCTYPE html> +<html> +<head> +<title>Room list</title> +</head> +<body> +<h1>Films</h1> + +<p> +<a href="/films/new">Add film</a></p> + +{% if films | length <= 0%} +No films defined. +{% else %} +<ul> +{% for r in films -%} + <li> + {% if r.url -%}<a href="{{ r.url }}">{% endif -%} + {{ r.title }} + {% if r.url -%}</a>{% endif -%} + ({{ r.id }}) +{% endfor -%} +</ul> +{% endif %} +</body> +</html> 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 @@ +<!DOCTYPE html> +<html> +<head> +<title>New film</title> +</head> +<body> +<h1>New film</h1> + +<form name="new_film_form" action="/films" method="POST"> + <label for="title">Title: </label><input name="title" type="text"> + <label for="url">Url: </label><input name="url" type="text"> + <input type="submit" value="Save"> +</form> +</body> +</html> |