Billmike/More-Recipes

View on GitHub
server/controllers/voteRecipe.js

Summary

Maintainability
A
0 mins
Test Coverage
import db from '../models/index';
import errorMessage from '../errorHandler/errorMessage';

const Votes = db.Vote;
const Recipes = db.Recipe;

/**
 * Represents the VOte class
 *
 * @class
 */

class Vote {
  /**
  * Vote on a recipe
  *
  *
  * @param { object } req - The request object
  * @param { object } res - The response object
  *
  * @returns { object } Returns the vote of the user
  *
  */
  static voteRecipe(req, res) {
    if (req.params.vote !== 'downvote' && req.params.vote !== 'upvote') {
      return res
        .status(400).json({
          message: 'Parameter passed should be upvote or downvote.'
        });
    }
    Recipes.findById(req.params.recipeId)
      .then((foundRecipe) => {
        if (!foundRecipe) {
          return res
            .status(404)
            .json({
              message: 'This recipe does not exist. How \'bout you create one?'
            });
        }
        if (foundRecipe.owner === req.userId) {
          return res
            .status(403)
            .json({
              message: 'You cannot vote on your own recipe.'
            });
        }
        return Votes.findAll({
          where: {
            recipeId: req.params.recipeId,
          },
        })
          .then((votedRecipes) => {
            if (votedRecipes.length === 0) {
              return Votes.create({
                userId: req.userId,
                recipeId: req.params.recipeId,
                voteType: req.params.vote,
              })
                .then(votedRecipe => res
                  .status(200)
                  .json({
                    message: `${req.params.vote} successful.`,
                    votedRecipe: {
                      recipeId: votedRecipe.recipeId
                    }
                  }));
            }

            const votersArray = [];
            votedRecipes.forEach(elem => votersArray
              .push(elem.dataValues.userId));

            if (votersArray.includes(req.userId)) {
              const checkVoteType = votedRecipes
                .filter(elem => elem.dataValues.userId === req.userId)[0];
              if (checkVoteType.dataValues.voteType === req.params.vote) {
                res
                  .status(403)
                  .json({
                    message: `Sorry! You already ${req.params.vote}d this recipe!`,
                    votedRecipe: {
                      recipeId: checkVoteType.dataValues.recipeId
                    }
                  });
              }
              return Votes.findById(checkVoteType.dataValues.id)
                .then(updateVote => updateVote
                  .update({ voteType: req.params.vote }))
                .then(recipeDel => res
                  .status(200)
                  .json({
                    message: `${req.params.vote} successful.`,
                    votedRecipe: {
                      recipeId: recipeDel.recipeId
                    }
                  }));
            }
            return Votes.create({
              userId: req.userId,
              recipeId: req.params.recipeId,
              voteType: req.params.vote,
            })
              .then(votedRecipe => res
                .status(200)
                .json({
                  message: `${req.params.vote} successful.`,
                  votedRecipe: {
                    recipeId: votedRecipe.recipeId
                  }
                }));
          });
      })
      .catch(() => res
        .status(500)
        .json({
          message: errorMessage
        }));
  }
}

export default Vote;