diff --git a/README.md b/README.md new file mode 100644 index 0000000..8a2e6b9 --- /dev/null +++ b/README.md @@ -0,0 +1,19 @@ +## RSS-Reader + +# Diesel Setup + +setup, first step, or when docker been and DB not found. + +`diesel setup` + +generate table + +`diesel migration generate create_to_do_items` + +fill up and down + +`diesel migration run` + +# docker + +`docker exec -it 59ff8bad10c0 psql -d rss -U admin` diff --git a/docker-compose.yml b/docker-compose.yml index e3abf8d..b7dae52 100755 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,12 +1,12 @@ version: "3.7" services: postgres: - container_name: 'rss-postgres' - image: 'postgres:latest' + container_name: "rss-postgres" + image: "postgres:latest" restart: always ports: - - '5432:5432' + - "5432:5432" environment: - - 'POSTGRES_USER=admin' - - 'POSTGRES_DB=to_do' - - 'POSTGRES_PASSWORD=secret+123' + - "POSTGRES_USER=admin" + - "POSTGRES_DB=rss" + - "POSTGRES_PASSWORD=secret+123" diff --git a/javascript/main.js b/javascript/main.js index c3d2e49..20a17ff 100755 --- a/javascript/main.js +++ b/javascript/main.js @@ -25,8 +25,32 @@ function apiCall(url, method) { return xhr; } -function runRenderProcess(params) { - document.getElementById("mainContainer").innerHtml = params; +function runRenderProcess(data) { + params = renderArticle(data["feeds"]); + // document.getElementById("mainContainer").innerHtml = params; +} +function renderArticle(feeds) { + let placeholder = "
"; + for (i = 0; i < feeds.length; i++) { + let title = feeds[i]["title"]; + placeholder += '
' + "

" + title + "

"; + let items = feeds[i]["items"]; + + for (t = 0; t < items.length; t++) { + placeholder += + '
' + + "

" + + items[t].title + + "

" + + "

" + + items[t].content + + "

"; + } + + placeholder += "
" + "
"; + } + placeholder += "
"; + document.getElementById("mainContainer").innerHTML = placeholder; } function getArticles() { diff --git a/src/json_serialization/articles.rs b/src/json_serialization/articles.rs index e69de29..3a79fd9 100755 --- a/src/json_serialization/articles.rs +++ b/src/json_serialization/articles.rs @@ -0,0 +1,19 @@ +use actix_web::{HttpResponse, Responder}; +use reqwest::StatusCode; +use serde::Serialize; + +use crate::reader::structs::feed::Feed; + +#[derive(Serialize)] +pub struct Articles { + pub feeds: Vec, +} + +impl Responder for Articles { + type Body = String; + + fn respond_to(self, _req: &actix_web::HttpRequest) -> actix_web::HttpResponse { + let body = serde_json::to_string(&self).unwrap(); + HttpResponse::with_body(StatusCode::OK, body) + } +} diff --git a/src/json_serialization/mod.rs b/src/json_serialization/mod.rs index 4b458a4..a72b95b 100755 --- a/src/json_serialization/mod.rs +++ b/src/json_serialization/mod.rs @@ -1,2 +1,3 @@ +pub mod articles; pub mod login; pub mod new_user; diff --git a/src/models/feed/feed.rs b/src/models/feed/feed.rs index eb1144b..ecdc256 100755 --- a/src/models/feed/feed.rs +++ b/src/models/feed/feed.rs @@ -1,5 +1,5 @@ -use super::super::feed; use super::super::user::user::User; +use crate::schema::feed; use diesel::{Associations, Identifiable, Queryable}; #[derive(Queryable, Identifiable, Associations)] diff --git a/src/models/feed_item/feed_item.rs b/src/models/feed_item/feed_item.rs index 139597f..8b13789 100755 --- a/src/models/feed_item/feed_item.rs +++ b/src/models/feed_item/feed_item.rs @@ -1,2 +1 @@ - diff --git a/src/reader/feeds.rs b/src/reader/feeds.rs index 92c402d..c4d5b3b 100755 --- a/src/reader/feeds.rs +++ b/src/reader/feeds.rs @@ -2,7 +2,7 @@ use std::error::Error; use rss::Channel; -pub async fn get_feed(feed: &String) -> Result> { +pub async fn get_feed(feed: &str) -> Result> { let content = reqwest::get(feed).await?.bytes().await?; let channel = Channel::read_from(&content[..])?; Ok(channel) diff --git a/src/reader/get.rs b/src/reader/get.rs index 7275ead..c2dd182 100755 --- a/src/reader/get.rs +++ b/src/reader/get.rs @@ -1,9 +1,31 @@ -use actix_web::{HttpRequest, HttpResponse}; -use crate::auth::jwt::JwtToken; +use crate::{auth::jwt::JwtToken, reader::feeds, json_serialization::articles::Articles}; +use actix_web::{HttpRequest, Responder}; +use super::structs::{article::{Article, self}, feed::Feed}; -pub async fn get(req: HttpRequest) -> HttpResponse { - let token: JwtToken = JwtToken::decode_from_request(req).unwrap(); +pub async fn get(req: HttpRequest) -> impl Responder { + // let _token: JwtToken = JwtToken::decode_from_request(req).unwrap(); - todo!(); + let feed = feeds::get_feed("https://www.heise.de/rss/heise-Rubrik-Wissen.rdf").await.unwrap(); + + let feed_title: String = feed.title.clone(); + let feed_items: Vec
= feed.into_items().into_iter().map(|item| { + let title = item.title.unwrap(); + let content = item.content.unwrap(); + Article { + title, + content, + } + } ).collect(); + + let feeds = vec![(Feed {title: feed_title, items: feed_items})]; + + let articles: Articles = Articles { feeds }; + + articles.respond_to(&req) + // + // + // HttpResponse::Ok() + // .content_type("text/html; charset=utf-8") + // .body(feed.to_string()) } diff --git a/src/reader/mod.rs b/src/reader/mod.rs index 075a477..8daee1b 100755 --- a/src/reader/mod.rs +++ b/src/reader/mod.rs @@ -3,6 +3,7 @@ use actix_web::web; use crate::views::path::Path; pub mod feeds; mod get; +pub mod structs; pub fn feed_factory(app: &mut web::ServiceConfig) { let base_path: Path = Path { diff --git a/src/reader/structs/article.rs b/src/reader/structs/article.rs new file mode 100644 index 0000000..d88d7c2 --- /dev/null +++ b/src/reader/structs/article.rs @@ -0,0 +1,16 @@ +use serde::Serialize; + +#[derive(Serialize)] +pub struct Article { + pub title: String, + pub content: String, +} + +impl Article { + pub fn new(title: &str, content: &str) -> Article { + Article { + title: title.to_string(), + content: content.to_string(), + } + } +} diff --git a/src/reader/structs/feed.rs b/src/reader/structs/feed.rs new file mode 100644 index 0000000..0d35cf2 --- /dev/null +++ b/src/reader/structs/feed.rs @@ -0,0 +1,9 @@ +use serde::Serialize; + +use super::article::Article; + +#[derive(Serialize)] +pub struct Feed { + pub title: String, + pub items: Vec
, +} diff --git a/src/reader/structs/mod.rs b/src/reader/structs/mod.rs new file mode 100644 index 0000000..f9aed2e --- /dev/null +++ b/src/reader/structs/mod.rs @@ -0,0 +1,2 @@ +pub mod article; +pub mod feed; diff --git a/src/views/app/reader.rs b/src/views/app/reader.rs index fd3feac..f25f388 100755 --- a/src/views/app/reader.rs +++ b/src/views/app/reader.rs @@ -1,4 +1,4 @@ -use super::content_loader::{add_component, read_file}; +use super::content_loader::read_file; use actix_web::HttpResponse; pub async fn reader() -> HttpResponse { diff --git a/src/views/users/mod.rs b/src/views/users/mod.rs index 6c5ea36..0582242 100755 --- a/src/views/users/mod.rs +++ b/src/views/users/mod.rs @@ -2,6 +2,10 @@ use super::path::Path; use actix_web::web; mod create; +/// curl --header "Content-Type: application/json" \ +/// --data '{"name":"Mike","email": "email@local.local", "password":"secret"}' \ +/// http://localhost:8001/api/v1/user/create -v +/// pub fn user_factory(app: &mut web::ServiceConfig) { let base_path: Path = Path { prefix: String::from("/user"), diff --git a/templates/reader.html b/templates/reader.html index 9a9e2b0..d516ab0 100755 --- a/templates/reader.html +++ b/templates/reader.html @@ -18,7 +18,7 @@ -
+