aboutsummaryrefslogtreecommitdiffstats
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
parent2e611ce080ce4c9d3bb74ab9cd423a6b123e7043 (diff)
downloadramaskrik-social-0ac32b7e08b270fccc54d93861c025fa01c68a89.tar.gz
ramaskrik-social-0ac32b7e08b270fccc54d93861c025fa01c68a89.tar.bz2
ramaskrik-social-0ac32b7e08b270fccc54d93861c025fa01c68a89.zip
Implement adding and listing films.
-rw-r--r--src/controllers/film.rs42
-rw-r--r--src/db.rs7
-rw-r--r--src/lib.rs2
-rw-r--r--templates/film/list.tera26
-rw-r--r--templates/film/new.tera15
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"))
+}
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]))
}
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>