rss-reader/src/demo.rs
2025-02-05 16:38:59 -08:00

101 lines
2.6 KiB
Rust

use crate::feeds::Feed;
use crate::poll_utils::fetch_new_entries;
use crate::user::User;
use tracing::{info, warn};
struct DemoFeed {
name: &'static str,
url: &'static str,
category: Option<&'static str>,
}
const DEMO_FEEDS: [DemoFeed; 5] = [
DemoFeed {
name: "XKCD",
url: "https://xkcd.com/atom.xml",
category: Some("Webcomic"),
},
DemoFeed {
name: "Isidore & Friends",
url: "https://isidore.webcomic.ws/rss/",
category: Some("Webcomic"),
},
DemoFeed {
name: "Astral Codex Ten",
url: "https://www.astralcodexten.com/feed",
category: Some("Substack"),
},
DemoFeed {
name: "BBC News",
url: "https://feeds.bbci.co.uk/news/world/us_and_canada/rss.xml",
category: Some("News"),
},
DemoFeed {
name: "Astronomy Picture of the Day (APOD)",
url: "https://apod.nasa.gov/apod.rss",
category: None,
},
];
pub async fn setup_demo_data(pool: &sqlx::SqlitePool) {
// Create admin user
let mut admin = User::new(
"admin".to_string(),
bcrypt::hash("admin", bcrypt::DEFAULT_COST).unwrap(),
None,
None,
);
admin.admin = true;
admin
.write_to_database(pool)
.await
.expect("Failed to create admin user");
// Create demo user
let demo = User::new(
"demo".to_string(),
bcrypt::hash("demo", bcrypt::DEFAULT_COST).unwrap(),
None,
None,
);
demo.write_to_database(pool)
.await
.expect("Failed to create demo user");
let feeds: Vec<Feed> = DEMO_FEEDS
.iter()
.map(|demo_feed| {
let mut feed = Feed::new(
demo_feed.name.to_string(),
demo_feed.url.parse().unwrap(),
demo.id,
);
if let Some(category) = demo_feed.category {
feed.categorization = vec![category.to_string()];
}
feed
})
.collect();
for feed in feeds.iter() {
feed.write_to_database(pool)
.await
.expect("Failed to create demo feed");
}
for feed in feeds.iter() {
let url = &feed.url;
let entries = match fetch_new_entries(url).await {
Ok(entries) => entries,
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");
}