EpisodesView: Create a DieselModel for EpisodeViewWidget.

This commit is contained in:
Jordan Petridis 2017-12-19 11:04:44 +02:00
parent 5220eaceee
commit f602e8c36d
No known key found for this signature in database
GPG Key ID: CEABAD9F5683B9A6
4 changed files with 66 additions and 17 deletions

View File

@ -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<Vec<Episode>> {
.load::<Episode>(&*con)?)
}
pub fn get_episodeswidgets_with_limit(limit: u32) -> Result<Vec<EpisodeWidgetQuery>> {
use schema::episode::dsl::*;
pub fn get_episodes_view_widgets_with_limit(limit: u32) -> Result<Vec<EpisodeViewWidgetQuery>> {
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::<EpisodeWidgetQuery>(&*con)?)
.load::<EpisodeViewWidgetQuery>(&*con)?)
}
pub fn get_podcast_from_id(pid: i32) -> Result<Podcast> {

View File

@ -320,6 +320,45 @@ impl EpisodeWidgetQuery {
}
}
impl From<EpisodeViewWidgetQuery> 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<String>,
local_uri: Option<String>,
epoch: i32,
length: Option<i32>,
played: Option<i32>,
// favorite: bool,
// archive: bool,
podcast_id: i32,
image_uri: Option<String>,
}
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")]

View File

@ -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;

View File

@ -31,7 +31,7 @@ impl EpisodesView {
pub fn new() -> Rc<EpisodesView> {
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);