aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorHarald Eilertsen <haraldei@anduin.net>2020-08-23 13:24:01 +0200
committerHarald Eilertsen <haraldei@anduin.net>2020-08-23 13:24:01 +0200
commit0ac32b7e08b270fccc54d93861c025fa01c68a89 (patch)
treecb2939e0ef8029a46086b5bfaf9f643870e95be3 /src
parent2e611ce080ce4c9d3bb74ab9cd423a6b123e7043 (diff)
downloadramaskrik-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.rs42
-rw-r--r--src/db.rs7
-rw-r--r--src/lib.rs2
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"))
+}
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<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)
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<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]))
}