193 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			193 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| const path = require("path");
 | |
| const lotteryRepository = require(path.join(__dirname, "../lottery"));
 | |
| 
 | |
| const drawWinner = (req, res) => {
 | |
|   return lotteryRepository
 | |
|     .drawWinner()
 | |
|     .then(({ winner, color, winners }) => {
 | |
|       var io = req.app.get("socketio");
 | |
|       io.emit("winner", {
 | |
|         color: color,
 | |
|         name: winner.name,
 | |
|         winner_count: winners.length + 1
 | |
|       });
 | |
| 
 | |
|       return { winner, color, winners };
 | |
|     })
 | |
|     .then(({ winner, color, winners }) =>
 | |
|       res.send({
 | |
|         color: color,
 | |
|         winner: winner,
 | |
|         success: true
 | |
|       })
 | |
|     )
 | |
|     .catch(error => {
 | |
|       const { statusCode, message } = error;
 | |
| 
 | |
|       return res.status(statusCode || 500).send({
 | |
|         message: message || "Unexpected error occured while drawing winner.",
 | |
|         success: false
 | |
|       });
 | |
|     });
 | |
| };
 | |
| 
 | |
| const archiveLottery = (req, res) => {
 | |
|   const { lottery } = req.body;
 | |
|   if (lottery == undefined || !lottery instanceof Object) {
 | |
|     return res.status(400).send({
 | |
|       message: "Missing lottery object.",
 | |
|       success: false
 | |
|     });
 | |
|   }
 | |
| 
 | |
|   let { stolen, date, raffles, wines } = lottery;
 | |
|   stolen = stolen !== undefined ? stolen : 0; // default = 0
 | |
| 
 | |
|   const validDateFormat = new RegExp("d{4}-d{2}-d{2}");
 | |
|   if (date != undefined && (!validDateFormat.test(date) || isNaN(date))) {
 | |
|     return res.status(400).send({
 | |
|       message: "Date must be defined as 'yyyy-mm-dd'.",
 | |
|       success: false
 | |
|     });
 | |
|   } else if (date != undefined) {
 | |
|     date = Date.parse(date, "yyyy-MM-dd");
 | |
|   } else {
 | |
|     date = new Date();
 | |
|   }
 | |
| 
 | |
|   return verifyLotteryPayload(raffles, stolen, wines)
 | |
|     .then(_ => lotteryRepository.archive(date, raffles, stolen, wines))
 | |
|     .then(_ =>
 | |
|       res.send({
 | |
|         message: "Successfully archive lottery",
 | |
|         success: true
 | |
|       })
 | |
|     )
 | |
|     .catch(error => {
 | |
|       const { statusCode, message } = error;
 | |
| 
 | |
|       return res.status(statusCode || 500).send({
 | |
|         message: message || "Unexpected error occured while submitting lottery.",
 | |
|         success: false
 | |
|       });
 | |
|     });
 | |
| };
 | |
| 
 | |
| const lotteryByDate = (req, res) => {
 | |
|   const { epoch } = req.params;
 | |
| 
 | |
|   if (!/^\d+$/.test(epoch)) {
 | |
|     return res.status(400).send({
 | |
|       message: "Last parameter must be epoch (in seconds).",
 | |
|       success: false
 | |
|     });
 | |
|   }
 | |
|   const date = new Date(Number(epoch) * 1000);
 | |
| 
 | |
|   return lotteryRepository
 | |
|     .lotteryByDate(date)
 | |
|     .then(lottery =>
 | |
|       res.send({
 | |
|         lottery,
 | |
|         message: `Lottery for date: ${dateToDateString(date)}/${epoch}.`,
 | |
|         success: true
 | |
|       })
 | |
|     )
 | |
|     .catch(error => {
 | |
|       const { statusCode, message } = error;
 | |
| 
 | |
|       return res.status(statusCode || 500).send({
 | |
|         message: message || "Unexpected error occured while fetching lottery by date.",
 | |
|         success: false
 | |
|       });
 | |
|     });
 | |
| };
 | |
| 
 | |
| const sortOptions = ["desc", "asc"];
 | |
| const allLotteries = (req, res) => {
 | |
|   let { includeWinners, year, sort } = req.query;
 | |
| 
 | |
|   if (sort !== undefined && !sortOptions.includes(sort)) {
 | |
|     return res.status(400).send({
 | |
|       message: `Sort option must be: '${sortOptions.join(", ")}'`,
 | |
|       success: false
 | |
|     });
 | |
|   } else if (sort === undefined) {
 | |
|     sort = "asc";
 | |
|   }
 | |
| 
 | |
|   let allLotteriesFunction = lotteryRepository.allLotteries;
 | |
|   if (includeWinners === "true") {
 | |
|     allLotteriesFunction = lotteryRepository.allLotteriesIncludingWinners;
 | |
|   }
 | |
| 
 | |
|   return allLotteriesFunction(sort, year)
 | |
|     .then(lotteries =>
 | |
|       res.send({
 | |
|         lotteries,
 | |
|         message: "All lotteries.",
 | |
|         success: true
 | |
|       })
 | |
|     )
 | |
|     .catch(error => {
 | |
|       const { statusCode, message } = error;
 | |
| 
 | |
|       return res.status(statusCode || 500).send({
 | |
|         message: message || "Unexpected error occured while fetching all lotteries.",
 | |
|         success: false
 | |
|       });
 | |
|     });
 | |
| };
 | |
| 
 | |
| function verifyLotteryPayload(raffles, stolen, wines) {
 | |
|   return new Promise((resolve, reject) => {
 | |
|     if (raffles == undefined || !raffles instanceof Array) {
 | |
|       reject({
 | |
|         message: "Raffles must be array.",
 | |
|         status: 400
 | |
|       });
 | |
|     }
 | |
| 
 | |
|     const requiredColors = [raffles["red"], raffles["blue"], raffles["green"], raffles["yellow"]];
 | |
|     const correctColorsTypes = requiredColors.filter(color => typeof color === "number");
 | |
|     if (requiredColors.length !== correctColorsTypes.length) {
 | |
|       reject({
 | |
|         message:
 | |
|           "Incorrect or missing raffle colors, required type Number for keys: 'blue', 'red', 'green' & 'yellow'.",
 | |
|         status: 400
 | |
|       });
 | |
|     }
 | |
| 
 | |
|     if (stolen == undefined || (isNaN(stolen) && stolen >= 0)) {
 | |
|       reject({
 | |
|         message: "Number of stolen raffles must be positive integer or 0.",
 | |
|         status: 400
 | |
|       });
 | |
|     }
 | |
| 
 | |
|     if (wines == undefined || !wines instanceof Array) {
 | |
|       reject({
 | |
|         message: "Wines must be array.",
 | |
|         status: 400
 | |
|       });
 | |
|     }
 | |
| 
 | |
|     resolve();
 | |
|   });
 | |
| }
 | |
| 
 | |
| function dateToDateString(date) {
 | |
|   const ye = new Intl.DateTimeFormat("en", { year: "numeric" }).format(date);
 | |
|   const mo = new Intl.DateTimeFormat("en", { month: "2-digit" }).format(date);
 | |
|   const da = new Intl.DateTimeFormat("en", { day: "2-digit" }).format(date);
 | |
| 
 | |
|   return `${ye}-${mo}-${da}`;
 | |
| }
 | |
| 
 | |
| module.exports = {
 | |
|   drawWinner,
 | |
|   archiveLottery,
 | |
|   lotteryByDate,
 | |
|   allLotteries
 | |
| };
 |