Skip to content

Commit

Permalink
feat(article): implement article read time
Browse files Browse the repository at this point in the history
Extended the article model to include timeToRead column. Calculate time
to read article then save article.

- Add calculateTimeToRead helper method
- Add pre save hook
- include relevant tests
  • Loading branch information
CEOehis committed Sep 11, 2018
1 parent 6a9c72d commit c419885
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.addColumn(
'Articles',
'timeToRead',
{
type: Sequelize.INTEGER,
},
);
},

down: (queryInterface) => {
return queryInterface.removeColumn(
'Articles',
'timeToRead',
);
}
};
13 changes: 11 additions & 2 deletions server/models/article.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import calculateTimeToRead from '../utils/calculateTimeToRead';

module.exports = (sequelize, DataTypes) => {
const Article = sequelize.define('Article', {
title: {
Expand All @@ -18,8 +20,15 @@ module.exports = (sequelize, DataTypes) => {
type: DataTypes.INTEGER,
allowNull: false,
},
likeDislikeId: DataTypes.INTEGER
}, {});
likeDislikeId: DataTypes.INTEGER,
timeToRead: DataTypes.INTEGER,
}, {
hooks: {
beforeCreate: (articleData) => {
articleData.timeToRead = calculateTimeToRead(articleData);
}
}
});

Article.associate = (models) => {
const { Comment } = models;
Expand Down
1 change: 1 addition & 0 deletions server/tests/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ import './middleware/auth.test';
import './routes/index';
import './utils/token.test';
import './models/index';
import './utils/calculateTimeToRead.test';
13 changes: 13 additions & 0 deletions server/tests/utils/calculateTimeToRead.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { expect } from 'chai';
import calculateTimeToRead from '../../utils/calculateTimeToRead';

describe('calculateTimeToRead', () => {
it('should calculate time to read an article', () => {
const article = {
body: 'Some short article',
};

const timeToRead = calculateTimeToRead(article);
expect(timeToRead).to.be.a('number');
});
});
17 changes: 17 additions & 0 deletions server/utils/calculateTimeToRead.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
/**
* calculates time to read an article
*
* @param {string} article
* @returns {number} timeToRead - time it takes to read an article
*/
const calculateTimeToRead = (article) => {
const averageReadSpeed = 265; // words per minute

// get article word count
const articleWordCount = article.body.split(' ').length;
const timeToRead = articleWordCount / averageReadSpeed;

return Math.ceil(timeToRead);
};

export default calculateTimeToRead;

0 comments on commit c419885

Please sign in to comment.