From 89982755a089bfd512a0c255520ecec91af419b8 Mon Sep 17 00:00:00 2001 From: Greg Shuflin Date: Wed, 5 Feb 2025 21:00:51 -0800 Subject: [PATCH] Fetch demo feeds --- Cargo.lock | 14 ++++++++++++++ Cargo.toml | 1 + src/demo.rs | 31 ++++++++++++++++++++++++------- 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4d431ba..77887af 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -923,6 +923,7 @@ checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", + "futures-executor", "futures-io", "futures-sink", "futures-task", @@ -973,6 +974,17 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + [[package]] name = "futures-sink" version = "0.3.31" @@ -994,6 +1006,7 @@ dependencies = [ "futures-channel", "futures-core", "futures-io", + "futures-macro", "futures-sink", "futures-task", "memchr", @@ -2668,6 +2681,7 @@ dependencies = [ "chrono", "clap", "feed-rs", + "futures", "getrandom 0.2.15", "reqwest", "rocket", diff --git a/Cargo.toml b/Cargo.toml index 56802a4..edb0c10 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,3 +24,4 @@ base64 = "0.21" getrandom = "0.2" tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["env-filter"] } +futures = "0.3.31" diff --git a/src/demo.rs b/src/demo.rs index 26f6640..8143c37 100644 --- a/src/demo.rs +++ b/src/demo.rs @@ -1,6 +1,7 @@ use crate::feeds::Feed; use crate::poll_utils::fetch_new_entries; use crate::user::User; +use futures::future::join_all; use tracing::{info, warn}; struct DemoFeed { @@ -83,17 +84,33 @@ pub async fn setup_demo_data(pool: &sqlx::SqlitePool) { .expect("Failed to create demo feed"); } - for feed in feeds.iter() { - let url = &feed.url; + // Fetch all feeds in parallel + let fetch_futures: Vec<_> = feeds + .iter() + .map(|feed| { + let url = feed.url.clone(); + async move { + let result = fetch_new_entries(&url).await; + (url, result) + } + }) + .collect(); - let entries = match fetch_new_entries(url).await { - Ok(entries) => entries, + let results = join_all(fetch_futures).await; + for (url, result) in results { + match result { + Ok(entries) => { + info!( + feed_url = url.as_str(), + "Successfully fetched {} entries", + entries.len() + ); + // TODO: Store entries in database + } Err(e) => { warn!(error=%e, feed_url=url.as_str(), "Error populating feed"); - continue; } - }; - //update_entry_db(&entries, &feed_id, &mut db).await?; + } } info!("Successfully set up demo data");