Skip to content

Commit ce3bdfb

Browse files
committed
Added user badges api with a simple test
1 parent 5791a10 commit ce3bdfb

File tree

6 files changed

+115
-3
lines changed

6 files changed

+115
-3
lines changed

controllers/badge.js

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,20 @@ const getBadges = async (req, res) => {
2020
}
2121
}
2222

23+
const getUserBadges = async (req, res) => {
24+
try {
25+
const allUserBadges = await badgeQuery.fetchUserBadges(req.params.username)
26+
return res.json({
27+
message: 'User badges returned successfully!',
28+
userBadges: allUserBadges
29+
})
30+
} catch (error) {
31+
logger.error(`Error while fetching all user badges: ${error}`)
32+
return res.boom.serverUnavailable('Something went wrong please contact admin')
33+
}
34+
}
35+
2336
module.exports = {
24-
getBadges
37+
getBadges,
38+
getUserBadges
2539
}

docs/swaggerDefinition.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,17 @@ const swaggerOptions = {
482482
}
483483
}
484484
},
485+
userBadges: {
486+
type: 'object',
487+
properties: {
488+
title: {
489+
type: 'string'
490+
},
491+
description: {
492+
type: 'string'
493+
}
494+
}
495+
},
485496
userAvailable: {
486497
type: 'object',
487498
properties: {

models/badges.js

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,35 @@ const fetchBadges = async ({
2727
}
2828
}
2929

30+
/**
31+
* Fetches the data about user badges
32+
* @param query { Object }: Filter for badges data
33+
* @return {Promise<userBadgeModel|Array>}
34+
*/
35+
36+
const fetchUserBadges = async (username) => {
37+
try {
38+
const snapshot = await badgeModel.get()
39+
const allBadges = []
40+
snapshot.forEach((doc) => {
41+
allBadges.push(doc.data())
42+
})
43+
const userBadges = []
44+
allBadges.forEach((badge) => {
45+
badge.users.forEach((user) => {
46+
if (user === username) {
47+
userBadges.push({ title: badge.title, description: badge.description })
48+
}
49+
})
50+
})
51+
return userBadges
52+
} catch (err) {
53+
logger.error('Error retrieving user badges', err)
54+
return err
55+
}
56+
}
57+
3058
module.exports = {
31-
fetchBadges
59+
fetchBadges,
60+
fetchUserBadges
3261
}

public/apiSchema.json

Lines changed: 0 additions & 1 deletion
This file was deleted.

routes/badges.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,37 @@ const badge = require('../controllers/badge.js')
3434
*/
3535
router.get('/', badge.getBadges)
3636

37+
/**
38+
* @swagger
39+
* /badges/:username:
40+
* get:
41+
* summary: Get all the badges of a particular user.
42+
*
43+
* tags:
44+
* - Badges
45+
* responses:
46+
* 200:
47+
* description: User badegs
48+
* content:
49+
* application/json:
50+
* schema:
51+
* type: object
52+
* properties:
53+
* message:
54+
* type: string
55+
* example: User badges returned successfully!
56+
* userBadges:
57+
* type: array
58+
* items:
59+
* $ref: '#/components/schemas/userBadges'
60+
* 503:
61+
* description: serverUnavailable
62+
* content:
63+
* application/json:
64+
* schema:
65+
* $ref: '#/components/schemas/errors/serverUnavailable'
66+
*/
67+
68+
router.get('/:username', badge.getUserBadges)
69+
3770
module.exports = router
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
const chai = require('chai')
2+
const { expect } = chai
3+
const chaiHttp = require('chai-http')
4+
5+
const app = require('../../server')
6+
7+
chai.use(chaiHttp)
8+
9+
describe('User badges', function () {
10+
describe('GET /badges/:username', function () {
11+
it('Should get the list of user badges', function (done) {
12+
chai
13+
.request(app)
14+
.get('/badges/ankush')
15+
.end((err, res) => {
16+
if (err) { return done() }
17+
expect(res).to.have.status(200)
18+
expect(res.body).to.be.a('object')
19+
expect(res.body.message).to.equal('User badges returned successfully!')
20+
expect(res.body.userBadges).to.be.a('array')
21+
22+
return done()
23+
})
24+
})
25+
})
26+
})

0 commit comments

Comments
 (0)