Skip to content

Commit

Permalink
rating(paginating) paginate and refactor rating
Browse files Browse the repository at this point in the history
[Starts #167313406]
  • Loading branch information
salviosage committed Aug 29, 2019
1 parent f35b173 commit ab52873
Show file tree
Hide file tree
Showing 9 changed files with 302 additions and 245 deletions.
140 changes: 71 additions & 69 deletions src/controllers/rating.controller.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
import db from '../models/index';
import db from '../models';
import RateService from '../services/rate.service';
import Util from '../helpers/util';

// const db = models.Rate;

const util = new Util();
/**
*
*
Expand All @@ -15,72 +20,57 @@ class rateController {
* @returns {Object} return rating information to user
* @memberof UserController
*/
static async setArticleRating(req, res) {
static async createOrUpdateRate(req, res) {
try {
// Initialize rating data
const userEmail = req.auth.email;
const { rate } = req.body;
const { articleSlug } = req.params;
const rateSchema = { userEmail, articleSlug, rate };

// check if user is trying to rate his/her own article
const article = await db.Article.findOne({
where: { slug: articleSlug }
});
const user = await db.user.findOne({
where: { id: article.authorId }
let response;
// check if rate is arleady there
const isRate = await db.Rate.findOne({
where: { articleSlug, userEmail }
});
if (user.email === userEmail) {
return res.status(400).send({
status: 400,
message: 'You cannot rate your own article'
});
// update rate rating
if (isRate) {
response = await RateService.update(rateSchema);
} else {
// create rating
response = await RateService.create(rateSchema);
}

// create rating
const createdRate = await RateService.create(rateSchema);
return res.status(200).send({
status: 200,
message: 'Thank you for rating this article',
data: createdRate
});
util.setSuccess(200, 'Successfully rated', response);
return util.send(res);
} catch (error) {
return res.status(404).send({
status: 404,
message: error.message
});
util.setError(500, 'server error contact admin');
return util.send(res);
}
}

/**
*
*
* @static
* @param {*} req
* @param {*} res
* @returns {Object} return rating information to user
* @memberof UserController
*/
static async updateArticleRating(req, res) {
*
*
* @static
* @param {*} req
* @param {*} res
* @returns {Object} return rating information to user
* @memberof rateController
*/
static async getAllRating(req, res) {
try {
// Initialize rating data
const userEmail = req.auth.email;
const { rate } = req.body;
const { articleSlug } = req.params;

// update article rate
const updatedRate = await RateService.update(articleSlug, userEmail, rate);
if (!updatedRate) {
return res.status(400).send({
status: 400,
error: `Rating for article with Slug: ${articleSlug} not found`
});
const count = await db.Rate.count();
if (count === 0) {
util.setError(404, 'no rate yet made');
return util.send(res);
}
return res.status(200).send({
status: 200,
message: 'Thank you for rating this article',
newRating: updatedRate
});
if (req.offset >= count) {
req.offset = 0;
}
const { offset, limit } = req;
// find particular rating
const allRates = await RateService.getAll(offset, limit);
util.setSuccess(200, 'all rates retrieved successfully', allRates);
return util.send(res);
} catch (error) {
return res.status(404).send({
status: 404,
Expand All @@ -101,27 +91,39 @@ class rateController {
static async getArticleRating(req, res) {
try {
// Initialize rating data
const userEmail = req.auth.email;
const { articleSlug } = req.params;

// find particular rating
const userRate = await RateService.findOne(articleSlug, userEmail);
if (!userRate) {
return res.status(400).send({
status: 400,
error: `Rating for article with slug ${articleSlug} not found`,
});
// check if rate is arleady there
const isArticle = await db.Article.findOne({
where: { slug: articleSlug }
});
if (!isArticle) {
util.setError(404, 'post not found');
return util.send(res);
}
return res.status(200).send({
status: 200,
message: `Rating for article with slug ${articleSlug} found`,
data: userRate
const count = await db.Rate.count({
where: { articleSlug }
});
if (count === 0) {
util.setError(404, `Rating for article with slug ${articleSlug} not found`);
return util.send(res);
}
const rating = await RateService.getArticleRatingStatistic(articleSlug);
if (req.offset >= count) {
req.offset = 0;
}
const { offset, limit } = req;
// find particular rating
const ArticleRAting = await RateService.findArticlesRatings(articleSlug, limit, offset);
const response = {
rating,
count,
data: ArticleRAting
};
util.setSuccess(200, `Rating for article with slug ${articleSlug} found`, response);
return util.send(res);
} catch (error) {
return res.status(404).send({
status: 404,
message: error.message
});
util.setError(500, 'server error contact admin');
return util.send(res);
}
}
}
Expand Down
26 changes: 26 additions & 0 deletions src/middlewares/rate.middleware.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import Util from '../helpers/util';
import models from '../models/index';

const util = new Util();

export default async (req, res, next) => {
try {
const ArticleSlug = req.params.articleSlug;
const post = await models.Article.findOne({ where: { slug: ArticleSlug } });

if (!post) {
util.setError(404, 'post not found');
return util.send(res);
}
const user = await models.user.findOne({ where: { email: req.auth.email } });
const userId = user.id;
if (userId === post.authorId) {
util.setError(400, 'You cannot rate your own article');
return util.send(res);
}
next();
} catch (error) {
util.setError(500, 'server error contact admin');
return util.send(res);
}
};
3 changes: 2 additions & 1 deletion src/middlewares/validators/rate.validation.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ export default (req, res, next) => {
const { rate } = req.body;

const schema = {
rate: Joi.number().integer().min(1).max(5),
rate: Joi.number().integer().min(1).max(5)
.required(),
};
const { error } = Joi.validate({
rate
Expand Down
5 changes: 2 additions & 3 deletions src/migrations/20190814093719-create-rate.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,8 @@ module.exports = {
onUpdate: 'CASCADE'
},
rate: {
type: Sequelize.ENUM({
values: [1, 2, 3, 4, 5]
})
allowNull: false,
type: Sequelize.INTEGER
},
createdAt: {
allowNull: false,
Expand Down
2 changes: 2 additions & 0 deletions src/migrations/20190823185735-create-reporting.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ module.exports = {
},
userId: {
type: Sequelize.INTEGER,
allowNull: false,
onDelete: 'CASCADE',
onUpdate: 'CASCADE',
references: {
Expand All @@ -28,6 +29,7 @@ module.exports = {
}
},
reason: {
allowNull: false,
type: Sequelize.ENUM,
values: ['Rules Violation', 'Spam', 'Harassment'],
},
Expand Down
4 changes: 1 addition & 3 deletions src/models/rate.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,7 @@ module.exports = (sequelize, DataTypes) => {
onDelete: 'CASCADE',
onUpdate: 'CASCADE'
},
rate: DataTypes.ENUM({
values: [1, 2, 3, 4, 5]
})
rate: DataTypes.INTEGER,
}, {});
Rate.associate = function (models) {
Rate.belongsTo(models.user, {
Expand Down
8 changes: 4 additions & 4 deletions src/routes/api/rate/rate.route.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@ import validateToken from '../../../middlewares/auth';
import confirmEmaiAuth from '../../../middlewares/emailVarification.middleware';
import rateController from '../../../controllers/rating.controller';
import sanitizeRate from '../../../middlewares/validators/rate.validation';
import { checkQuery } from '../../../middlewares/query.check';

const router = express.Router();

router.get('/:articleSlug', [validateToken, confirmEmaiAuth], rateController.getArticleRating);
router.post('/:articleSlug', [validateToken, sanitizeRate, confirmEmaiAuth], rateController.setArticleRating);
router.patch('/:articleSlug', [validateToken, sanitizeRate, confirmEmaiAuth], rateController.updateArticleRating);
router.get('/', checkQuery, rateController.getAllRating);
router.get('/:articleSlug', checkQuery, [validateToken, confirmEmaiAuth], rateController.getArticleRating);
router.put('/:articleSlug', [validateToken, sanitizeRate, confirmEmaiAuth], rateController.createOrUpdateRate);

export default router;
Loading

0 comments on commit ab52873

Please sign in to comment.