aboutsummaryrefslogtreecommitdiffstats
path: root/src/models
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/models
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/models')
-rw-r--r--src/models/screening.rs77
1 files changed, 77 insertions, 0 deletions
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)
+}