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