From f602e8c36d5c7297e31e0d3660815d094a23d7df Mon Sep 17 00:00:00 2001 From: Jordan Petridis Date: Tue, 19 Dec 2017 11:04:44 +0200 Subject: [PATCH] EpisodesView: Create a DieselModel for EpisodeViewWidget. --- hammond-data/src/dbqueries.rs | 33 +++++++++++++---------- hammond-data/src/models/queryables.rs | 39 +++++++++++++++++++++++++++ hammond-data/src/utils.rs | 4 +++ hammond-gtk/src/views/episodes.rs | 7 ++--- 4 files changed, 66 insertions(+), 17 deletions(-) diff --git a/hammond-data/src/dbqueries.rs b/hammond-data/src/dbqueries.rs index 5e26fcd..47b59ef 100644 --- a/hammond-data/src/dbqueries.rs +++ b/hammond-data/src/dbqueries.rs @@ -2,7 +2,7 @@ use diesel::prelude::*; use diesel; -use models::queryables::{Episode, EpisodeWidgetQuery, Podcast, Source}; +use models::queryables::{Episode, EpisodeViewWidgetQuery, EpisodeWidgetQuery, Podcast, Source}; use chrono::prelude::*; use errors::*; @@ -84,26 +84,31 @@ pub fn get_episodes_with_limit(limit: u32) -> Result> { .load::(&*con)?) } -pub fn get_episodeswidgets_with_limit(limit: u32) -> Result> { - use schema::episode::dsl::*; +pub fn get_episodes_view_widgets_with_limit(limit: u32) -> Result> { + use schema::{episode, podcast}; + + joinable!(episode -> podcast (rowid)); + allow_tables_to_appear_in_same_query!(episode, podcast); let db = connection(); let con = db.get()?; - Ok(episode + Ok(episode::table + .left_join(podcast::table) .select(( - rowid, - title, - uri, - local_uri, - epoch, - length, - played, - podcast_id, + episode::rowid, + episode::title, + episode::uri, + episode::local_uri, + episode::epoch, + episode::length, + episode::played, + episode::podcast_id, + (podcast::image_uri).nullable(), )) - .order(epoch.desc()) + .order(episode::epoch.desc()) .limit(i64::from(limit)) - .load::(&*con)?) + .load::(&*con)?) } pub fn get_podcast_from_id(pid: i32) -> Result { diff --git a/hammond-data/src/models/queryables.rs b/hammond-data/src/models/queryables.rs index 4290979..e87d8b6 100644 --- a/hammond-data/src/models/queryables.rs +++ b/hammond-data/src/models/queryables.rs @@ -320,6 +320,45 @@ impl EpisodeWidgetQuery { } } +impl From for EpisodeWidgetQuery { + fn from(view: EpisodeViewWidgetQuery) -> EpisodeWidgetQuery { + EpisodeWidgetQuery { + rowid: view.rowid, + title: view.title, + uri: view.uri, + local_uri: view.local_uri, + epoch: view.epoch, + length: view.length, + played: view.played, + // favorite: view.favorite, + // archive: view.archive, + podcast_id: view.podcast_id, + } + } +} + +#[derive(Queryable, Debug, Clone)] +/// Diesel Model to be used for constructing `EpisodeWidgets`. +pub struct EpisodeViewWidgetQuery { + rowid: i32, + title: String, + uri: Option, + local_uri: Option, + epoch: i32, + length: Option, + played: Option, + // favorite: bool, + // archive: bool, + podcast_id: i32, + image_uri: Option, +} + +impl EpisodeViewWidgetQuery { + pub fn image_uri(&self) -> Option<&str> { + self.image_uri.as_ref().map(|s| s.as_str()) + } +} + #[derive(Queryable, Identifiable, AsChangeset, Associations, PartialEq)] #[belongs_to(Source, foreign_key = "source_id")] #[changeset_options(treat_none_as_null = "true")] diff --git a/hammond-data/src/utils.rs b/hammond-data/src/utils.rs index fb9fe1e..f15c757 100644 --- a/hammond-data/src/utils.rs +++ b/hammond-data/src/utils.rs @@ -14,6 +14,8 @@ use std::path::Path; use std::fs; fn download_checker() -> Result<()> { + // TODO: give it it's own diesel model, + // so it does not pull useless and expensive stuff like description. let episodes = dbqueries::get_downloaded_episodes()?; episodes @@ -35,6 +37,8 @@ fn checker_helper(ep: &mut Episode) { } fn played_cleaner() -> Result<()> { + // TODO: give it it's own diesel model, + // so it does not pull useless and expensive stuff like description. let episodes = dbqueries::get_played_episodes()?; let now_utc = Utc::now().timestamp() as i32; diff --git a/hammond-gtk/src/views/episodes.rs b/hammond-gtk/src/views/episodes.rs index e418a44..37b18c3 100644 --- a/hammond-gtk/src/views/episodes.rs +++ b/hammond-gtk/src/views/episodes.rs @@ -31,7 +31,7 @@ impl EpisodesView { pub fn new() -> Rc { let view = EpisodesView::default(); - let episodes = dbqueries::get_episodeswidgets_with_limit(100).unwrap(); + let episodes = dbqueries::get_episodes_view_widgets_with_limit(100).unwrap(); let frame = gtk::Frame::new("Recent Episodes"); let list = gtk::ListBox::new(); @@ -43,8 +43,9 @@ impl EpisodesView { list.set_visible(true); list.set_selection_mode(gtk::SelectionMode::None); - episodes.into_iter().for_each(|mut ep| { - let viewep = EpisodesViewWidget::new(&mut ep); + episodes.into_iter().for_each(|ep| { + info!("{:?}", &ep.image_uri()); + let viewep = EpisodesViewWidget::new(&mut ep.into()); list.add(&viewep.container); let sep = gtk::Separator::new(gtk::Orientation::Vertical);