X-Git-Url: https://git.xangelo.ca/?p=rss-reader.git;a=blobdiff_plain;f=src%2Fserver.ts;fp=src%2Fserver.ts;h=c2a3fdaf1163b43d80da4e7dd6ce0f1525fac57a;hp=f14064906fb45858d6421aaec4803e769d5780a3;hb=c4086a1643d98811aa21417d50c411cd20d9da9f;hpb=d9d4f30790381b8d786a1effb5ac64d8f56a6dd3 diff --git a/src/server.ts b/src/server.ts index f140649..c2a3fda 100644 --- a/src/server.ts +++ b/src/server.ts @@ -5,6 +5,7 @@ import { v4 as uuidv4 } from 'uuid'; import { ingest, ingestSingle } from './ingester'; import {RSSParser} from './parsers/rss'; import bodyParser from 'body-parser'; +import {BaseParser} from './parsers/base'; const app = express(); @@ -63,8 +64,12 @@ apiPost('/feeds', async (req, res): Promise => { // get info about the feed const url = req.body.link; - const rss = new RSSParser(); - const feedData = await rss.parse(url); + let parser: BaseParser; + + // based on the url, we should figure out if this is a reddit or rss feed + parser = new RSSParser(); + + const feedData = await parser.parse(url); const title = feedData.title; const id = uuidv4(); @@ -108,7 +113,7 @@ apiGet('/feeds', async (req, res): Promise => { const display = feed.unread ? `(${feed.unread})` : ''; const first = idx === 0; - return `
  • ${feed.title} + return `
  • ${feed.title} ${display}
  • ` }).join("\n")}`; @@ -120,13 +125,36 @@ function reasonable(date: Date): string { return `${date.getFullYear()}-${month}-${day}`; } -apiGet('/feeds/:feed_id/items', async (req, res): Promise => { +apiGet('/feeds/:feed_id', async (req, res): Promise => { const id = req.params.feed_id; + return query.getFeedInfo.get(id); +}, (feed: any): string => { + return ` + Feed: ${feed.title}
    + Link: ${feed.link}
    + `; +}); - return query.getFeedsFor.all(id, 0); +apiGet('/feeds/:feed_id/items', async (req, res): Promise => { + const id = req.params.feed_id; + return { + items: query.getFeedsFor.all(id, 0), + info: query.getFeedInfo.get(id) + } }, (feedData: any): string => { return ` - ${feedData.map((item: any, index: number) => { +
    + + Feed: ${feedData.info.title}
    +
    +
    +
    TitlePublish Date
    +
    + `; }); +apiPost('/feeds/:feed_id/items/markAsRead', async (req, res): Promise => { + const id = req.params.feed_id; + query.readAllItems.run(id); + return; +}); + apiGet('/feeds/:feed_id/items/:item_id', async (req, res) => { const feed_id = req.params.feed_id; const item_id = req.params.item_id; @@ -157,6 +192,14 @@ apiGet('/feeds/:feed_id/items/:item_id', async (req, res) => { return output.content; }); +apiDelete('/feeds/:feed_id', async (req, res) => { + const id = req.params.feed_id; + + query.deleteFeed.run(id); + res.setHeader('HX-Trigger', 'newFeed'); + return; +}); + async function periodicIngest() { await ingest(); setTimeout(periodicIngest, 1000 * 60 * 10);