aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorHarald Eilertsen <haraldei@anduin.net>2019-04-08 12:31:26 +0200
committerHarald Eilertsen <haraldei@anduin.net>2019-04-08 12:31:26 +0200
commita7c734d39512385177426bcb2131726906ce2fff (patch)
tree9a42886afebda28ce712ea88f2250dd8b5e79134 /src
parent9c8b8a254a5223cd359df150279f78e644b58abb (diff)
downloadramaskrik-social-a7c734d39512385177426bcb2131726906ce2fff.tar.gz
ramaskrik-social-a7c734d39512385177426bcb2131726906ce2fff.tar.bz2
ramaskrik-social-a7c734d39512385177426bcb2131726906ce2fff.zip
Add endpoint to fetch screenings from the database.
Not entirely happy about the way this turned out for now. A more ergonomic return type from the models::screenings::get_all() function will be investigated.
Diffstat (limited to 'src')
-rw-r--r--src/controllers.rs1
-rw-r--r--src/controllers/screening.rs32
-rw-r--r--src/lib.rs5
-rw-r--r--src/models.rs1
-rw-r--r--src/models/screening.rs77
5 files changed, 114 insertions, 2 deletions
diff --git a/src/controllers.rs b/src/controllers.rs
index f5b1f08..40d910c 100644
--- a/src/controllers.rs
+++ b/src/controllers.rs
@@ -18,3 +18,4 @@
pub mod film;
pub mod room;
+pub mod screening;
diff --git a/src/controllers/screening.rs b/src/controllers/screening.rs
new file mode 100644
index 0000000..d060eb7
--- /dev/null
+++ b/src/controllers/screening.rs
@@ -0,0 +1,32 @@
+/*
+ Social program for Ramaskrik.
+ Copyright (C) 2019 Harald Eilertsen <haraldei@anduin.net>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
+*/
+
+use crate::{
+ db,
+ models::{screening::{self, Screening}, film::Film, room::Room},
+};
+
+use rocket::get;
+use rocket_contrib::{
+ json::Json,
+};
+
+#[get("/")]
+pub fn get_screenings(db: db::Connection) -> Json<Vec<(Screening, Option<Film>, Option<Room>)>> {
+ Json(screening::get_all(&db).unwrap())
+}
diff --git a/src/lib.rs b/src/lib.rs
index a0eabc8..6554e7c 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -23,7 +23,7 @@ mod controllers;
pub mod db;
pub mod models;
pub mod schema;
-use crate::controllers::{film, room};
+use crate::controllers::{film, room, screening};
use rocket::routes;
use std::collections::HashMap;
@@ -44,5 +44,6 @@ pub fn build_rocket(db_url: &str) -> Result<rocket::Rocket, Box<dyn Error>> {
.attach(db::Connection::fairing())
.mount("/", rocket_contrib::serve::StaticFiles::from("./public"))
.mount("/rooms", routes![room::get_rooms])
- .mount("/films", routes![film::get_films]))
+ .mount("/films", routes![film::get_films])
+ .mount("/screenings", routes![screening::get_screenings]))
}
diff --git a/src/models.rs b/src/models.rs
index f5b1f08..40d910c 100644
--- a/src/models.rs
+++ b/src/models.rs
@@ -18,3 +18,4 @@
pub mod film;
pub mod room;
+pub mod screening;
diff --git a/src/models/screening.rs b/src/models/screening.rs
new file mode 100644
index 0000000..cd08e88
--- /dev/null
+++ b/src/models/screening.rs
@@ -0,0 +1,77 @@
+/*
+ Social program for Ramaskrik.
+ Copyright (C) 2019 Harald Eilertsen <haraldei@anduin.net>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
+*/
+
+use crate::{
+ db::Connection,
+ models::{film::Film, room::Room},
+ schema::*,
+};
+use diesel::prelude::*;
+use serde_derive::{Deserialize, Serialize};
+
+joinable!(screenings -> rooms (room_id));
+joinable!(screenings -> films (film_id));
+
+#[derive(Deserialize, Identifiable, PartialEq, Serialize, Queryable)]
+pub struct Screening {
+ pub id: i32,
+ pub film_id: i32,
+ pub room_id: i32,
+ pub date: chrono::NaiveDate,
+ pub start_time: chrono::NaiveTime,
+ pub end_time: chrono::NaiveTime,
+}
+
+#[derive(Deserialize, Insertable)]
+#[table_name = "screenings"]
+pub struct NewScreening {
+ pub film_id: i32,
+ pub room_id: i32,
+ pub date: chrono::NaiveDate,
+ pub start_time: chrono::NaiveTime,
+ pub end_time: chrono::NaiveTime,
+}
+
+pub fn get_all(db: &Connection) -> QueryResult<Vec<(Screening, Option<Film>, Option<Room>)>> {
+ use crate::schema::screenings::dsl::*;
+ screenings
+ .left_join(films::table)
+ .left_join(rooms::table)
+ .get_results::<(Screening, Option<Film>, Option<Room>)>(&**db)
+}
+
+pub fn create(
+ room: &Room,
+ film: &Film,
+ date: chrono::NaiveDate,
+ start_time: chrono::NaiveTime,
+ end_time: chrono::NaiveTime,
+ db: &Connection) -> QueryResult<usize>
+{
+ let s = NewScreening {
+ room_id: room.id,
+ film_id: film.id,
+ date: date,
+ start_time: start_time,
+ end_time: end_time,
+ };
+
+ diesel::insert_into(screenings::table)
+ .values(&s)
+ .execute(&**db)
+}