Skip to content

Commit d7ce38c

Browse files
Began adding tests
1 parent b555c2d commit d7ce38c

9 files changed

+365
-11
lines changed

server/controllers/like.controller.js

+80
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import Like from '../models/like.model';
2+
3+
/**
4+
* Load like and append to req.
5+
*/
6+
function load(req, res, next, id) {
7+
Like.get(id, req.user._id)
8+
.then((like) => {
9+
req.like = like; // eslint-disable-line no-param-reassign
10+
return next();
11+
})
12+
.catch(e => next(e));
13+
}
14+
15+
/**
16+
* Get like
17+
* @returns {Like}
18+
*/
19+
function get(req, res) {
20+
return res.json(req.like);
21+
}
22+
23+
/**
24+
* Create new like
25+
* @property {string} req.body.likename - The likename of like.
26+
* @property {string} req.body.mobileNumber - The mobileNumber of like.
27+
* @returns {Like}
28+
*/
29+
function create(req, res, next) {
30+
const like = new Like({
31+
likename: req.body.likename,
32+
mobileNumber: req.body.mobileNumber
33+
});
34+
35+
like.save()
36+
.then(savedLike => res.json(savedLike))
37+
.catch(e => next(e));
38+
}
39+
40+
/**
41+
* Update existing like
42+
* @property {string} req.body.likename - The likename of like.
43+
* @property {string} req.body.mobileNumber - The mobileNumber of like.
44+
* @returns {Like}
45+
*/
46+
function update(req, res, next) {
47+
const like = req.like;
48+
like.likename = req.body.likename;
49+
like.mobileNumber = req.body.mobileNumber;
50+
51+
like.save()
52+
.then(savedLike => res.json(savedLike))
53+
.catch(e => next(e));
54+
}
55+
56+
/**
57+
* Get like list.
58+
* @property {number} req.query.skip - Number of likes to be skipped.
59+
* @property {number} req.query.limit - Limit number of likes to be returned.
60+
* @returns {Like[]}
61+
*/
62+
function list(req, res, next) {
63+
const { limit = 50, skip = 0 } = req.query;
64+
Like.list({ limit, skip }, req.user._id)
65+
.then(likes => res.json(likes))
66+
.catch(e => next(e));
67+
}
68+
69+
/**
70+
* Delete like.
71+
* @returns {Like}
72+
*/
73+
function remove(req, res, next) {
74+
const like = req.like;
75+
like.remove()
76+
.then(deletedLike => res.json(deletedLike))
77+
.catch(e => next(e));
78+
}
79+
80+
export default { load, get, create, update, list, remove };

server/controllers/post.controller.js

+39-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import Post from '../models/post.model';
2+
import Like from '../models/like.model';
23

34
/**
45
* Load user and append to req.
@@ -77,4 +78,41 @@ function remove(req, res, next) {
7778
.catch(e => next(e));
7879
}
7980

80-
export default { load, get, create, update, list, remove };
81+
/**
82+
* Like a post
83+
*/
84+
function like(req, res, next, id) {
85+
Like.findOne({
86+
postId: id,
87+
userId: req.user._id,
88+
})
89+
.then((like) => {
90+
if (like) {
91+
like.active = !like.active;
92+
93+
if (like.active) {
94+
// raccoon.liked('userId', 'itemId')
95+
} else {
96+
// raccoon.unliked('userId', 'itemId')
97+
}
98+
99+
return like;
100+
}
101+
102+
let newlike = new Like();
103+
newlike.postId = id;
104+
newlike.userId = req.user._id;
105+
newlike.type = 'upvote'; // @TODO: Make constant
106+
107+
// raccoon.liked('userId', 'itemId')
108+
109+
return newlike.save();
110+
})
111+
.then((like) => {
112+
req.like = like; // eslint-disable-line no-param-reassign
113+
return next();
114+
})
115+
.catch(e => next(e));
116+
}
117+
118+
export default { load, get, create, update, list, remove, like };

server/models/like.model.js

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import Promise from 'bluebird';
2+
import mongoose from 'mongoose';
3+
import httpStatus from 'http-status';
4+
import APIError from '../helpers/APIError';
5+
6+
/**
7+
* Like Schema
8+
*/
9+
const LikeSchema = new mongoose.Schema({
10+
userId: String,
11+
postId: String,
12+
type: String,
13+
active: {type: Boolean, default: true},
14+
});
15+
16+
/**
17+
* Add your
18+
* - pre-save hooks
19+
* - validations
20+
* - virtuals
21+
*/
22+
23+
/**
24+
* Methods
25+
*/
26+
LikeSchema.method({
27+
});
28+
29+
/**
30+
* Statics
31+
*/
32+
LikeSchema.statics = {
33+
/**
34+
* Get user
35+
* @param {ObjectId} id - The objectId of user.
36+
* @returns {Promise<Like, APIError>}
37+
*/
38+
get(id, userId) {
39+
return this.findOne({id, userId})
40+
.exec()
41+
.then((user) => {
42+
if (user) {
43+
return user;
44+
}
45+
const err = new APIError('No such user exists!', httpStatus.NOT_FOUND);
46+
return Promise.reject(err);
47+
});
48+
},
49+
50+
/**
51+
* List users in descending order of 'createdAt' timestamp.
52+
* @param {number} skip - Number of users to be skipped.
53+
* @param {number} limit - Limit number of users to be returned.
54+
* @returns {Promise<Like[]>}
55+
*/
56+
list({ skip = 0, limit = 50 } = {}, userId) {
57+
return this.find({userId})
58+
.sort({ createdAt: -1 })
59+
.skip(+skip)
60+
.limit(+limit)
61+
.exec();
62+
}
63+
};
64+
65+
/**
66+
* @typedef Like
67+
*/
68+
export default mongoose.model('Like', LikeSchema);

server/routes/index.route.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import express from 'express';
22
import userRoutes from './user.route';
33
import postRoutes from './post.route';
4+
import likeRoutes from './like.route';
45
import authRoutes from './auth.route';
56

67
const router = express.Router(); // eslint-disable-line new-cap
@@ -10,11 +11,11 @@ router.get('/health-check', (req, res) =>
1011
res.send('OK')
1112
);
1213

13-
// mount user routes at /users
1414
router.use('/posts', postRoutes);
15+
router.use('/likes', likeRoutes);
1516

1617
// mount user routes at /users
17-
router.use('/users', userRoutes);
18+
// router.use('/users', userRoutes);
1819

1920
// mount auth routes at /auth
2021
router.use('/auth', authRoutes);

server/routes/like.route.js

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import express from 'express';
2+
import validate from 'express-validation';
3+
import expressJwt from 'express-jwt';
4+
import paramValidation from '../../config/param-validation';
5+
import ctrl from '../controllers/like.controller';
6+
import config from '../../config/config';
7+
8+
const router = express.Router(); // eslint-disable-line new-cap
9+
10+
router.route('/')
11+
/** GET /api/likes - Get list of likes */
12+
.get(expressJwt({ secret: config.jwtSecret }), ctrl.list)
13+
14+
/** POST /api/likes - Create new like */
15+
// .post(validate(paramValidation.createLike), ctrl.create);
16+
17+
router.route('/:likeId')
18+
/** GET /api/likes/:likeId - Get like */
19+
.get(expressJwt({ secret: config.jwtSecret }), ctrl.get)
20+
21+
/** PUT /api/likes/:likeId - Update like */
22+
// .put(validate(paramValidation.updateLike), ctrl.update)
23+
24+
/** DELETE /api/likes/:likeId - Delete like */
25+
// .delete(ctrl.remove);
26+
27+
/** Load like when API with likeId route parameter is hit */
28+
router.param('likeId', ctrl.load);
29+
30+
export default router;

server/routes/post.route.js

+10-7
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,31 @@
11
import express from 'express';
22
import validate from 'express-validation';
33
import paramValidation from '../../config/param-validation';
4-
import userCtrl from '../controllers/post.controller';
4+
import ctrl from '../controllers/post.controller';
55

66
const router = express.Router(); // eslint-disable-line new-cap
77

88
router.route('/')
99
/** GET /api/posts - Get list of posts */
10-
.get(userCtrl.list)
10+
.get(ctrl.list)
1111

1212
/** POST /api/posts - Create new user */
13-
.post(validate(paramValidation.createPost), userCtrl.create);
13+
.post(validate(paramValidation.createPost), ctrl.create);
1414

1515
router.route('/:postId')
1616
/** GET /api/posts/:postId - Get user */
17-
.get(userCtrl.get)
17+
.get(ctrl.get)
1818

1919
/** PUT /api/posts/:postId - Update user */
20-
// .put(validate(paramValidation.updatePost), userCtrl.update)
20+
// .put(validate(paramValidation.updatePost), ctrl.update)
2121

2222
/** DELETE /api/posts/:postId - Delete user */
23-
// .delete(userCtrl.remove);
23+
// .delete(ctrl.remove);
24+
25+
router.route('/:postId/like')
26+
.post(ctrl.like);
2427

2528
/** Load user when API with postId route parameter is hit */
26-
router.param('postId', userCtrl.load);
29+
router.param('postId', ctrl.load);
2730

2831
export default router;

server/tests/auth.test.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import config from '../../config/config';
77

88
chai.config.includeStack = true;
99

10-
describe('## Auth APIs', () => {
10+
describe.only('## Auth APIs', () => {
1111
const validUserCredentials = {
1212
username: 'react',
1313
password: 'express'

0 commit comments

Comments
 (0)