rss-reader written in rust
Something went wrong. Try again.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879use axum::{Json, extract::State, http::StatusCode, response::IntoResponse};use rss::Item as RssItem;use serde::Serialize;use std::error::Error;use turso::{Connection, Rows};
#[derive(Debug, Serialize)]pub struct Item { pub id: u64, pub channel_id: Option<u64>, pub title: Option<String>, pub link: Option<String>, pub content: Option<String>, pub author: Option<String>, pub pub_date: Option<String>,}
#[derive(Debug, Serialize)]pub struct ItemsList { pub data: Vec<Item>,}
pub async fn add_item( conn: &Connection, channel_id: &u64, item: &RssItem,) -> Result<(), Box<dyn Error>> { conn.execute( "INSERT OR IGNORE INTO items (channel_id, title, link, content, author, pub_date) VALUES (?, ?, ?, ?, ?, ?)", ( channel_id.to_owned(), item.title().unwrap_or(""), item.link().unwrap_or(""), item.content().unwrap_or(""), item.author().unwrap_or(""), item.pub_date().unwrap_or(""), ), ) .await?;
Ok(())}
pub async fn get_items( conn: &Connection, channel_id: Option<&u64>,) -> Result<Vec<Item>, Box<dyn Error>> { let mut rows: Rows = if let Some(channel_id) = channel_id { conn.query( "SELECT * FROM items WHERE channel_id = ?1", turso::params![channel_id], ) .await? } else { conn.query("SELECT * FROM items", ()).await? }; let mut items: Vec<Item> = vec![];
while let Some(row) = rows.next().await.unwrap() { items.push(Item { id: row.get(0).unwrap(), channel_id: row.get(1).unwrap_or(None), title: row.get(2).unwrap_or(None), link: row.get(3).unwrap_or(None), content: row.get(4).unwrap_or(None), author: row.get(5).unwrap_or(None), pub_date: row.get(6).unwrap_or(None), }); }
Ok(items)}
pub async fn list_items(State(conn): State<Connection>) -> impl IntoResponse { let items = get_items(&conn, None).await.unwrap(); println!("{items:?}"); Json(ItemsList { data: items })}