From 33d2dfe011ded23b46ab0a5078f201dd6cdd3c59 Mon Sep 17 00:00:00 2001 From: Austin Schaefer Date: Thu, 3 Sep 2026 19:49:39 +0200 Subject: [PATCH] Merge list_feeds_with_titles into list_feeds Both queried the same table with near-identical loads, differing only by an extra title column and ordering. Fold title into list_feeds' tuple (its one prior caller, the polling job, ignores it) so there's a single feed-listing query instead of two that can drift apart. --- crates/db/src/feeds.rs | 18 +++--------------- crates/web/src/server/jobs/feed_polling.rs | 2 +- crates/web/src/server/services/feeds.rs | 2 +- 3 files changed, 5 insertions(+), 17 deletions(-) diff --git a/crates/db/src/feeds.rs b/crates/db/src/feeds.rs index 1be19b3..8e0d556 100644 --- a/crates/db/src/feeds.rs +++ b/crates/db/src/feeds.rs @@ -26,21 +26,9 @@ impl Db { Ok(Uuid::parse_str(&id)?) } - /// All subscribed feeds, for the polling job to iterate over. - pub async fn list_feeds(&self) -> Result> { - use schema::feeds::dsl; - let mut conn = self.pool.get().await?; - let rows: Vec<(String, String)> = dsl::feeds - .select((dsl::id, dsl::url)) - .load(&mut conn) - .await?; - rows.into_iter() - .map(|(id, url)| Ok((Uuid::parse_str(&id)?, url))) - .collect() - } - - /// All subscribed feeds with their titles, for the sidebar's feed list. - pub async fn list_feeds_with_titles(&self) -> Result> { + /// All subscribed feeds, ordered by title. Used both by the polling job + /// (iterating to fetch each feed) and the sidebar's feed-navigation list. + pub async fn list_feeds(&self) -> Result> { use schema::feeds::dsl; let mut conn = self.pool.get().await?; let rows: Vec<(String, String, String)> = dsl::feeds diff --git a/crates/web/src/server/jobs/feed_polling.rs b/crates/web/src/server/jobs/feed_polling.rs index 24bab34..d5a824d 100644 --- a/crates/web/src/server/jobs/feed_polling.rs +++ b/crates/web/src/server/jobs/feed_polling.rs @@ -10,7 +10,7 @@ pub async fn run(db: &Db) -> Result<()> { let feeds = db.list_feeds().await?; tracing::info!(count = feeds.len(), "polling subscribed feeds"); - for (feed_id, url) in feeds { + for (feed_id, _title, url) in feeds { let (_title, articles) = match feedsignal_feeds::fetch_feed(&url, feed_id).await { Ok(result) => result, Err(err) => { diff --git a/crates/web/src/server/services/feeds.rs b/crates/web/src/server/services/feeds.rs index 1c9e142..987906c 100644 --- a/crates/web/src/server/services/feeds.rs +++ b/crates/web/src/server/services/feeds.rs @@ -36,7 +36,7 @@ pub async fn subscribe(db: Db, url: String) -> Result { /// Lists every subscribed feed, for the sidebar's feed-navigation list. pub async fn list(db: Db) -> Result> { Ok(db - .list_feeds_with_titles() + .list_feeds() .await? .into_iter() .map(|(id, title, url)| FeedView {