This commit is contained in:
Greg Shuflin 2025-02-02 03:28:08 -08:00
parent 2776e763cc
commit 9828df74f1
2 changed files with 31 additions and 42 deletions

View File

@ -1,11 +1,11 @@
use rocket::http::Status;
use rocket::serde::{json::Json, Deserialize, Serialize};
use rocket_db_pools::Connection;
use uuid::Uuid;
use url::Url;
use uuid::Uuid;
use crate::Db;
use crate::user::AuthenticatedUser;
use crate::Db;
#[derive(Debug, Serialize)]
#[serde(crate = "rocket::serde")]
@ -35,7 +35,7 @@ impl Feed {
#[derive(Debug, Deserialize)]
#[serde(crate = "rocket::serde")]
pub struct NewFeed {
pub url: Url, // Only URL is required now
pub url: Url, // Only URL is required now
}
#[post("/feeds", data = "<new_feed>")]
@ -52,30 +52,25 @@ pub async fn create_feed(
}
// Fetch the feed content
let response = reqwest::get(new_feed.url.as_ref())
.await
.map_err(|e| {
eprintln!("Failed to fetch feed: {}", e);
Status::UnprocessableEntity
})?;
let content = response.text()
.await
.map_err(|e| {
eprintln!("Failed to read response body: {}", e);
Status::UnprocessableEntity
})?;
let response = reqwest::get(new_feed.url.as_ref()).await.map_err(|e| {
eprintln!("Failed to fetch feed: {}", e);
Status::UnprocessableEntity
})?;
let content = response.text().await.map_err(|e| {
eprintln!("Failed to read response body: {}", e);
Status::UnprocessableEntity
})?;
// Parse the feed
let feed_data = feed_rs::parser::parse(content.as_bytes())
.map_err(|e| {
eprintln!("Failed to parse feed content: {}", e);
Status::UnprocessableEntity
})?;
let feed_data = feed_rs::parser::parse(content.as_bytes()).map_err(|e| {
eprintln!("Failed to parse feed content: {}", e);
Status::UnprocessableEntity
})?;
// Use the feed title as the name, or URL if no title is available
let name = feed_data.title
let name = feed_data
.title
.map(|t| t.content)
.unwrap_or_else(|| new_feed.url.host_str().unwrap_or("Unknown").to_string());
@ -83,16 +78,16 @@ pub async fn create_feed(
let query = sqlx::query(
"INSERT INTO feeds (feed_id, name, url, user_id, added_time, last_checked_time)
VALUES (?1, ?2, ?3, ?4, ?5, ?6)"
VALUES (?1, ?2, ?3, ?4, ?5, ?6)",
)
.bind(feed.feed_id.to_string())
.bind(&feed.name)
.bind(feed.url.as_str())
.bind(feed.user_id.to_string())
.bind(feed.added_time.to_rfc3339())
.bind(feed.last_checked_time.to_rfc3339())
.execute(&mut **db)
.await;
.bind(feed.feed_id.to_string())
.bind(&feed.name)
.bind(feed.url.as_str())
.bind(feed.user_id.to_string())
.bind(feed.added_time.to_rfc3339())
.bind(feed.last_checked_time.to_rfc3339())
.execute(&mut **db)
.await;
match query {
Ok(_) => Ok(Json(feed)),
@ -158,20 +153,14 @@ pub async fn list_feeds(
}
#[delete("/feeds/<feed_id>")]
pub async fn delete_feed(
mut db: Connection<Db>,
feed_id: &str,
user: AuthenticatedUser,
) -> Status {
pub async fn delete_feed(mut db: Connection<Db>, feed_id: &str, user: AuthenticatedUser) -> Status {
// Validate UUID format
let feed_uuid = match Uuid::parse_str(feed_id) {
Ok(uuid) => uuid,
Err(_) => return Status::BadRequest,
};
let query = sqlx::query(
"DELETE FROM feeds WHERE feed_id = ? AND user_id = ?"
)
let query = sqlx::query("DELETE FROM feeds WHERE feed_id = ? AND user_id = ?")
.bind(feed_uuid.to_string())
.bind(user.user_id.to_string())
.execute(&mut **db)

View File

@ -1,8 +1,8 @@
#[macro_use]
extern crate rocket;
mod user;
mod feeds;
mod user;
use rocket::fs::FileServer;
use rocket::response::Redirect;