Add a feed through one function, from the CLI and the page alike (#161)
`ipx add` and the page's Add feed were the same steps written twice: find the feed, look for it in the catalogue by same_feed, add_one, store. They had drifted, and #153's lock had to be put into both by hand. add_to_catalogue() now does the shared part, under the lock, and answers the id and whether the feed was there already; each caller still finds the feed itself, so the page can call a bad address the caller's mistake (400), and then does its own part: the CLI lists or categorises, the page subscribes and scans. add_one is private to it now. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
26
src/web.rs
26
src/web.rs
@@ -1492,30 +1492,16 @@ async fn add_feed(
|
||||
let url = crate::feed::find_feed(&state.ctx.client, &crate::feed::expand_input(&body.url))
|
||||
.await
|
||||
.map_err(|e| ApiError::bad_request(format!("{e:#}")))?;
|
||||
// Taken before the duplicate check, so two people adding the same feed at once add it once.
|
||||
let mut cfg = state.ctx.edit_cfg().await;
|
||||
// Someone else may already have it. Then adding costs nothing: no second fetch, no
|
||||
// second copy on disk, just another name against the same feed.
|
||||
if let Some(existing) = crate::subscriptions(&state.ctx).await?
|
||||
.into_iter()
|
||||
.find(|s| crate::feed::same_feed(&s.cfg.url, &url))
|
||||
{
|
||||
let already = state.ctx.db.subscription(user.id, &existing.id).await?.is_some();
|
||||
state.ctx.db.subscribe(user.id, &existing.id).await?;
|
||||
if !already {
|
||||
explicit_on_add(&state, user.id, &existing.id, body.allow_explicit).await?;
|
||||
}
|
||||
scan_soon(&state, Some(existing.id.clone())).await;
|
||||
return Ok(Json(
|
||||
serde_json::json!({ "id": existing.id, "existing": already }),
|
||||
));
|
||||
}
|
||||
let id = crate::add_one(&state.ctx, &mut cfg, &url, body.folder, body.keywords).await?;
|
||||
state.ctx.store_cfg(cfg).await?;
|
||||
let (id, existed) = crate::add_to_catalogue(&state.ctx, &url, body.folder, body.keywords).await?;
|
||||
let already = existed && state.ctx.db.subscription(user.id, &id).await?.is_some();
|
||||
state.ctx.db.subscribe(user.id, &id).await?;
|
||||
explicit_on_add(&state, user.id, &id, body.allow_explicit).await?;
|
||||
if !already {
|
||||
explicit_on_add(&state, user.id, &id, body.allow_explicit).await?;
|
||||
}
|
||||
scan_soon(&state, Some(id.clone())).await;
|
||||
Ok(Json(serde_json::json!({ "id": id, "existing": false })))
|
||||
Ok(Json(serde_json::json!({ "id": id, "existing": already })))
|
||||
}
|
||||
|
||||
/// Queues a scan, so a feed just added shows its items without anyone pressing Scan now.
|
||||
|
||||
Reference in New Issue
Block a user