use actix_web::{web, HttpResponse}; use diesel::{ r2d2::{ConnectionManager, Pool}, PgConnection, RunQueryDsl, }; use crate::{ json_serialization::new_feed::NewFeedSchema, models::feed::new_feed::NewFeed, schema::feed, }; use super::feeds; #[tracing::instrument(name = "Add new feed", skip(pool))] pub async fn add( new_feed: web::Json, pool: web::Data>>, ) -> HttpResponse { let pool_arc = pool.get_ref().clone(); let mut connection = pool_arc.get().expect("Failed to get database connection"); let title: String = new_feed.title.clone(); let url: String = new_feed.url.clone(); let user_id: i32 = new_feed.user_id; let result = feeds::get_feed(&url).await; match result { Ok(channel) => { if channel.items.is_empty() { return HttpResponse::ServiceUnavailable().await.unwrap(); } } Err(_) => { return HttpResponse::NotFound().await.unwrap(); } } let new_feed = NewFeed::new(title, url, user_id); let insert_result = diesel::insert_into(feed::table) .values(&new_feed) .execute(&mut connection); match insert_result { Ok(_) => HttpResponse::Created().await.unwrap(), Err(_) => HttpResponse::Conflict().await.unwrap(), } }