From b7b868257f6764c9646f88c837acdce0b98a36e9 Mon Sep 17 00:00:00 2001 From: rob Date: Sun, 18 Jun 2023 18:34:40 -0400 Subject: [PATCH 1/3] backport Unified Feed from Sites to Base --- app/controllers/newsroom.js | 60 +++++++++++++++++++++++++++-- app/views/newsroom/index.pug | 9 ++++- app/views/newsroom/unified-feed.pug | 27 +++++++++++++ config/limiter.js | 11 ++++-- 4 files changed, 99 insertions(+), 8 deletions(-) create mode 100644 app/views/newsroom/unified-feed.pug diff --git a/app/controllers/newsroom.js b/app/controllers/newsroom.js index 1e905c9..4f161bf 100644 --- a/app/controllers/newsroom.js +++ b/app/controllers/newsroom.js @@ -17,6 +17,7 @@ class NewsroomController extends SiteController { async start ( ) { const { dtp } = this; const { limiter: limiterService } = dtp.services; + const limiterConfig = limiterService.config.newsroom; const router = express.Router(); dtp.app.use('/newsroom', router); @@ -28,19 +29,27 @@ class NewsroomController extends SiteController { router.param('feedId', this.populateFeedId.bind(this)); + router.get('/feed', + limiterService.createMiddleware(limiterConfig.getUnifiedFeed), + this.getUnifiedFeed.bind(this), + ); + router.get('/:feedId', - limiterService.createMiddleware(limiterService.config.newsroom.getFeedView), + limiterService.createMiddleware(limiterConfig.getFeedView), this.getFeedView.bind(this), ); router.get('/', - limiterService.createMiddleware(limiterService.config.newsletter.getIndex), + limiterService.createMiddleware(limiterConfig.getIndex), this.getHome.bind(this), ); } async populateFeedId (req, res, next, feedId) { - const { feed: feedService } = this.dtp.services; + const { + feed: feedService, + logan: loganService, + } = this.dtp.services; try { res.locals.feed = await feedService.getById(feedId); if (!res.locals.feed) { @@ -48,11 +57,54 @@ class NewsroomController extends SiteController { } return next(); } catch (error) { - this.log.error('failed to populate feedId', { feedId, error }); + loganService.sendRequestEvent(module.exports, req, { + level: 'error', + event: 'populateFeedId', + message: error.message, + data: { feedId, error }, + }); return next(error); } } + async getUnifiedFeed (req, res) { + const { + feed: feedService, + logan: loganService, + } = this.dtp.services; + try { + res.locals.pagination = this.getPaginationParameters(req, 20); + res.locals.newsroom = await feedService.getNewsfeed(res.locals.pagination); + + loganService.sendRequestEvent(module.exports, req, { + level: 'info', + event: 'getUnifiedFeed', + data: { fmt: req.query.fmt || 'html' }, + }); + + switch (req.query.fmt) { + case 'json': + res.status(200).json(res.locals.newsroom); + break; + + default: + res.render('newsroom/unified-feed'); + break; + } + } catch (error) { + loganService.sendRequestEvent(module.exports, req, { + level: 'error', + event: 'getUnifiedFeed', + message: error.message, + data: { error }, + }); + res.status(error.statusCode || 500).json({ + success: false, + message: error.message, + }); + } + } + async getFeedView (req, res, next) { const { feed: feedService } = this.dtp.services; try { diff --git a/app/views/newsroom/index.pug b/app/views/newsroom/index.pug index 27fc24a..27f0456 100644 --- a/app/views/newsroom/index.pug +++ b/app/views/newsroom/index.pug @@ -4,7 +4,14 @@ block content section.uk-section.uk-section-default.uk-section-small .uk-container - h1 #{site.name} Newsroom + .uk-margin + div(uk-grid).uk-flex-middle + .uk-width-expand + h1.uk-margin-remove #{site.name} Newsroom + .uk-width-auto + a(href="/newsroom/feed").uk-button.dtp-button-primary.uk-button-small.uk-border-rounded + span View All + if Array.isArray(newsroom.feeds) && (newsroom.feeds.length > 0) div(uk-grid).uk-grid-match each feed in newsroom.feeds diff --git a/app/views/newsroom/unified-feed.pug b/app/views/newsroom/unified-feed.pug new file mode 100644 index 0000000..263f7b2 --- /dev/null +++ b/app/views/newsroom/unified-feed.pug @@ -0,0 +1,27 @@ +extends ../layouts/main +block content + + include ../components/pagination-bar + + section.uk-section.uk-section-default + .uk-container + + article.uk-article + .uk-margin + h1.uk-article-title.uk-margin-remove #{site.name} News Feed + .uk-text-bold #{formatCount(newsroom.totalFeedEntryCount)} articles indexed by #{site.name} in one chronological feed. + + .uk-margin + if Array.isArray(newsroom.entries) && (newsroom.entries.length > 0) + ul.uk-list.uk-list-divider + each entry in newsroom.entries + li + .uk-text-large.uk-text-bold.uk-margin-small + a(href= entry.link, target="shing_reader")= entry.title + .uk-margin-small= entry.description + .uk-text-small source: #[a(href= entry.feed.link, target="_blank")= entry.feed.title] + else + div There are no news feed entries. + + .uk-margin + +renderPaginationBar(`/newsroom/feed`, newsroom.totalFeedEntryCount) \ No newline at end of file diff --git a/config/limiter.js b/config/limiter.js index e49b258..c72c4dd 100644 --- a/config/limiter.js +++ b/config/limiter.js @@ -245,15 +245,20 @@ module.exports = { * NewsroomController */ newsroom: { + getUnifiedFeed: { + total: 15, + expire: ONE_MINUTE, + message: 'You are fetching the unified feed too quickly', + }, getFeedView: { - total: 5, + total: 15, expire: ONE_MINUTE, - message: 'You are reading newsletters too quickly', + message: 'You are fetching news feeds too quickly', }, getIndex: { total: 60, expire: ONE_MINUTE, - message: 'You are fetching newsletters too quickly', + message: 'You are fetching the newsroom too quickly', }, }, From 153e16bc007c84eab185986f9661e8e081c91a02 Mon Sep 17 00:00:00 2001 From: rob Date: Sun, 18 Jun 2023 18:36:17 -0400 Subject: [PATCH 2/3] more Logan logging --- app/controllers/newsroom.js | 42 +++++++++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/app/controllers/newsroom.js b/app/controllers/newsroom.js index 4f161bf..d766809 100644 --- a/app/controllers/newsroom.js +++ b/app/controllers/newsroom.js @@ -106,25 +106,59 @@ class NewsroomController extends SiteController { } async getFeedView (req, res, next) { - const { feed: feedService } = this.dtp.services; + const { + feed: feedService, + logan: loganService, + } = this.dtp.services; try { res.locals.pagination = this.getPaginationParameters(req, 10); res.locals.newsroom = await feedService.getFeedEntries(res.locals.feed, res.locals.pagination); + + loganService.sendRequestEvent(module.exports, req, { + level: 'info', + event: 'getFeedView', + data: { + feed: { + _id: res.locals.feed._id, + title: res.locals.feed.title, + }, + }, + }); + res.render('newsroom/feed-view'); } catch (error) { - this.log.error('failed to present newsroom home', { error }); + loganService.sendRequestEvent(module.exports, req, { + level: 'error', + event: 'getFeedView', + message: error.message, + data: { error }, + }); return next(error); } } async getHome (req, res, next) { - const { feed: feedService } = this.dtp.services; + const { + feed: feedService, + logan: loganService, + } = this.dtp.services; try { res.locals.pagination = this.getPaginationParameters(req, 10); res.locals.newsroom = await feedService.getFeeds(res.locals.pagination, { withEntries: true }); + + loganService.sendRequestEvent(module.exports, req, { + level: 'info', + event: 'getHome', + }); + res.render('newsroom/index'); } catch (error) { - this.log.error('failed to present newsroom home', { error }); + loganService.sendRequestEvent(module.exports, req, { + level: 'error', + event: 'getHome', + message: error.message, + data: { error }, + }); return next(error); } } From 762bdb0ef053a79adc5c0c7958c42161c02a62c3 Mon Sep 17 00:00:00 2001 From: rob Date: Sun, 18 Jun 2023 18:36:27 -0400 Subject: [PATCH 3/3] v0.8.7 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 14808d8..7507c2e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dtp-base", - "version": "0.8.6", + "version": "0.8.7", "description": "Open source web app engine for the Digital Telepresence Platform.", "main": "dtp-webapp.js", "author": "DTP Technologies, LLC",