Skip to content

Commit

Permalink
Adding /feeds/delayed route to Posts service
Browse files Browse the repository at this point in the history
* Adding functions in posts/src/route/feeds.js, adding test in posts/test/feeds.test.js, fixing the setDelayedFeeds function in posts/src/storage.js and backend/utils/storage.js

* removing timeLeft infor in getDelayedFeeds
  • Loading branch information
“hphan9” authored and humphd committed Dec 10, 2021
1 parent 8b02287 commit d08ca5f
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 3 deletions.
19 changes: 18 additions & 1 deletion src/api/posts/src/routes/feeds.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
const { Router, logger, isAuthenticated, isAuthorized } = require('@senecacdot/satellite');
const Feed = require('../data/feed');
const { getFeeds, getInvalidFeeds } = require('../storage');
const { getFeeds, getInvalidFeeds, getDelayedFeeds } = require('../storage');
const { validateNewFeed, validateFeedsIdParam } = require('../validation');

const feeds = Router();
Expand Down Expand Up @@ -45,6 +45,23 @@ feeds.get('/invalid', async (req, res, next) => {
);
});

feeds.get('/delayed', async (req, res, next) => {
let delayedFeeds;
try {
delayedFeeds = await getDelayedFeeds();
} catch (error) {
logger.error({ error }, 'Unable to get delayed feeds from Redis');
return next(error);
}
res.set('X-Total-Count', delayedFeeds.length);
return res.json(
delayedFeeds.map((element) => ({
...element,
url: `${feedURL}/${element.id}`,
}))
);
});

feeds.get('/:id', validateFeedsIdParam(), async (req, res, next) => {
const { id } = req.params;

Expand Down
12 changes: 11 additions & 1 deletion src/api/posts/src/storage.js
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,16 @@ module.exports = {
);
},

getDelayedFeeds: async () => {
const delayedKeys = await getFeedKeysUsingScanStream(`${feedNamespace}*${delayedSuffix}`);
return delayedKeys.map((key) => {
const id = key.replace(feedNamespace, '').replace(delayedSuffix, '');
return {
id,
};
});
},

getFlaggedFeeds: () => redis.smembers(flaggedFeedsKey),

getFeed: (id) => redis.hgetall(feedNamespace.concat(id)),
Expand Down Expand Up @@ -127,7 +137,7 @@ module.exports = {

isInvalid: (id) => redis.exists(createInvalidFeedKey(id)),

setDelayedFeed: (id, seconds) => redis.set(createDelayedFeedKey(id), seconds, 1),
setDelayedFeed: (id, seconds) => redis.set(createDelayedFeedKey(id), seconds, 'EX', seconds),

isDelayed: (id) => redis.exists(createDelayedFeedKey(id)),

Expand Down
34 changes: 34 additions & 0 deletions src/api/posts/test/feeds.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,37 @@ describe('Test GET /feeds/invalid endpoint', () => {
expect(res.body[0].id).toBe(feeds[0].id);
});
});
describe('Test GET /feeds/delayed endpoint', () => {
const createdItems = 150;
// Array of feeds
const feeds = [...Array(createdItems).keys()].map((item) => {
return new Feed('foo', `http://telescope${item}.cdot.systems`);
});
beforeAll(() => Promise.all(feeds.map((feed) => feed.save())));

it('Should return 200 and empty body when there are no delayed feeds', async () => {
const res = await request(app).get('/feeds/delayed');

expect(res.status).toEqual(200);
expect(res.get('Content-type')).toContain('application/json');
expect(res.get('X-Total-Count')).toBe('0');
expect(res.body.length).toBe(0);
expect(res.body instanceof Array).toBe(true);
});

it('Should return 200 and delayed feeds object', async () => {
// arrange invalid feeds
const createDelayedFeeds = 10;
for (let i = 0; i < createDelayedFeeds; i += 1) {
feeds[i].setDelayed(3600);
}
const res = await request(app).get('/feeds/delayed');

expect(res.status).toEqual(200);
expect(res.get('Content-type')).toContain('application/json');
expect(res.get('X-Total-Count')).toBe(createDelayedFeeds.toString());
expect(res.body.length).toBe(createDelayedFeeds);
expect(res.body instanceof Array).toBe(true);
expect(res.body[0].id).toBe(feeds[0].id);
});
});
2 changes: 1 addition & 1 deletion src/backend/utils/storage.js
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ module.exports = {

isInvalid: (id) => redis.exists(createInvalidFeedKey(id)),

setDelayedFeed: (id, seconds) => redis.set(createDelayedFeedKey(id), seconds, 1),
setDelayedFeed: (id, seconds) => redis.set(createDelayedFeedKey(id), seconds, 'EX', seconds),

isDelayed: (id) => redis.exists(createDelayedFeedKey(id)),

Expand Down

0 comments on commit d08ca5f

Please sign in to comment.