diff --git a/app/controllers/newsroom.js b/app/controllers/newsroom.js index da517dc..b8ae8dd 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,21 +29,27 @@ class NewsroomController extends SiteController { router.param('feedId', this.populateFeedId.bind(this)); - router.get('/feed', this.getUnifiedFeed.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) { @@ -50,17 +57,31 @@ 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 } = this.dtp.services; + 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); @@ -71,7 +92,12 @@ class NewsroomController extends SiteController { break; } } catch (error) { - this.log.error('failed to present newsfeed JSON', { 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, @@ -80,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, 12); 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); } } diff --git a/app/views/newsroom/index.pug b/app/views/newsroom/index.pug index be94255..e0423a6 100644 --- a/app/views/newsroom/index.pug +++ b/app/views/newsroom/index.pug @@ -11,7 +11,8 @@ block content .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 View All + 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 diff --git a/config/limiter.js b/config/limiter.js index a7c417d..9c587ca 100644 --- a/config/limiter.js +++ b/config/limiter.js @@ -293,15 +293,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', }, },