Change get articles to read from database instead of dummy data.

This commit is contained in:
2023-10-14 18:32:49 +02:00
parent c8ca91e90b
commit 3d77c6f30f
11 changed files with 157 additions and 61 deletions
+27 -17
View File
@@ -1,6 +1,9 @@
use super::feeds;
use crate::json_serialization::user::JsonUser;
use crate::models::feed::rss_feed::Feed;
use crate::models::feed_item::new_feed_item::NewFeedItem;
use crate::models::feed_item::rss_feed_item::FeedItem;
use crate::schema::feed_item::{feed_id, title};
use crate::{
database::establish_connection,
schema::{
@@ -12,15 +15,9 @@ use actix_web::{web, HttpRequest, HttpResponse, Responder};
use diesel::prelude::*;
use rss::Item;
use scraper::{Html, Selector};
use serde_derive::Deserialize;
#[derive(Deserialize)]
pub struct JsonUser {
user_id: String,
}
fn create_feed_item(item: Item, feed: &Feed) {
let title = item.title.unwrap();
fn create_feed_item(item: Item, feed: &Feed, connection: &mut PgConnection) {
let item_title = item.title.unwrap();
let frag = Html::parse_fragment(&item.content.unwrap());
let mut content = "".to_string();
let frag_clone = frag.clone();
@@ -38,20 +35,33 @@ fn create_feed_item(item: Item, feed: &Feed) {
}
});
let mut connection: diesel::PgConnection = establish_connection();
let new_feed_item =
NewFeedItem::new(feed.id, content.clone(), title.clone(), item.link.unwrap());
let insert_result = diesel::insert_into(feed_item::table)
.values(&new_feed_item)
.execute(&mut connection);
let existing_item: Vec<FeedItem> = feed_item::table
.filter(feed_id.eq(feed.id))
.filter(title.eq(&item_title))
.load(connection)
.unwrap();
log::info!("{:?}", insert_result);
if existing_item.is_empty() {
let new_feed_item = NewFeedItem::new(
feed.id,
content.clone(),
item_title.clone(),
item.link.unwrap(),
);
let insert_result = diesel::insert_into(feed_item::table)
.values(&new_feed_item)
.execute(connection);
log::info!("Insert Result: {:?}", insert_result);
} else {
log::info!("Item {} already exists.", feed.title);
}
}
pub async fn sync(_req: HttpRequest, data: web::Json<JsonUser>) -> impl Responder {
let mut connection: diesel::PgConnection = establish_connection();
let req_user_id = data.user_id.parse::<i32>().unwrap();
let req_user_id: i32 = data.user_id;
let feeds: Vec<Feed> = feed::table
.filter(user_id.eq(req_user_id))
@@ -67,7 +77,7 @@ pub async fn sync(_req: HttpRequest, data: web::Json<JsonUser>) -> impl Responde
match result {
Ok(channel) => {
for item in channel.into_items() {
create_feed_item(item, &feed)
create_feed_item(item, &feed, &mut connection)
}
}
Err(e) => log::error!("Could not get channel {}. Error: {}", feed.url, e),