Skip to content

Commit

Permalink
feat: fetch rss data
Browse files Browse the repository at this point in the history
  • Loading branch information
catnose99 committed Oct 21, 2020
1 parent 2bbd682 commit 0b79343
Show file tree
Hide file tree
Showing 11 changed files with 478 additions and 81 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,6 @@ yarn-error.log*

# vercel
.vercel

# generated data
/.contents
47 changes: 0 additions & 47 deletions members.json

This file was deleted.

50 changes: 50 additions & 0 deletions members.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import { Member } from "@src/types";

export const members: Member[] = [
{
name: "CatNose",
role: "CTO",
bio:
"デザインが好きなプログラマー。開発者向けの情報共有プラットフォームzenn.devを開発しています。",
avatarFileName: "catnose.jpg",
sources: [
"https://zenn.dev/catnose99/feed",
"https://note.com/catnose/rss",
],
},
{
name: "John Doe",
role: "SRE",
bio: "Site Reliability Engineer.",
avatarFileName: "doe.jpg",
sources: ["https://zenn.dev/zenn/feed"],
},
{
name: "Amanda",
role: "Frontend dev",
bio: "Frontend developer,",
avatarFileName: "amanda.jpg",
sources: ["https://medium.com/feed/@Medium"],
},
{
name: "Takada Junji",
role: "Designer",
bio: "Designing all of the apps in Foo company.",
avatarFileName: "junji.jpg",
sources: [],
},
{
name: "Ota Naoko",
role: "Researcher",
bio: "Some texts here",
avatarFileName: "naoko.jpg",
sources: [],
},
{
name: "Alexandria",
role: "Tech Lead",
bio: "IT professional with 3 years of experience",
avatarFileName: "alexandria.jpg",
sources: [],
},
];
11 changes: 9 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,19 @@
"private": true,
"scripts": {
"dev": "next dev",
"build": "next build",
"build": "run-s build:rss build:next",
"build:rss": "ts-node --project tsconfig.rss.json ./src/rss-builder/build.ts",
"build:next": "next build",
"start": "next start"
},
"dependencies": {
"next": "9.5.5",
"react": "16.14.0",
"react-dom": "16.14.0"
"react-dom": "16.14.0",
"rss-parser": "^3.9.0"
},
"devDependencies": {
"@types/fs-extra": "^9.0.2",
"@types/node": "^14.11.10",
"@types/react-dom": "^16.9.8",
"@typescript-eslint/eslint-plugin": "^4.4.1",
Expand All @@ -21,8 +25,11 @@
"eslint-plugin-prettier": "^3.1.4",
"eslint-plugin-react": "^7.21.4",
"eslint-plugin-react-hooks": "^4.1.2",
"fs-extra": "^9.0.1",
"npm-run-all": "^4.1.5",
"prettier": "^2.1.2",
"sass": "^1.27.0",
"ts-node": "^9.0.0",
"typescript": "^4.0.3"
}
}
20 changes: 0 additions & 20 deletions site.config.json

This file was deleted.

20 changes: 20 additions & 0 deletions site.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
export const config = {
siteMeta: {
title: "Foo Tech Blog",
description: "A RSS based blog template for teams.",
},
headerLinks: [
{
title: "About",
href: "/about",
},
{
title: "Company",
href: "https://zenn.dev",
},
{
title: "GitHub",
href: "https://rss-based-blog.com",
},
],
};
63 changes: 63 additions & 0 deletions src/rss-builder/build.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import fs from "fs-extra";
import Parser from "rss-parser";
import { members } from "../../members";
import { PostItem, Member } from "../types";
export default {};

type FeedItem = {
title: string;
link: string;
contentSnippet?: string;
isoDate?: string;
};

const parser = new Parser();
let allPostItems: PostItem[] = [];

async function fetchFeedItems(url: string) {
const feed = await parser.parseURL(url);
if (!feed?.items?.length) return [];

// return item which has title and link
return feed.items
.map(({ title, contentSnippet, link, isoDate }) => {
return {
title,
contentSnippet: contentSnippet?.replace(/\n/g, ""),
link,
isoDate,
};
})
.filter(({ title, link }) => title && link) as FeedItem[];
}

async function getFeedItemsFromSources(sources: undefined | string[]) {
if (!sources?.length) return [];
let feedItems: FeedItem[] = [];
for (const url of sources) {
const items = await fetchFeedItems(url);
if (items) feedItems = [...feedItems, ...items];
}
return feedItems;
}

async function getMemberFeedItems(member: Member): Promise<PostItem[]> {
const feedItems = await getFeedItemsFromSources(member.sources);
if (!feedItems) return [];

return feedItems.map((item) => {
return {
...item,
authorName: member.name,
};
});
}

(async function () {
for (const member of members) {
const items = await getMemberFeedItems(member);
if (items) allPostItems = [...allPostItems, ...items];
}
fs.ensureDirSync(".contents");
fs.writeJsonSync(".contents/posts.json", allPostItems);
})();
15 changes: 15 additions & 0 deletions src/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
export type Member = {
name: string;
avatarFileName: string;
role?: string;
bio?: string;
sources?: string[];
};

export type PostItem = {
authorName: string;
title?: string;
contentSnippet?: string;
link?: string;
isoDate?: string;
};
2 changes: 1 addition & 1 deletion tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,5 +21,5 @@
}
},
"exclude": ["node_modules"],
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"]
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "next.config.js"]
}
10 changes: 10 additions & 0 deletions tsconfig.rss.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"module": "commonjs",
"outDir": "dist",
"noEmit": false
},
"exclude": ["node_modules"],
"include": ["src/rss-builder/*.ts"]
}
Loading

0 comments on commit 0b79343

Please sign in to comment.