From 6e277774d6749b49cbe366795190eed84d68d46c Mon Sep 17 00:00:00 2001 From: sterlingrules Date: Thu, 12 Mar 2020 15:22:52 -0400 Subject: [PATCH 1/2] fix(): disappearing likes, ssl redirect --- server/controllers/like.controller.js | 26 ++++++++++------ server/controllers/vote.controller.js | 1 + server/helpers/post.helper.js | 10 +++--- server/models/post.model.js | 1 - server/routes/post.route.js | 45 +++++++++++++-------------- server/tests/post.test.js | 12 +++---- 6 files changed, 50 insertions(+), 45 deletions(-) diff --git a/server/controllers/like.controller.js b/server/controllers/like.controller.js index e825b63c..1dbc6774 100644 --- a/server/controllers/like.controller.js +++ b/server/controllers/like.controller.js @@ -1,5 +1,5 @@ import algoliasearch from 'algoliasearch'; -import Like from '../models/like.model'; +import Vote from '../models/vote.model'; import Post from '../models/post.model'; function syncAlgolia(query) { @@ -50,13 +50,19 @@ function syncAlgolia(query) { async function likePost(req, res) { const { postId } = req.params; const { _id: userId } = req.user; - const query = { postId, userId }; - const like = new Like(query); - const likeActive = await Like.findOne(query); - const likeCount = likeActive ? -1 : 1; + const query = { + postId, + userId, + direction: 'upvote', + active: true, + }; + + const like = new Vote(query); + const likeActive = await Vote.findOne(query); + const score = likeActive ? -1 : 1; if (likeActive) { - await Like.deleteOne({ _id: likeActive._id }); + await Vote.deleteOne({ _id: likeActive._id }); } else { await like.save(); } @@ -64,7 +70,7 @@ async function likePost(req, res) { Post .findOneAndUpdate( { _id: postId }, - { $inc: { likeCount } }, + { $inc: { score } }, { new: true }, ).exec(async (err, reply) => { if (err) { @@ -72,13 +78,13 @@ async function likePost(req, res) { } syncAlgolia({ - likeCount: reply.likeCount, + score: reply.score, objectID: reply.id, }); return res.json({ - likeCount: reply.likeCount, - likeActive: !(likeActive), + score: reply.score, + upvoted: !(likeActive), }); }); } diff --git a/server/controllers/vote.controller.js b/server/controllers/vote.controller.js index 6a050d57..3e89ade9 100644 --- a/server/controllers/vote.controller.js +++ b/server/controllers/vote.controller.js @@ -174,6 +174,7 @@ function upvote(req, res, next) { entity.score -= incrementValue; req.unliked = true; } + promise = Bluebird.all([vote.save(), entity.save()]); } else { const newvote = new Vote(); diff --git a/server/helpers/post.helper.js b/server/helpers/post.helper.js index 38a63d13..40403239 100644 --- a/server/helpers/post.helper.js +++ b/server/helpers/post.helper.js @@ -1,5 +1,5 @@ import algoliasearch from 'algoliasearch'; -import Like from '../models/like.model'; +import Vote from '../models/vote.model'; import Favorite from '../models/favorite.model'; import { getAdFreeMp3 } from '../helpers/mp3.helper'; import { getPrivateRss } from '../helpers/rss.helper'; @@ -46,9 +46,10 @@ async function addPostData(post, fullUser) { const query = { userId: fullUser ? fullUser._id : null, postId: post._id, + active: true, }; - const likeActive = await Like + const upvoted = await Vote .findOne(query) .exec(l => Promise.resolve(l)); @@ -56,10 +57,9 @@ async function addPostData(post, fullUser) { .findOne(query) .exec(l => Promise.resolve(l)); - post.likeCount = post.likeCount || 0 // eslint-disable-line + post.upvoted = !!(upvoted) // eslint-disable-line post.totalFavorites = post.totalFavorites || 0 // eslint-disable-line - post.likeActive = !!(likeActive) // eslint-disable-line - post.bookmarkActive = !!(bookmark && bookmark.active) // eslint-disable-line + post.bookmarked = !!(bookmark && bookmark.active) // eslint-disable-line post.rss = '/rss/public/all' // eslint-disable-line if (fullUser && fullUser.subscription && fullUser.subscription.active) { diff --git a/server/models/post.model.js b/server/models/post.model.js index 13461aaa..70b4128b 100644 --- a/server/models/post.model.js +++ b/server/models/post.model.js @@ -132,7 +132,6 @@ PostSchema.statics = { */ standardSelectForFind: [ 'content', - 'likeCount', 'totalFavorites', 'title', 'date', diff --git a/server/routes/post.route.js b/server/routes/post.route.js index 9a9b7dfc..0a9e6c6b 100644 --- a/server/routes/post.route.js +++ b/server/routes/post.route.js @@ -43,30 +43,31 @@ router.route('/search') router.route('/recommendations') .get( - expressJwt({ secret: config.jwtSecret }) - , loadFullUser - , postCtrl.recommendations + expressJwt({ secret: config.jwtSecret }), + loadFullUser, + postCtrl.recommendations, ); router.route('/:postId') .get( - expressJwt({ secret: config.jwtSecret, credentialsRequired: false }) - , loadFullUser - , postCtrl.get + expressJwt({ secret: config.jwtSecret, credentialsRequired: false }), + loadFullUser, + postCtrl.get, ); + // Get related links associated with postId router.route('/:postId/related-links') .get( - expressJwt({ secret: config.jwtSecret, credentialsRequired: false }) - , relatedLinkCtrl.list + expressJwt({ secret: config.jwtSecret, credentialsRequired: false }), + relatedLinkCtrl.list, ); // Add a related-link to postId: router.route('/:postId/related-link') .post( - expressJwt({ secret: config.jwtSecret }) - , validate(paramValidation.relatedLinkCreate) - , relatedLinkCtrl.create + expressJwt({ secret: config.jwtSecret }), + validate(paramValidation.relatedLinkCreate), + relatedLinkCtrl.create, ); router.route('/:postId/like') @@ -77,22 +78,20 @@ router.route('/:postId/like') router.route('/:postId/upvote') .post( - expressJwt({ secret: config.jwtSecret }) - , transferField({ source: 'post', target: 'entity' }) - , voteCtrl.findVote - , voteCtrl.upvote // normal upvoting via vote model - , postCtrl.upvote // special-case: uses racoon upvoting just for posts. - , voteCtrl.finish + expressJwt({ secret: config.jwtSecret }), + transferField({ source: 'post', target: 'entity' }), + voteCtrl.findVote, + voteCtrl.upvote, // normal upvoting via vote model + voteCtrl.finish, ); router.route('/:postId/downvote') .post( - expressJwt({ secret: config.jwtSecret }) - , transferField({ source: 'post', target: 'entity' }) - , voteCtrl.findVote - , voteCtrl.downvote - , postCtrl.downvote - , voteCtrl.finish + expressJwt({ secret: config.jwtSecret }), + transferField({ source: 'post', target: 'entity' }), + voteCtrl.findVote, + voteCtrl.downvote, + voteCtrl.finish, ); router.route('/:postId/bookmark') diff --git a/server/tests/post.test.js b/server/tests/post.test.js index 2a42fe99..826416c6 100644 --- a/server/tests/post.test.js +++ b/server/tests/post.test.js @@ -170,9 +170,9 @@ describe('## Post APIs', () => { .expect(httpStatus.OK) .then((res) => { const like = res.body; - expect(like).to.have.property('likeCount').that.is.a('number'); - expect(like).to.have.property('likeActive').that.is.a('boolean'); - expect(like.likeActive).to.be.true; //eslint-disable-line + expect(like).to.have.property('score').that.is.a('number'); + expect(like).to.have.property('upvoted').that.is.a('boolean'); + expect(like.upvoted).to.be.true; //eslint-disable-line done(); }) .catch(done); @@ -185,9 +185,9 @@ describe('## Post APIs', () => { .expect(httpStatus.OK) .then((res) => { const like = res.body; - expect(like).to.have.property('likeCount').that.is.a('number'); - expect(like).to.have.property('likeActive').that.is.a('boolean'); - expect(like.likeActive).to.be.false; //eslint-disable-line + expect(like).to.have.property('score').that.is.a('number'); + expect(like).to.have.property('upvoted').that.is.a('boolean'); + expect(like.upvoted).to.be.false; //eslint-disable-line done(); }) .catch(done); From eda0fd49ab4076596ceed383cc961e8e6fb55143 Mon Sep 17 00:00:00 2001 From: sterlingrules Date: Thu, 12 Mar 2020 15:33:42 -0400 Subject: [PATCH 2/2] chore(): code cleanup --- server/controllers/vote.controller.js | 1 - 1 file changed, 1 deletion(-) diff --git a/server/controllers/vote.controller.js b/server/controllers/vote.controller.js index 3e89ade9..6a050d57 100644 --- a/server/controllers/vote.controller.js +++ b/server/controllers/vote.controller.js @@ -174,7 +174,6 @@ function upvote(req, res, next) { entity.score -= incrementValue; req.unliked = true; } - promise = Bluebird.all([vote.save(), entity.save()]); } else { const newvote = new Vote();