48 lines
1.3 KiB
Rust
48 lines
1.3 KiB
Rust
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<NewFeedSchema>,
|
|
pool: web::Data<Pool<ConnectionManager<PgConnection>>>,
|
|
) -> 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(),
|
|
}
|
|
}
|