Skip to content

Commit

Permalink
Began adding tests
Browse files Browse the repository at this point in the history
  • Loading branch information
TheHollidayInn committed Apr 17, 2017
1 parent b555c2d commit d7ce38c
Show file tree
Hide file tree
Showing 9 changed files with 365 additions and 11 deletions.
80 changes: 80 additions & 0 deletions server/controllers/like.controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
import Like from '../models/like.model';

/**
* Load like and append to req.
*/
function load(req, res, next, id) {
Like.get(id, req.user._id)
.then((like) => {
req.like = like; // eslint-disable-line no-param-reassign
return next();
})
.catch(e => next(e));
}

/**
* Get like
* @returns {Like}
*/
function get(req, res) {
return res.json(req.like);
}

/**
* Create new like
* @property {string} req.body.likename - The likename of like.
* @property {string} req.body.mobileNumber - The mobileNumber of like.
* @returns {Like}
*/
function create(req, res, next) {
const like = new Like({
likename: req.body.likename,
mobileNumber: req.body.mobileNumber
});

like.save()
.then(savedLike => res.json(savedLike))
.catch(e => next(e));
}

/**
* Update existing like
* @property {string} req.body.likename - The likename of like.
* @property {string} req.body.mobileNumber - The mobileNumber of like.
* @returns {Like}
*/
function update(req, res, next) {
const like = req.like;
like.likename = req.body.likename;
like.mobileNumber = req.body.mobileNumber;

like.save()
.then(savedLike => res.json(savedLike))
.catch(e => next(e));
}

/**
* Get like list.
* @property {number} req.query.skip - Number of likes to be skipped.
* @property {number} req.query.limit - Limit number of likes to be returned.
* @returns {Like[]}
*/
function list(req, res, next) {
const { limit = 50, skip = 0 } = req.query;
Like.list({ limit, skip }, req.user._id)
.then(likes => res.json(likes))
.catch(e => next(e));
}

/**
* Delete like.
* @returns {Like}
*/
function remove(req, res, next) {
const like = req.like;
like.remove()
.then(deletedLike => res.json(deletedLike))
.catch(e => next(e));
}

export default { load, get, create, update, list, remove };
40 changes: 39 additions & 1 deletion server/controllers/post.controller.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import Post from '../models/post.model';
import Like from '../models/like.model';

/**
* Load user and append to req.
Expand Down Expand Up @@ -77,4 +78,41 @@ function remove(req, res, next) {
.catch(e => next(e));
}

export default { load, get, create, update, list, remove };
/**
* Like a post
*/
function like(req, res, next, id) {
Like.findOne({
postId: id,
userId: req.user._id,
})
.then((like) => {
if (like) {
like.active = !like.active;

if (like.active) {
// raccoon.liked('userId', 'itemId')
} else {
// raccoon.unliked('userId', 'itemId')
}

return like;
}

let newlike = new Like();
newlike.postId = id;
newlike.userId = req.user._id;
newlike.type = 'upvote'; // @TODO: Make constant

// raccoon.liked('userId', 'itemId')

return newlike.save();
})
.then((like) => {
req.like = like; // eslint-disable-line no-param-reassign
return next();
})
.catch(e => next(e));
}

export default { load, get, create, update, list, remove, like };
68 changes: 68 additions & 0 deletions server/models/like.model.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import Promise from 'bluebird';
import mongoose from 'mongoose';
import httpStatus from 'http-status';
import APIError from '../helpers/APIError';

/**
* Like Schema
*/
const LikeSchema = new mongoose.Schema({
userId: String,
postId: String,
type: String,
active: {type: Boolean, default: true},
});

/**
* Add your
* - pre-save hooks
* - validations
* - virtuals
*/

/**
* Methods
*/
LikeSchema.method({
});

/**
* Statics
*/
LikeSchema.statics = {
/**
* Get user
* @param {ObjectId} id - The objectId of user.
* @returns {Promise<Like, APIError>}
*/
get(id, userId) {
return this.findOne({id, userId})
.exec()
.then((user) => {
if (user) {
return user;
}
const err = new APIError('No such user exists!', httpStatus.NOT_FOUND);
return Promise.reject(err);
});
},

/**
* List users in descending order of 'createdAt' timestamp.
* @param {number} skip - Number of users to be skipped.
* @param {number} limit - Limit number of users to be returned.
* @returns {Promise<Like[]>}
*/
list({ skip = 0, limit = 50 } = {}, userId) {
return this.find({userId})
.sort({ createdAt: -1 })
.skip(+skip)
.limit(+limit)
.exec();
}
};

/**
* @typedef Like
*/
export default mongoose.model('Like', LikeSchema);
5 changes: 3 additions & 2 deletions server/routes/index.route.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import express from 'express';
import userRoutes from './user.route';
import postRoutes from './post.route';
import likeRoutes from './like.route';
import authRoutes from './auth.route';

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

// mount user routes at /users
router.use('/posts', postRoutes);
router.use('/likes', likeRoutes);

// mount user routes at /users
router.use('/users', userRoutes);
// router.use('/users', userRoutes);

// mount auth routes at /auth
router.use('/auth', authRoutes);
Expand Down
30 changes: 30 additions & 0 deletions server/routes/like.route.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import express from 'express';
import validate from 'express-validation';
import expressJwt from 'express-jwt';
import paramValidation from '../../config/param-validation';
import ctrl from '../controllers/like.controller';
import config from '../../config/config';

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

router.route('/')
/** GET /api/likes - Get list of likes */
.get(expressJwt({ secret: config.jwtSecret }), ctrl.list)

/** POST /api/likes - Create new like */
// .post(validate(paramValidation.createLike), ctrl.create);

router.route('/:likeId')
/** GET /api/likes/:likeId - Get like */
.get(expressJwt({ secret: config.jwtSecret }), ctrl.get)

/** PUT /api/likes/:likeId - Update like */
// .put(validate(paramValidation.updateLike), ctrl.update)

/** DELETE /api/likes/:likeId - Delete like */
// .delete(ctrl.remove);

/** Load like when API with likeId route parameter is hit */
router.param('likeId', ctrl.load);

export default router;
17 changes: 10 additions & 7 deletions server/routes/post.route.js
Original file line number Diff line number Diff line change
@@ -1,28 +1,31 @@
import express from 'express';
import validate from 'express-validation';
import paramValidation from '../../config/param-validation';
import userCtrl from '../controllers/post.controller';
import ctrl from '../controllers/post.controller';

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

router.route('/')
/** GET /api/posts - Get list of posts */
.get(userCtrl.list)
.get(ctrl.list)

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

router.route('/:postId')
/** GET /api/posts/:postId - Get user */
.get(userCtrl.get)
.get(ctrl.get)

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

/** DELETE /api/posts/:postId - Delete user */
// .delete(userCtrl.remove);
// .delete(ctrl.remove);

router.route('/:postId/like')
.post(ctrl.like);

/** Load user when API with postId route parameter is hit */
router.param('postId', userCtrl.load);
router.param('postId', ctrl.load);

export default router;
2 changes: 1 addition & 1 deletion server/tests/auth.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import config from '../../config/config';

chai.config.includeStack = true;

describe('## Auth APIs', () => {
describe.only('## Auth APIs', () => {
const validUserCredentials = {
username: 'react',
password: 'express'
Expand Down
Loading

0 comments on commit d7ce38c

Please sign in to comment.