Add new feed url
parent
f9f274f6e2
commit
d920f5b9b9
|
@ -6,12 +6,28 @@ use crate::{
|
|||
models::feed::new_feed::NewFeed, schema::feed,
|
||||
};
|
||||
|
||||
use super::feeds;
|
||||
|
||||
pub async fn add(new_feed: web::Json<NewFeedSchema>) -> HttpResponse {
|
||||
let mut connection = establish_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) => {
|
||||
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 insert_result = diesel::insert_into(feed::table)
|
||||
|
|
|
@ -19,7 +19,8 @@ use scraper::{Html, Selector};
|
|||
|
||||
fn create_feed_item(item: Item, feed: &Feed, connection: &mut PgConnection) {
|
||||
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 frag_clone = frag.clone();
|
||||
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))
|
||||
.load(connection)
|
||||
.unwrap();
|
||||
// todo;
|
||||
|
||||
if existing_item.is_empty() {
|
||||
log::info!("{:?}", item.pub_date());
|
||||
let mut time: NaiveDateTime = Local::now().naive_local();
|
||||
if item.pub_date().is_some() {
|
||||
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(
|
||||
feed.id,
|
||||
|
|
|
@ -67,7 +67,9 @@ const fetchData = async () => {
|
|||
'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();
|
||||
setupIntersectionObserver();
|
||||
} catch (error) {
|
||||
|
|
|
@ -1,14 +1,39 @@
|
|||
<script setup>
|
||||
import { ref } from 'vue';
|
||||
import axios from 'axios';
|
||||
const props = defineProps({
|
||||
show: Boolean
|
||||
})
|
||||
const submitted = ref(false)
|
||||
const url = ref('')
|
||||
const processInput = () => {
|
||||
const title = ref('')
|
||||
const output = ref('')
|
||||
|
||||
async function save() {
|
||||
output.value = ''
|
||||
submitted.value = true;
|
||||
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>
|
||||
|
||||
<template>
|
||||
|
@ -18,17 +43,19 @@ const processInput = () => {
|
|||
<div class="modal-header">
|
||||
<slot name="header">Add RSS Feed</slot>
|
||||
</div>
|
||||
<form @submit.prevent="processInput">
|
||||
<form @submit.prevent="submitForm">
|
||||
<label for="name">URL:</label>
|
||||
<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">
|
||||
<p></p>
|
||||
<p>{{ output }}</p>
|
||||
</div>
|
||||
|
||||
<div class="modal-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>
|
||||
</slot>
|
||||
</div>
|
||||
|
|
|
@ -40,6 +40,12 @@ export default defineConfig({
|
|||
secure: false,
|
||||
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
|
||||
|
|
Loading…
Reference in New Issue