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 /src | |
parent | 2e611ce080ce4c9d3bb74ab9cd423a6b123e7043 (diff) | |
download | ramaskrik-social-0ac32b7e08b270fccc54d93861c025fa01c68a89.tar.gz ramaskrik-social-0ac32b7e08b270fccc54d93861c025fa01c68a89.tar.bz2 ramaskrik-social-0ac32b7e08b270fccc54d93861c025fa01c68a89.zip |
Implement adding and listing films.
Diffstat (limited to 'src')
-rw-r--r-- | src/controllers/film.rs | 42 | ||||
-rw-r--r-- | src/db.rs | 7 | ||||
-rw-r--r-- | src/lib.rs | 2 |
3 files changed, 47 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])) } |