diff options
Diffstat (limited to 'src/controllers')
-rw-r--r-- | src/controllers/film.rs | 42 |
1 files changed, 39 insertions, 3 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")) +} |