Skip to content

Commit cf7dbf3

Browse files
authored
Merge pull request #444 from lifeparticle/refactor-newsfeed
Refactor newsfeed
2 parents db02f09 + 708c5d1 commit cf7dbf3

File tree

18 files changed

+401
-455
lines changed

18 files changed

+401
-455
lines changed

api/newsfeed/helper.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import xml2js from "xml2js";
2+
export function parseXML(value) {
3+
return new Promise((resolve, reject) => {
4+
const parser = new xml2js.Parser({
5+
explicitArray: false,
6+
ignoreAttrs: true,
7+
});
8+
parser.parseString(value, (err, result) => {
9+
if (err) reject(err);
10+
else {
11+
const items = result.rss.channel.item;
12+
const list = items.map((item) => ({
13+
title: item.title,
14+
pubDate: item.pubDate,
15+
url: item.link,
16+
image: extractImage(item.description),
17+
}));
18+
resolve(list);
19+
}
20+
});
21+
});
22+
}
23+
24+
function extractImage(description) {
25+
const regex = /<img.*?src=["'](.*?)["']/;
26+
const match = regex.exec(description);
27+
return match ? match[1] : null;
28+
}

api/newsfeed/index.js

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import express from "express";
22
import axios from "axios";
3+
import { parseXML } from "./helper.js";
34

45
const app = express();
56
app.disable("x-powered-by");
@@ -23,6 +24,8 @@ app.get("/rss", async (req, res) => {
2324
const sites = {
2425
"frontend-focus": "https://cprss.s3.amazonaws.com/frontendfoc.us.xml",
2526
"react-status": "https://cprss.s3.amazonaws.com/react.statuscode.com.xml",
27+
"news-api":
28+
"https://raw.githubusercontent.com/lifeparticle/binarytree/main/api/news/news.json",
2629
};
2730
const response = await axios.get(sites[sitename], {
2831
responseType: "arraybuffer",
@@ -33,9 +36,21 @@ app.get("/rss", async (req, res) => {
3336
}
3437

3538
res.setHeader("Cache-Control", "s-max-age=86400, stale-while-revalidate");
36-
res.set("Content-Type", "application/xml");
39+
res.set("Content-Type", "application/json");
3740

38-
res.send(response.data);
41+
if (sitename === "news-api") res.send(response.data);
42+
43+
const xmlData = response.data.toString();
44+
45+
parseXML(xmlData)
46+
.then((parsedData) => {
47+
console.log(parsedData);
48+
res.send({ articles: parsedData });
49+
})
50+
.catch((error) => {
51+
console.error("Error parsing XML:", error);
52+
res.status(500).json({ error: "Error parsing XML" });
53+
});
3954
} catch (error) {
4055
if (error instanceof Error) {
4156
res.status(500).json({ type: "error", message: error.message });

api/newsfeed/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616
"dependencies": {
1717
"axios": "^1.5.0",
1818
"express": "^4.18.2",
19-
"rss-parser": "^3.13.0"
19+
"rss-parser": "^3.13.0",
20+
"xml2js": "^0.6.2"
2021
},
2122
"devDependencies": {
2223
"nodemon": "^3.0.1"

api/newsfeed/yarn.lock

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1228,6 +1228,7 @@ __metadata:
12281228
express: ^4.18.2
12291229
nodemon: ^3.0.1
12301230
rss-parser: ^3.13.0
1231+
xml2js: ^0.6.2
12311232
languageName: unknown
12321233
linkType: soft
12331234

@@ -1896,6 +1897,16 @@ __metadata:
18961897
languageName: node
18971898
linkType: hard
18981899

1900+
"xml2js@npm:^0.6.2":
1901+
version: 0.6.2
1902+
resolution: "xml2js@npm:0.6.2"
1903+
dependencies:
1904+
sax: ">=0.6.0"
1905+
xmlbuilder: ~11.0.0
1906+
checksum: 458a83806193008edff44562c0bdb982801d61ee7867ae58fd35fab781e69e17f40dfeb8fc05391a4648c9c54012066d3955fe5d993ffbe4dc63399023f32ac2
1907+
languageName: node
1908+
linkType: hard
1909+
18991910
"xmlbuilder@npm:~11.0.0":
19001911
version: 11.0.1
19011912
resolution: "xmlbuilder@npm:11.0.1"

ui/.env.development

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
VITE_VERCEL_NEWS_FEED_URL=http://localhost:3000/rss?name=

ui/.env.production

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
VITE_VERCEL_NEWS_FEED_URL=https://binarytree-rssfeed-api.vercel.app/rss?name=

ui/.env.test

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
VITE_VERCEL_NEWS_FEED_URL=http://localhost:3000/rss?name=

ui/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
### [10.6.1] - 2024-03-29
2+
3+
- Update Newsfeed tests
4+
15
### [10.6.0] - 2024-01-24
26

37
- Added Information Page tests

ui/src/pages/Newsfeed/Newsfeed.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ import style from "./Newsfeed.module.scss";
77
import useNewsFeed from "./useNewsFeed";
88

99
const Newsfeed: FC = () => {
10-
const { data, isLoading, isError, setUrl } = useNewsFeed();
10+
const { data, isLoading, isError, setTab } = useNewsFeed();
1111

1212
return (
1313
<>
1414
<Tabs
1515
items={TAB_ITEMS}
1616
onChange={(value) => {
17-
setUrl(value);
17+
setTab(value);
1818
}}
1919
className={style.newsfeed_tabs}
2020
/>

ui/src/pages/Newsfeed/__tests__/News.test.tsx

Lines changed: 0 additions & 84 deletions
This file was deleted.

0 commit comments

Comments
 (0)