196 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			196 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
const path = require("path");
 | 
						|
const winnerRepository = require(path.join(__dirname, "../winner"));
 | 
						|
const { WinnerNotFound } = require(path.join(__dirname, "../vinlottisErrors"));
 | 
						|
const prizeDistributionRepository = require(path.join(__dirname, "../prizeDistribution"));
 | 
						|
 | 
						|
// should not be used, is done through POST /lottery/prize-distribution/prize/:id - claimPrize.
 | 
						|
const addWinners = (req, res) => {
 | 
						|
  const { winners } = req.body;
 | 
						|
 | 
						|
  if (!(winners instanceof Array)) {
 | 
						|
    return res.status(400).send({
 | 
						|
      message: "Winners must be array.",
 | 
						|
      success: false
 | 
						|
    });
 | 
						|
  }
 | 
						|
 | 
						|
  const requiredAttributes = ["name", "color", "wine"];
 | 
						|
  const validColors = ["red", "blue", "green", "yellow"];
 | 
						|
  const validateAllWinners = winners =>
 | 
						|
    winners.map(winner => {
 | 
						|
      return Promise.all(
 | 
						|
        requiredAttributes.map(attr => {
 | 
						|
          if (typeof winner[attr] === "undefined") {
 | 
						|
            return Promise.reject({
 | 
						|
              message: `Incorrect or missing attribute: ${attr}.`,
 | 
						|
              statusCode: 400
 | 
						|
            });
 | 
						|
          }
 | 
						|
 | 
						|
          if (!validColors.includes(winner.color)) {
 | 
						|
            return Promise.reject({
 | 
						|
              message: `Missing or incorrect color value, must have one of values: ${validColors.join(", ")}.`,
 | 
						|
              statusCode: 400
 | 
						|
            });
 | 
						|
          }
 | 
						|
 | 
						|
          return Promise.resolve();
 | 
						|
        })
 | 
						|
      ).then(_ => Promise.resolve(winner));
 | 
						|
    });
 | 
						|
 | 
						|
  return Promise.all(validateAllWinners(winners))
 | 
						|
    .then(winners =>
 | 
						|
      winners.map(winner => {
 | 
						|
        return prizeDistributionRepository.claimPrize(winner, winner.wine);
 | 
						|
      })
 | 
						|
    )
 | 
						|
    .then(winners =>
 | 
						|
      res.send({
 | 
						|
        winners: winners,
 | 
						|
        message: `Successfully added winners to lottery.`,
 | 
						|
        success: true
 | 
						|
      })
 | 
						|
    )
 | 
						|
    .catch(error => {
 | 
						|
      const { statusCode, message } = error;
 | 
						|
 | 
						|
      return res.status(statusCode || 500).send({
 | 
						|
        message: message || "Unexpected error occured adding winners.",
 | 
						|
        success: false
 | 
						|
      });
 | 
						|
    });
 | 
						|
};
 | 
						|
 | 
						|
const allWinners = (req, res) => {
 | 
						|
  const isAdmin = req.isAuthenticated();
 | 
						|
 | 
						|
  return winnerRepository
 | 
						|
    .allWinners(isAdmin)
 | 
						|
    .then(winners =>
 | 
						|
      res.send({
 | 
						|
        winners: winners,
 | 
						|
        success: true
 | 
						|
      })
 | 
						|
    )
 | 
						|
    .catch(error => {
 | 
						|
      const { statusCode, message } = error;
 | 
						|
 | 
						|
      return res.status(statusCode || 500).send({
 | 
						|
        success: false,
 | 
						|
        message: message || "Unable to fetch lottery winners."
 | 
						|
      });
 | 
						|
    });
 | 
						|
};
 | 
						|
 | 
						|
const winnerById = (req, res) => {
 | 
						|
  const { id } = req.params;
 | 
						|
  const isAdmin = req.isAuthenticated();
 | 
						|
 | 
						|
  return winnerRepository
 | 
						|
    .winnerById(id, isAdmin)
 | 
						|
    .then(winner =>
 | 
						|
      res.send({
 | 
						|
        winner,
 | 
						|
        success: true
 | 
						|
      })
 | 
						|
    )
 | 
						|
    .catch(error => {
 | 
						|
      const { statusCode, message } = error;
 | 
						|
 | 
						|
      return res.status(statusCode || 500).send({
 | 
						|
        message: message || "Unexpected error occured, unable to fetch winner by id.",
 | 
						|
        success: false
 | 
						|
      });
 | 
						|
    });
 | 
						|
};
 | 
						|
 | 
						|
const updateWinnerById = (req, res) => {
 | 
						|
  const { id } = req.params;
 | 
						|
  const { winner } = req.body;
 | 
						|
 | 
						|
  if (id == null || id == "undefined") {
 | 
						|
    return res.status(400).send({
 | 
						|
      message: "Unable to update without id.",
 | 
						|
      success: false
 | 
						|
    });
 | 
						|
  }
 | 
						|
 | 
						|
  return winnerRepository
 | 
						|
    .updateWinnerById(id, winner)
 | 
						|
    .then(winner =>
 | 
						|
      res.send({
 | 
						|
        winner,
 | 
						|
        message: `Updated winner: ${winner.name}`,
 | 
						|
        success: true
 | 
						|
      })
 | 
						|
    )
 | 
						|
    .catch(error => {
 | 
						|
      const { statusCode, message } = error;
 | 
						|
 | 
						|
      return res.status(statusCode || 500).send({
 | 
						|
        message: message || "Unexpected error occured while updating winner by id.",
 | 
						|
        success: false
 | 
						|
      });
 | 
						|
    });
 | 
						|
};
 | 
						|
 | 
						|
const deleteWinnerById = (req, res) => {
 | 
						|
  const isAdmin = req.isAuthenticated();
 | 
						|
  const { id } = req.params;
 | 
						|
 | 
						|
  return winnerRepository
 | 
						|
    .deleteWinnerById(id, isAdmin)
 | 
						|
    .then(removedWinner => {
 | 
						|
      var io = req.app.get("socketio");
 | 
						|
      io.emit("refresh_data", {});
 | 
						|
      return removedWinner;
 | 
						|
    })
 | 
						|
    .then(winner =>
 | 
						|
      res.send({
 | 
						|
        message: `Removed winner: ${winner.name}`,
 | 
						|
        success: true
 | 
						|
      })
 | 
						|
    )
 | 
						|
    .catch(error => {
 | 
						|
      const { statusCode, message } = error;
 | 
						|
 | 
						|
      return res.status(statusCode || 500).send({
 | 
						|
        message: message || "Unexpected error occured while deleteing wine by id.",
 | 
						|
        success: false
 | 
						|
      });
 | 
						|
    });
 | 
						|
};
 | 
						|
 | 
						|
const deleteWinners = (req, res) => {
 | 
						|
  return winnerRepository
 | 
						|
    .deleteWinners()
 | 
						|
    .then(_ => {
 | 
						|
      var io = req.app.get("socketio");
 | 
						|
      io.emit("refresh_data", {});
 | 
						|
    })
 | 
						|
    .then(_ =>
 | 
						|
      res.send({
 | 
						|
        message: "Removed all winners.",
 | 
						|
        success: true
 | 
						|
      })
 | 
						|
    )
 | 
						|
    .catch(error => {
 | 
						|
      const { statusCode, message } = error;
 | 
						|
 | 
						|
      return res.status(statusCode || 500).send({
 | 
						|
        message: message || "Unexpected error occured while deleting wines",
 | 
						|
        success: false
 | 
						|
      });
 | 
						|
    });
 | 
						|
};
 | 
						|
 | 
						|
module.exports = {
 | 
						|
  addWinners,
 | 
						|
  allWinners,
 | 
						|
  winnerById,
 | 
						|
  updateWinnerById,
 | 
						|
  deleteWinnerById,
 | 
						|
  deleteWinners
 | 
						|
};
 |