From c9d4bf9bd30060d9d308c8f2ec7dc664838729c5 Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Sun, 27 Sep 2020 16:07:22 +0200
Subject: [PATCH] Fixes several issues

---
 src/dto.rs         | 11 +++++------
 src/dto_helpers.rs | 17 +++++++++--------
 src/main.rs        | 14 +++++---------
 3 files changed, 19 insertions(+), 23 deletions(-)

diff --git a/src/dto.rs b/src/dto.rs
index 7947f0e..3ce7061 100644
--- a/src/dto.rs
+++ b/src/dto.rs
@@ -1,8 +1,8 @@
 use serde::{Deserialize, Serialize};
 
 use crate::config::Config;
-use crate::models::*;
 use crate::dto_helpers::{absolute_url, UrlKind};
+use crate::models::*;
 
 #[derive(Serialize, Deserialize, PartialEq, Debug)]
 #[serde(rename_all = "camelCase")]
@@ -37,7 +37,7 @@ impl TitleDto {
         images: Vec<ImageDto>,
         media: Vec<MediaDto>,
         subtitles: Vec<SubtitleDto>,
-        preview: Option<String>
+        preview: Option<String>,
     ) -> Self {
         TitleDto {
             ids: TitleIdDto {
@@ -206,7 +206,7 @@ impl ImageDto {
         Ok(ImageDto {
             kind: src.kind,
             mime: src.mime,
-            src: absolute_url(config, UrlKind::Static,src.src)?,
+            src: absolute_url(config, UrlKind::Static, src.src)?,
         })
     }
 }
@@ -264,7 +264,7 @@ impl SubtitleDto {
             language: src.language,
             region: src.region,
             specifier: src.specifier,
-            src: absolute_url(config, UrlKind::Static,src.src)?,
+            src: absolute_url(config, UrlKind::Static, src.src)?,
         })
     }
 }
@@ -280,6 +280,5 @@ pub struct GenreWithTitlesDto {
 #[serde(rename_all = "camelCase")]
 pub struct TitleMetaDto {
     pub title: TitleDto,
-    pub show: Option<TitleDto>,
-    pub episodes: Vec<EpisodeDto>,
+    pub show: Option<EpisodeDto>,
 }
\ No newline at end of file
diff --git a/src/dto_helpers.rs b/src/dto_helpers.rs
index bc51807..90be9f4 100644
--- a/src/dto_helpers.rs
+++ b/src/dto_helpers.rs
@@ -11,6 +11,7 @@ pub fn load_episodes(db: &PgConnection, config: &Config, title_id: Uuid) -> Quer
     let titles: Vec<(TitleEpisode, Title)> = title_episodes::table
         .filter(title_episodes::show_id.eq(title_id))
         .inner_join(titles::table.on(titles::id.eq(title_episodes::episode_id)))
+        .order((title_episodes::season_number.asc(), title_episodes::episode_number.asc(), title_episodes::air_date.asc()))
         .load::<(TitleEpisode, Title)>(db)?;
     let (episodes, titles): (Vec<TitleEpisode>, Vec<Title>) = titles.into_iter().unzip();
     let titles = load_titles(db, config, titles)?;
@@ -19,13 +20,12 @@ pub fn load_episodes(db: &PgConnection, config: &Config, title_id: Uuid) -> Quer
         .collect::<Vec<_>>())
 }
 
-pub fn load_show(db: &PgConnection, config: &Config, title_id: Uuid) -> QueryResult<TitleDto> {
-    let show = title_episodes::table
+pub fn load_show(db: &PgConnection, config: &Config, title_id: Uuid) -> QueryResult<EpisodeDto> {
+    let (episode, show) = title_episodes::table
         .filter(title_episodes::episode_id.eq(title_id))
         .inner_join(titles::table.on(titles::id.eq(title_episodes::show_id)))
-        .select(titles::all_columns)
-        .first::<Title>(db)?;
-    load_title(db, config, show)
+        .first::<(TitleEpisode, Title)>(db)?;
+    Ok(EpisodeDto::of(episode, load_title(db, config, show)?))
 }
 
 pub fn load_title(db: &PgConnection, config: &Config, title: Title) -> QueryResult<TitleDto> {
@@ -47,14 +47,15 @@ pub fn load_title(db: &PgConnection, config: &Config, title: Title) -> QueryResu
         .load::<TitleMedium>(db)?;
     let title_subtitles: Vec<TitleSubtitle> = TitleSubtitle::belonging_to(&title)
         .load::<TitleSubtitle>(db)?;
-    let title_preview: TitlePreview = TitlePreview::belonging_to(&title)
-        .first::<TitlePreview>(db)?;
+    let title_preview: Option<TitlePreview> = TitlePreview::belonging_to(&title)
+        .first::<TitlePreview>(db)
+        .optional()?;
     Ok(process_title(
         config,
         title, title_names, title_descriptions,
         title_cast, title_genres, title_ratings,
         title_images, title_media, title_subtitles,
-        Some(title_preview),
+        title_preview,
     ))
 }
 
diff --git a/src/main.rs b/src/main.rs
index 760a2fb..7e17269 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -19,7 +19,7 @@ use url::Url;
 
 use media_backend::config::Config;
 use media_backend::dto::*;
-use media_backend::dto_helpers::{load_title, load_titles, load_episodes, load_show};
+use media_backend::dto_helpers::{load_episodes, load_show, load_title, load_titles};
 use media_backend::models::*;
 use media_backend::param_helpers::ParamUuid;
 
@@ -74,15 +74,10 @@ fn get_title(db: MediaflixConnection, config: State<Config>, title_id: ParamUuid
     match title.kind.as_str() {
         "episode" => {
             let show = load_show(&db.0, &config, title.ids.uuid)?;
-            let episodes = load_episodes(&db.0, &config, show.ids.uuid)?;
-            Ok(Json(TitleMetaDto { title, show: Some(show), episodes }))
-        }
-        "show" => {
-            let episodes = load_episodes(&db.0, &config, title.ids.uuid)?;
-            Ok(Json(TitleMetaDto { title, show: None, episodes }))
+            Ok(Json(TitleMetaDto { title, show: Some(show) }))
         }
         _ => {
-            Ok(Json(TitleMetaDto { title, show: None, episodes: vec![] }))
+            Ok(Json(TitleMetaDto { title, show: None }))
         }
     }
 }
@@ -106,7 +101,8 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
                 list_genres,
                 get_genre,
                 list_titles,
-                get_title
+                get_title,
+                list_episodes
             ],
         )
         .mount("/static", StaticFiles::from(env::var("MEDIAFLIX_PATH")?))
-- 
GitLab