Skip to content

Commit

Permalink
Merge pull request #35 from andela/ft-get-read-time-166790104
Browse files Browse the repository at this point in the history
 #166790104 implement readtime on article create and update
  • Loading branch information
shaluchandwani committed Jul 22, 2019
2 parents c670df6 + 4f8b99d commit 44bf265
Show file tree
Hide file tree
Showing 21 changed files with 436 additions and 50 deletions.
3 changes: 1 addition & 2 deletions .coveralls.yml
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
service_name: travis-pro
repo_token: 5wHJgqAVMocmuMfz7Nr26hEBqmO7gtzJJ
repo_token: G3KUaGgIQZdYITPWuU0uIfjZckwOlOq8C
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[![Build Status](https://travis-ci.com/andela/ah-jawans-backend.svg?branch=develop)](https://travis-ci.com/andela/ah-jawans-backend)
[![Reviewed by Hound](https://img.shields.io/badge/Reviewed_by-Hound-8E64B0.svg)](https://houndci.com)
[![Reviewed by Hound](https://img.shields.io/github/issues/andela/ah-jawans-backend.svg?style=flat-square)](https://houndci.com) [![Coverage Status](https://coveralls.io/repos/github/andela/ah-jawans-backend/badge.svg?branch=develop)](https://coveralls.io/github/andela/ah-jawans-backend?branch=develop)
[![Reviewed by Hound](https://img.shields.io/github/issues/andela/ah-jawans-backend.svg?style=flat-square)](https://houndci.com) [![Coverage Status](https://coveralls.io/repos/github/andela/ah-jawans-backend/badge.svg?branch=ft-like-specific-comment-166790108)](https://coveralls.io/github/andela/ah-jawans-backend?branch=develop) [![Maintainability](https://api.codeclimate.com/v1/badges/fbf4e41d7d7846a0bee6/maintainability)](https://codeclimate.com/github/andela/ah-jawans-backend/maintainability)

Authors Haven - A Social platform for the creative at heart.
=======
Expand Down
38 changes: 32 additions & 6 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
"bcryptjs": "^2.4.3",
"body-parser": "^1.19.0",
"cors": "^2.8.4",
"coveralls": "^3.0.5",
"dotenv": "^6.2.0",
"ejs": "^2.6.1",
"email-templates": "^6.0.0",
Expand Down
28 changes: 18 additions & 10 deletions src/controllers/articleController.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import searchUserHelper from './helpers/searchUserHelper';
import searchArticlesHelper from './helpers/searchArticlesHelper';
import eventEmitter from '../template/notifications/EventEmitter';
import findUser from '../helpers/FindUser';
import readTime from './helpers/read_time';

const { Articles, User } = model;

Expand All @@ -27,6 +28,7 @@ class articleContoller {
tags
} = req.body;
let tagList;
const ReadTime = readTime(req.body.body);
tags ? (tagList = tags.split(',')) : tagList = [];
const slug = createSlug(title);
const user = await User.findOne({ where: { email: req.user.email } });
Expand All @@ -39,6 +41,7 @@ class articleContoller {
body,
image,
tagList,
readtime: ReadTime,
authorId: user.id, })
: res.status(401).json({ message: "User not allowed to create an article, login or signin if you don't have an account" });
eventEmitter.emit('publishArticle', userInfo.id, slug);
Expand All @@ -52,16 +55,21 @@ class articleContoller {
description,
image,
} = req.body;

const slug = createSlug(title || req.article.title);
const updatedArticle = await Articles.update({ id: req.article.id,
slug,
title: title || req.article.title,
description: description || req.article.description,
body: body || req.article.body,
image: image || req.article.image,
authorId: req.user.id }, { where: { id: req.params.id } });
updatedArticle && res.status(200).json({ message: 'The article successfully updated!' });
if (req.body.body) {
const slug = createSlug(title || req.article.title);
const newReadTime = readTime(req.body.body);
const updatedArticle = await Articles.update({ id: req.article.id,
slug,
title: title || req.article.title,
description: description || req.article.description,
body: body || req.article.body,
image: image || req.article.image,
readtime: newReadTime,
authorId: req.user.id }, { where: { id: req.params.id } });
updatedArticle && res.status(200).json({ message: 'The article successfully updated!' });
} else {
res.status(404).json({ message: 'article doenot have either title, description or body' });
}
}

static async getAllArticles(req, res) {
Expand Down
101 changes: 101 additions & 0 deletions src/controllers/helpers/likeCommentHelper.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
/* eslint-disable require-jsdoc */
import Sequelize from 'sequelize';
import model from '../../models';

const { Op } = Sequelize;

const { LikeAndDislike, Comments } = model;

const findOneComment = async (commentId) => {
const foundComment = await Comments.findOne({ where: { id: commentId } });

return foundComment;
};

const userLikedOrDiskedComment = async (id, commentId) => {
const userReacted = await LikeAndDislike.findAll({ where: { userId: id,
commentId } });

return userReacted;
};

const findDislikedComment = async (id, commentId) => {
const unlikedArticle = await LikeAndDislike.findAll({ where: { userId: id,
commentId,
[Op.or]: [{ likes: false }, { dislikes: true }] } });

return unlikedArticle;
};

const findLikedComment = async (id, commentId) => {
const unlikedArticle = await LikeAndDislike.findAll({ where: { userId: id,
commentId,
[Op.or]: [{ dislikes: false }, { likes: true }] } });

return unlikedArticle;
};

const findDisliked = async (id, commentId) => {
const disliked = await LikeAndDislike.findAll({ where: { userId: id,
commentId,
dislikes: true } });

return disliked;
};

const ChangeFromDislikeToLike = async (dislikeId) => {
const updateFromDislikeToLike = await LikeAndDislike.update({ dislikes: false, likes: true },
{ where: { id: dislikeId } });

return updateFromDislikeToLike;
};

const ChangeFromLikeToDisLike = async (dislikeId) => {
const updateFromDislikeToLike = await LikeAndDislike.update({ dislikes: true, likes: false },
{ where: { id: dislikeId } });

return updateFromDislikeToLike;
};

const findCommentLikes = async (id, commentId) => {
const liked = await LikeAndDislike.findAll({ where: { userId: id,
commentId,
likes: true } });

return liked;
};

const undoLikeOrDislikeComments = async (commentLike) => {
const unlikeComment = await LikeAndDislike.update({ likes: false, dislikes: false },
{ where: { id: commentLike } });

return unlikeComment;
};

const countCommentLikes = async (commentId) => {
const likes = await LikeAndDislike.count({ where: { commentId,
likes: true } });

return likes;
};

const countCommentDislikes = async (commentId) => {
const dislikes = await LikeAndDislike.count({ where: { commentId,
dislikes: true } });

return dislikes;
};

export {
countCommentDislikes,
countCommentLikes,
undoLikeOrDislikeComments,
findCommentLikes,
ChangeFromLikeToDisLike,
ChangeFromDislikeToLike,
findDisliked,
findLikedComment,
findDislikedComment,
userLikedOrDiskedComment,
findOneComment
};
10 changes: 10 additions & 0 deletions src/controllers/helpers/read_time.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
const converter = seconds => ((seconds > 60) ? `${Math.ceil(seconds / 60)} min` : 'Less than a minute');

const readTime = (body) => {
const numWords = w => w.split(' ').length;
const WPS = 4;
const words = numWords(body);
const sec = words / WPS;
return converter(sec);
};
export default readTime;
1 change: 1 addition & 0 deletions src/controllers/helpers/searchArticlesHelper.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ const searchArticlesHelper = async (tag, keyword, title, user) => {
'description',
'body',
'tagList',
'readtime',
'updatedAt',
'createdAt'
] });
Expand Down
28 changes: 14 additions & 14 deletions src/controllers/likeAndDislike.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,22 +11,22 @@ class LikesAndDislikes {
*
* @param {Object} req
* @param {Object} res
* @returns {Object} Liked article and number of likes
* @returns {Object} Number of likes
*/
static async likeArticle(req, res) {
const findArticleId = req.params.id;
const article = await LikesDislikesHelpers.findOneArticle(findArticleId);
const articleId = req.params.id;
const article = await LikesDislikesHelpers.findOneArticle(articleId);

if (!article) return res.status(404).json({ message: 'Article not found' });

const { id } = req.user;

const liked = await LikesDislikesHelpers.findArticleLikes(id, findArticleId);
const disliked = await LikesDislikesHelpers.findDisliked(id, findArticleId);
const liked = await LikesDislikesHelpers.findArticleLikes(id, articleId);
const disliked = await LikesDislikesHelpers.findDisliked(id, articleId);

const unlikedArticle = await LikesDislikesHelpers.findUnlikedArticle(id, findArticleId);
const unlikedArticle = await LikesDislikesHelpers.findUnlikedArticle(id, articleId);

const userReacted = await LikesDislikesHelpers.userLikedOrDiskedArticle(id, findArticleId);
const userReacted = await LikesDislikesHelpers.userLikedOrDiskedArticle(id, articleId);

if (!userReacted[0]) {
await LikeAndDislike.create({ userId: id,
Expand Down Expand Up @@ -59,22 +59,22 @@ class LikesAndDislikes {
/**
* @param {object} req
* @param {object} res
* @return {object} Disliked article and number of Dislikes
* @return {object} Number of Dislikes
*/
static async dislikeArticle(req, res) {
const findArticleId = req.params.id;
const article = await LikesDislikesHelpers.findOneArticle(findArticleId);
const articleId = req.params.id;
const article = await LikesDislikesHelpers.findOneArticle(articleId);

if (!article) return res.status(404).json({ message: 'Article not found' });

const { id } = req.user;

const dislikedArticle = await LikesDislikesHelpers.findDislikedArticle(id, findArticleId);
const dislikedArticle = await LikesDislikesHelpers.findDislikedArticle(id, articleId);

const disliked = await LikesDislikesHelpers.findDisliked(id, findArticleId);
const liked = await LikesDislikesHelpers.findArticleLikes(id, findArticleId);
const disliked = await LikesDislikesHelpers.findDisliked(id, articleId);
const liked = await LikesDislikesHelpers.findArticleLikes(id, articleId);

const userReacted = await LikesDislikesHelpers.userLikedOrDiskedArticle(id, findArticleId);
const userReacted = await LikesDislikesHelpers.userLikedOrDiskedArticle(id, articleId);

if (!userReacted[0]) {
await LikeAndDislike.create({ userId: id,
Expand Down
Loading

0 comments on commit 44bf265

Please sign in to comment.