138 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| const path = require("path");
 | |
| 
 | |
| const Highscore = require(path.join(__dirname, "/schemas/Highscore"));
 | |
| const Wine = require(path.join(__dirname, "/schemas/Wine"));
 | |
| 
 | |
| // Utils
 | |
| const epochToDateString = date => new Date(parseInt(date)).toDateString();
 | |
| 
 | |
| const sortNewestFirst = lotteries => {
 | |
|   return lotteries.sort((a, b) => (parseInt(a.date) < parseInt(b.date) ? 1 : -1));
 | |
| };
 | |
| 
 | |
| const groupHighscoreByDate = async (highscore = undefined) => {
 | |
|   if (highscore == undefined) highscore = await Highscore.find();
 | |
| 
 | |
|   const highscoreByDate = [];
 | |
| 
 | |
|   highscore.forEach(person => {
 | |
|     person.wins.map(win => {
 | |
|       const epochDate = new Date(win.date).setHours(0, 0, 0, 0);
 | |
|       const winnerObject = {
 | |
|         name: person.name,
 | |
|         color: win.color,
 | |
|         wine: win.wine,
 | |
|         date: epochDate
 | |
|       };
 | |
| 
 | |
|       const existingDateIndex = highscoreByDate.findIndex(el => el.date == epochDate);
 | |
|       if (existingDateIndex > -1) highscoreByDate[existingDateIndex].winners.push(winnerObject);
 | |
|       else
 | |
|         highscoreByDate.push({
 | |
|           date: epochDate,
 | |
|           winners: [winnerObject]
 | |
|         });
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   return sortNewestFirst(highscoreByDate);
 | |
| };
 | |
| 
 | |
| const resolveWineReferences = (highscoreObject, key) => {
 | |
|   const listWithWines = highscoreObject[key];
 | |
| 
 | |
|   return Promise.all(
 | |
|     listWithWines.map(element =>
 | |
|       Wine.findById(element.wine).then(wine => {
 | |
|         element.wine = wine;
 | |
|         return element;
 | |
|       })
 | |
|     )
 | |
|   ).then(resolvedListWithWines => {
 | |
|     highscoreObject[key] = resolvedListWithWines;
 | |
|     return highscoreObject;
 | |
|   });
 | |
| };
 | |
| // end utils
 | |
| 
 | |
| // Routes
 | |
| const all = (req, res) => {
 | |
|   return Highscore.find()
 | |
|     .then(highscore => groupHighscoreByDate(highscore))
 | |
|     .then(lotteries =>
 | |
|       res.send({
 | |
|         message: "Lotteries by date!",
 | |
|         lotteries
 | |
|       })
 | |
|     );
 | |
| };
 | |
| 
 | |
| const latest = (req, res) => {
 | |
|   return groupHighscoreByDate()
 | |
|     .then(lotteries => lotteries.shift()) // first element in list
 | |
|     .then(latestLottery => resolveWineReferences(latestLottery, "winners"))
 | |
|     .then(lottery =>
 | |
|       res.send({
 | |
|         message: "Latest lottery!",
 | |
|         winners: lottery.winners
 | |
|       })
 | |
|     );
 | |
| };
 | |
| 
 | |
| const byEpochDate = (req, res) => {
 | |
|   let { date } = req.params;
 | |
|   date = new Date(new Date(parseInt(date)).setHours(0, 0, 0, 0)).getTime();
 | |
|   const dateString = epochToDateString(date);
 | |
| 
 | |
|   return groupHighscoreByDate()
 | |
|     .then(lotteries => {
 | |
|       const lottery = lotteries.filter(lottery => lottery.date == date);
 | |
|       if (lottery.length > 0) {
 | |
|         return lottery[0];
 | |
|       } else {
 | |
|         return res.status(404).send({
 | |
|           message: `No lottery found for date: ${dateString}`
 | |
|         });
 | |
|       }
 | |
|     })
 | |
|     .then(lottery => resolveWineReferences(lottery, "winners"))
 | |
|     .then(lottery =>
 | |
|       res.send({
 | |
|         message: `Lottery for date: ${dateString}`,
 | |
|         date,
 | |
|         winners: lottery.winners
 | |
|       })
 | |
|     );
 | |
| };
 | |
| 
 | |
| const byName = (req, res) => {
 | |
|   const { name } = req.params;
 | |
|   const regexName = new RegExp(name, "i"); // lowercase regex of the name
 | |
| 
 | |
|   return Highscore.find({ name })
 | |
|     .then(highscore => {
 | |
|       if (highscore.length > 0) {
 | |
|         return highscore[0];
 | |
|       } else {
 | |
|         return res.status(404).send({
 | |
|           message: `Name: ${name} not found in leaderboards.`
 | |
|         });
 | |
|       }
 | |
|     })
 | |
|     .then(highscore => resolveWineReferences(highscore, "wins"))
 | |
|     .then(highscore =>
 | |
|       res.send({
 | |
|         message: `Lottery winnings for name: ${name}.`,
 | |
|         name: highscore.name,
 | |
|         highscore: sortNewestFirst(highscore.wins)
 | |
|       })
 | |
|     );
 | |
| };
 | |
| 
 | |
| module.exports = {
 | |
|   all,
 | |
|   latest,
 | |
|   byEpochDate,
 | |
|   byName
 | |
| };
 |