Add new feed url

master
Mathias Rothenhaeusler 2023-11-10 17:17:29 +01:00
parent f9f274f6e2
commit d920f5b9b9
5 changed files with 67 additions and 9 deletions

View File

@ -6,12 +6,28 @@ use crate::{
models::feed::new_feed::NewFeed, schema::feed, models::feed::new_feed::NewFeed, schema::feed,
}; };
use super::feeds;
pub async fn add(new_feed: web::Json<NewFeedSchema>) -> HttpResponse { pub async fn add(new_feed: web::Json<NewFeedSchema>) -> HttpResponse {
let mut connection = establish_connection(); let mut connection = establish_connection();
let title: String = new_feed.title.clone(); let title: String = new_feed.title.clone();
let url: String = new_feed.url.clone(); let url: String = new_feed.url.clone();
let user_id: i32 = new_feed.user_id; let user_id: i32 = new_feed.user_id;
let result = feeds::get_feed(&url).await;
match result {
Ok(channel) => {
log::info!("valid channel");
if channel.items.is_empty() {
return HttpResponse::ServiceUnavailable().await.unwrap();
}
}
Err(e) => {
log::error!("{:?}", e);
return HttpResponse::NotFound().await.unwrap();
}
}
let new_feed = NewFeed::new(title, url, user_id); let new_feed = NewFeed::new(title, url, user_id);
let insert_result = diesel::insert_into(feed::table) let insert_result = diesel::insert_into(feed::table)

View File

@ -19,7 +19,8 @@ use scraper::{Html, Selector};
fn create_feed_item(item: Item, feed: &Feed, connection: &mut PgConnection) { fn create_feed_item(item: Item, feed: &Feed, connection: &mut PgConnection) {
let item_title = item.title.clone().unwrap(); let item_title = item.title.clone().unwrap();
let frag = Html::parse_fragment(&item.content.clone().unwrap()); log::info!("Create feed item: {}", item_title);
let frag = Html::parse_fragment(&item.content.clone().unwrap_or_default());
let mut content = "".to_string(); let mut content = "".to_string();
let frag_clone = frag.clone(); let frag_clone = frag.clone();
frag.tree.into_iter().for_each(|node| { frag.tree.into_iter().for_each(|node| {
@ -41,13 +42,19 @@ fn create_feed_item(item: Item, feed: &Feed, connection: &mut PgConnection) {
.filter(title.eq(&item_title)) .filter(title.eq(&item_title))
.load(connection) .load(connection)
.unwrap(); .unwrap();
// todo;
if existing_item.is_empty() { if existing_item.is_empty() {
log::info!("{:?}", item.pub_date()); log::info!("{:?}", item.pub_date());
let mut time: NaiveDateTime = Local::now().naive_local(); let mut time: NaiveDateTime = Local::now().naive_local();
if item.pub_date().is_some() { if item.pub_date().is_some() {
let format_string = "%a, %d %b %Y %H:%M:%S %z"; let format_string = "%a, %d %b %Y %H:%M:%S %z";
time = NaiveDateTime::parse_from_str(item.pub_date().unwrap(), format_string).unwrap(); time = match NaiveDateTime::parse_from_str(item.pub_date().unwrap(), format_string) {
Ok(date) => date,
Err(err) => {
log::error!("could not unwrap pub date: {}", err);
time
}
};
} }
let new_feed_item = NewFeedItem::new( let new_feed_item = NewFeedItem::new(
feed.id, feed.id,

View File

@ -67,7 +67,9 @@ const fetchData = async () => {
'user-token': localStorage.getItem("user-token") 'user-token': localStorage.getItem("user-token")
} }
}); });
feeds.value = response.data.feeds[0].items; response.data.feeds.forEach(feed => {
feeds.value.push(...feed.items);
});
await nextTick(); await nextTick();
setupIntersectionObserver(); setupIntersectionObserver();
} catch (error) { } catch (error) {

View File

@ -1,14 +1,39 @@
<script setup> <script setup>
import { ref } from 'vue'; import { ref } from 'vue';
import axios from 'axios';
const props = defineProps({ const props = defineProps({
show: Boolean show: Boolean
}) })
const submitted = ref(false) const submitted = ref(false)
const url = ref('') const url = ref('')
const processInput = () => { const title = ref('')
const output = ref('')
async function save() {
output.value = ''
submitted.value = true; submitted.value = true;
console.log('saved ' + url.value) console.log('saved ' + url.value)
}; try {
const response = await axios.post("feeds/add", {
url: url.value,
title: title.value,
user_id: parseInt(localStorage.getItem("user-id"))
},
{
headers: {
'Content-Type': 'application/json',
'user-token': localStorage.getItem("user-token")
}
}
)
console.log(response)
output.value = 'saved successfully'
} catch (error) {
console.error(error.message)
output.value = error.message
}
}
</script> </script>
<template> <template>
@ -18,17 +43,19 @@ const processInput = () => {
<div class="modal-header"> <div class="modal-header">
<slot name="header">Add RSS Feed</slot> <slot name="header">Add RSS Feed</slot>
</div> </div>
<form @submit.prevent="processInput"> <form @submit.prevent="submitForm">
<label for="name">URL:</label> <label for="name">URL:</label>
<input v-model="url" id="url" type="text" required /> <input v-model="url" id="url" type="text" required />
<label for="name">Title:</label>
<input v-model="title" id="title" type="text" required />
<div v-if="submitted"> <div v-if="submitted">
<p></p> <p>{{ output }}</p>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<slot name="footer"> <slot name="footer">
<button type="submit">Save</button> <button type="submit" @click="save">Save</button>
<button class="modal-default-button" @click="$emit('close')">Close</button> <button class="modal-default-button" @click="$emit('close')">Close</button>
</slot> </slot>
</div> </div>

View File

@ -40,6 +40,12 @@ export default defineConfig({
secure: false, secure: false,
rewrite: (path) => path.replace(/^\/feeds\/read/, ''), rewrite: (path) => path.replace(/^\/feeds\/read/, ''),
}, },
'/feeds/add': {
target: 'http://localhost:8001/api/v1/article/add',
changeOrigin: true,
secure: false,
rewrite: (path) => path.replace(/^\/feeds\/add/, ''),
},
}, },
cors: false cors: false