From 43e5d473b7f28e69ef14a848c818133af5b18c1c Mon Sep 17 00:00:00 2001 From: mace Date: Sun, 17 Sep 2023 11:54:37 +0200 Subject: [PATCH] added feeds --- docker-compose.yml | 5 +++++ src/auth/processes.rs | 7 +++++-- src/json_serialization/new_feed.rs | 1 + src/main.rs | 2 +- src/models/feed/mod.rs | 2 +- src/models/feed/new_feed.rs | 9 +++++++-- src/models/feed/{feed.rs => rss_feed.rs} | 2 +- src/models/feed_item/mod.rs | 2 +- .../feed_item/{feed_item.rs => rss_feed_item.rs} | 0 src/models/user/mod.rs | 3 +-- src/models/user/{user.rs => rss_user.rs} | 0 src/reader/add.rs | 8 ++++++-- src/reader/mod.rs | 5 +++++ src/reader/structs/feed.rs | 6 ++++++ src/reader/sync.rs | 12 ++++++++++++ src/views/auth/login.rs | 7 ++++--- vue/package-lock.json | 8 +++++++- vue/package.json | 3 ++- vue/src/components/LoginPage.vue | 8 ++++++-- vue/src/main.js | 1 - vue/vite.config.js | 10 +++++----- 21 files changed, 76 insertions(+), 25 deletions(-) rename src/models/feed/{feed.rs => rss_feed.rs} (87%) rename src/models/feed_item/{feed_item.rs => rss_feed_item.rs} (100%) rename src/models/user/{user.rs => rss_user.rs} (100%) create mode 100644 src/reader/sync.rs diff --git a/docker-compose.yml b/docker-compose.yml index dc8e2b6..4f196e2 100755 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,3 +9,8 @@ services: - "POSTGRES_USER=admin" - "POSTGRES_DB=rss" - "POSTGRES_PASSWORD=secret+123" + volumes: + - postgres_data:/var/lib/postgresql/data + +volumes: + postgres_data: diff --git a/src/auth/processes.rs b/src/auth/processes.rs index de31962..945a1fe 100755 --- a/src/auth/processes.rs +++ b/src/auth/processes.rs @@ -1,4 +1,3 @@ - use super::jwt; use actix_web::dev::ServiceRequest; @@ -10,9 +9,13 @@ pub fn check_password(password: String) -> Result { } pub fn extract_header_token(request: &ServiceRequest) -> Result { + log::info!("Request: {:?}", request); match request.headers().get("user-token") { Some(token) => match token.to_str() { - Ok(processed_password) => Ok(String::from(processed_password)), + Ok(processed_password) => { + log::info!("Token provided: {}", processed_password); + Ok(String::from(processed_password)) + } Err(_processed_password) => Err("there was an error processing token"), }, None => Err("there is no token"), diff --git a/src/json_serialization/new_feed.rs b/src/json_serialization/new_feed.rs index 4eeeb8b..c4f1381 100644 --- a/src/json_serialization/new_feed.rs +++ b/src/json_serialization/new_feed.rs @@ -4,4 +4,5 @@ use serde::Deserialize; pub struct NewFeedSchema { pub title: String, pub url: String, + pub user_id: i32, } diff --git a/src/main.rs b/src/main.rs index 0b83165..12d3ed6 100755 --- a/src/main.rs +++ b/src/main.rs @@ -23,7 +23,7 @@ async fn main() -> std::io::Result<()> { let request_url: String = String::from(req.uri().path().clone()); log::info!("Request Url: {}", request_url); - if req.path().contains("/reader/") { + if req.path().contains("/article/") { match auth::process_token(&req) { Ok(_token) => passed = true, Err(_message) => passed = false, diff --git a/src/models/feed/mod.rs b/src/models/feed/mod.rs index 5350547..640ba58 100755 --- a/src/models/feed/mod.rs +++ b/src/models/feed/mod.rs @@ -1,2 +1,2 @@ -pub mod feed; pub mod new_feed; +pub mod rss_feed; diff --git a/src/models/feed/new_feed.rs b/src/models/feed/new_feed.rs index 89bc82d..feefec0 100644 --- a/src/models/feed/new_feed.rs +++ b/src/models/feed/new_feed.rs @@ -6,10 +6,15 @@ use diesel::Insertable; pub struct NewFeed { pub title: String, pub url: String, + pub user_id: i32, } impl NewFeed { - pub fn new(title: String, url: String) -> NewFeed { - NewFeed { title, url } + pub fn new(title: String, url: String, user_id: i32) -> NewFeed { + NewFeed { + title, + url, + user_id, + } } } diff --git a/src/models/feed/feed.rs b/src/models/feed/rss_feed.rs similarity index 87% rename from src/models/feed/feed.rs rename to src/models/feed/rss_feed.rs index ecdc256..2e62bf9 100755 --- a/src/models/feed/feed.rs +++ b/src/models/feed/rss_feed.rs @@ -1,4 +1,4 @@ -use super::super::user::user::User; +use super::super::user::rss_user::User; use crate::schema::feed; use diesel::{Associations, Identifiable, Queryable}; diff --git a/src/models/feed_item/mod.rs b/src/models/feed_item/mod.rs index ea937a6..d1698c1 100755 --- a/src/models/feed_item/mod.rs +++ b/src/models/feed_item/mod.rs @@ -1 +1 @@ -mod feed_item; +mod rss_feed_item; diff --git a/src/models/feed_item/feed_item.rs b/src/models/feed_item/rss_feed_item.rs similarity index 100% rename from src/models/feed_item/feed_item.rs rename to src/models/feed_item/rss_feed_item.rs diff --git a/src/models/user/mod.rs b/src/models/user/mod.rs index 0590a75..ec1456f 100755 --- a/src/models/user/mod.rs +++ b/src/models/user/mod.rs @@ -1,3 +1,2 @@ pub mod new_user; -pub mod user; - +pub mod rss_user; diff --git a/src/models/user/user.rs b/src/models/user/rss_user.rs similarity index 100% rename from src/models/user/user.rs rename to src/models/user/rss_user.rs diff --git a/src/reader/add.rs b/src/reader/add.rs index bdf25b9..7f19e40 100644 --- a/src/reader/add.rs +++ b/src/reader/add.rs @@ -10,8 +10,9 @@ pub async fn add(new_feed: web::Json) -> 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 new_feed = NewFeed::new(title, url); + let new_feed = NewFeed::new(title, url, user_id); let insert_result = diesel::insert_into(feed::table) .values(&new_feed) @@ -19,6 +20,9 @@ pub async fn add(new_feed: web::Json) -> HttpResponse { match insert_result { Ok(_) => HttpResponse::Created().await.unwrap(), - Err(_) => HttpResponse::Conflict().await.unwrap(), + Err(e) => { + log::error!("{e}"); + HttpResponse::Conflict().await.unwrap() + } } } diff --git a/src/reader/mod.rs b/src/reader/mod.rs index f8ba145..c05bbe6 100755 --- a/src/reader/mod.rs +++ b/src/reader/mod.rs @@ -5,6 +5,7 @@ mod add; pub mod feeds; mod get; pub mod structs; +mod sync; pub fn feed_factory(app: &mut web::ServiceConfig) { let base_path: Path = Path { @@ -19,4 +20,8 @@ pub fn feed_factory(app: &mut web::ServiceConfig) { &base_path.define(String::from("/add")), web::post().to(add::add), ); + app.route( + &base_path.define(String::from("/sync")), + web::post().to(sync::sync), + ); } diff --git a/src/reader/structs/feed.rs b/src/reader/structs/feed.rs index 0d35cf2..0aa323b 100644 --- a/src/reader/structs/feed.rs +++ b/src/reader/structs/feed.rs @@ -7,3 +7,9 @@ pub struct Feed { pub title: String, pub items: Vec
, } + +impl Feed { + pub fn new(title: String, items: Vec
) -> Feed { + Feed { title, items } + } +} diff --git a/src/reader/sync.rs b/src/reader/sync.rs new file mode 100644 index 0000000..77b361a --- /dev/null +++ b/src/reader/sync.rs @@ -0,0 +1,12 @@ +use actix_web::{HttpRequest, Responder}; +use diesel::prelude::*; + +use crate::{database::establish_connection, schema::feed}; + +use super::structs::feed::Feed; + +pub async fn sync(req: HttpRequest) -> impl Responder { + let mut connection: diesel::PgConnection = establish_connection(); + + let users = feed::table.load::(&mut connection).unwrap(); +} diff --git a/src/views/auth/login.rs b/src/views/auth/login.rs index 9e131e0..9f4b82f 100755 --- a/src/views/auth/login.rs +++ b/src/views/auth/login.rs @@ -1,7 +1,7 @@ use crate::database::establish_connection; use crate::diesel; use crate::json_serialization::login::Login; -use crate::models::user::user::User; +use crate::models::user::rss_user::User; use crate::schema::users; use crate::{auth::jwt::JwtToken, schema::users::username}; use actix_web::{web, HttpResponse}; @@ -13,7 +13,7 @@ pub async fn login(credentials: web::Json) -> HttpResponse { let mut connection = establish_connection(); - let users = users::table + let users: Vec = users::table .filter(username.eq(username_cred.as_str())) .load::(&mut connection) .unwrap(); @@ -32,10 +32,11 @@ pub async fn login(credentials: web::Json) -> HttpResponse { match user.clone().verify(password) { true => { - log::info!("verified password successfully"); + log::info!("verified password successfully for user {}", user.id); let token: String = JwtToken::encode(user.clone().id); HttpResponse::Ok() .insert_header(("token", token)) + .insert_header(("user_id", user.id)) .await .unwrap() } diff --git a/vue/package-lock.json b/vue/package-lock.json index fb1912e..65cf9cc 100644 --- a/vue/package-lock.json +++ b/vue/package-lock.json @@ -10,7 +10,8 @@ "dependencies": { "axios": "^1.5.0", "vue": "^3.3.4", - "vue-router": "^4.2.4" + "vue-router": "^4.2.4", + "vue-sessionstorage": "^1.0.0" }, "devDependencies": { "@rushstack/eslint-patch": "^1.3.2", @@ -2694,6 +2695,11 @@ "vue": "^3.2.0" } }, + "node_modules/vue-sessionstorage": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vue-sessionstorage/-/vue-sessionstorage-1.0.0.tgz", + "integrity": "sha512-Axo8oY/3gcmU+OdsB/zePuoBCqmyjB2/ORUTrC/WVFm8OkMp8yYlzz6nOOzIU1Tgg6a4ogBaUa3loPtHROotbQ==" + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/vue/package.json b/vue/package.json index 5632373..6511195 100644 --- a/vue/package.json +++ b/vue/package.json @@ -12,7 +12,8 @@ "dependencies": { "axios": "^1.5.0", "vue": "^3.3.4", - "vue-router": "^4.2.4" + "vue-router": "^4.2.4", + "vue-sessionstorage": "^1.0.0" }, "devDependencies": { "@rushstack/eslint-patch": "^1.3.2", diff --git a/vue/src/components/LoginPage.vue b/vue/src/components/LoginPage.vue index a0fca3c..137df86 100644 --- a/vue/src/components/LoginPage.vue +++ b/vue/src/components/LoginPage.vue @@ -15,7 +15,7 @@ async function login() { const jsonData = JSON.stringify(loginData) console.log('test') try { - const response = await axios.post('login', jsonData, { + const response = await axios.post('login/rss', jsonData, { headers: { 'Content-Type': 'application/json', // Set the content type to JSON 'crossDomain': true, @@ -33,7 +33,11 @@ async function login() { if (response.status == 200) { let token = response.headers.token - localStorage.setItem("user-token", token); + let user_id = response.headers.user_id + localStorage.setItem("user-token", token) + localStorage.setItem("user-id", user_id) + sessionStorage.setItem("user-id", user_id) + sessionStorage.setItem("user-token", token) router.push({ name: 'about' }) } // Handle success diff --git a/vue/src/main.js b/vue/src/main.js index 10132c4..b56b0f7 100644 --- a/vue/src/main.js +++ b/vue/src/main.js @@ -3,7 +3,6 @@ import './assets/main.css' import { createApp } from 'vue' import App from './App.vue' import router from './router' - const app = createApp(App) app.use(router) diff --git a/vue/vite.config.js b/vue/vite.config.js index b7034d2..81d2582 100644 --- a/vue/vite.config.js +++ b/vue/vite.config.js @@ -16,17 +16,17 @@ export default defineConfig({ server: { proxy: { - '/login': { - target: 'http://localhost:8001/api/v1/auth', + '/login/rss': { + target: 'http://localhost:8001/api/v1/auth/login', changeOrigin: true, secure: false, - // rewrite: (path) => path.replace(/^\/api/, ''), + rewrite: (path) => path.replace(/^\/login\/rss/, ''), }, - '/feeds': { + '/feeds/get': { target: 'http://localhost:8001/api/v1/article/get', changeOrigin: true, secure: false, - rewrite: (path) => path.replace(/^\/feeds/, ''), + rewrite: (path) => path.replace(/^\/feeds\/get/, ''), }, }, cors: false