2026-09-03 10:03:15 +00:00
|
|
|
use crate::api::ArticleView;
|
|
|
|
|
use anyhow::Result;
|
|
|
|
|
use feedsignal_db::Db;
|
2026-09-03 14:28:22 +00:00
|
|
|
use uuid::Uuid;
|
2026-09-03 10:03:15 +00:00
|
|
|
|
2026-09-03 14:28:22 +00:00
|
|
|
/// Returns articles ranked by `final_score` descending, highest-relevance
|
|
|
|
|
/// first. `feed_id` restricts the list to one feed; `None` joins every
|
|
|
|
|
/// subscribed feed into one ranked list.
|
|
|
|
|
pub async fn list_ranked(db: Db, feed_id: Option<String>) -> Result<Vec<ArticleView>> {
|
|
|
|
|
let feed_id = feed_id.map(|id| Uuid::parse_str(&id)).transpose()?;
|
2026-09-03 10:03:15 +00:00
|
|
|
Ok(db
|
2026-09-03 14:28:22 +00:00
|
|
|
.list_ranked_articles(feed_id, 100)
|
2026-09-03 10:03:15 +00:00
|
|
|
.await?
|
|
|
|
|
.into_iter()
|
2026-09-03 19:20:41 +00:00
|
|
|
.map(|row| ArticleView {
|
|
|
|
|
id: row.id,
|
|
|
|
|
feed_id: row.feed_id,
|
|
|
|
|
title: row.title,
|
|
|
|
|
url: row.url,
|
|
|
|
|
summary: row.summary,
|
|
|
|
|
topics: row.topics,
|
|
|
|
|
final_score: row.final_score,
|
|
|
|
|
})
|
2026-09-03 10:03:15 +00:00
|
|
|
.collect())
|
|
|
|
|
}
|