use crate::{ Result, Item, Channel, channel::UnparsedChannel, }; use sqlx::SqlitePool; pub struct FeedId(pub i64); impl From for FeedId { fn from(id: i64) -> Self { FeedId(id) } } impl From for i64 { fn from(id: FeedId) -> Self { id.0 } } pub struct Feed { pub id: FeedId, } impl Feed { pub async fn get_items( pool: &SqlitePool, id: FeedId, limit: u8, offset: u32 ) -> Result> { let items = sqlx::query_as!( Item, "SELECT item_id as id FROM feed_items WHERE feed_id = ? AND archived = FALSE ORDER BY score DESC LIMIT ? OFFSET ?", id.0, limit, offset ).fetch_all(pool).await?; Ok(items) } pub async fn get_channels( pool: &SqlitePool, id: FeedId ) -> Result> { let channels: Result> = sqlx::query_as!( UnparsedChannel, "SELECT c.id as `id!`, c.title, c.link, c.description, c.last_fetched FROM channels c JOIN feed_channels fc on c.id = fc.channel_id WHERE fc.feed_id = ?", id.0 ).fetch_all(pool).await?.into_iter() .map(UnparsedChannel::parse).collect(); channels } }