Refactored lottery controller.
This commit is contained in:
		
							
								
								
									
										123
									
								
								api/lottery.js
									
									
									
									
									
								
							
							
						
						
									
										123
									
								
								api/lottery.js
									
									
									
									
									
								
							@@ -6,53 +6,61 @@ const Wine = require(path.join(__dirname + '/../schemas/Wine'));
 | 
			
		||||
// Utils
 | 
			
		||||
const epochToDateString = date => new Date(parseInt(date)).toDateString();
 | 
			
		||||
 | 
			
		||||
const getHighscoreByDates = highscore => {
 | 
			
		||||
  let groupedLotteries = {}
 | 
			
		||||
const sortNewestFirst = (lotteries) => {
 | 
			
		||||
  return lotteries.sort((a, b) => parseInt(a.date) < parseInt(b.date) ? 1 : -1)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
  highscore.forEach(user => {
 | 
			
		||||
    user.wins.map(win => {
 | 
			
		||||
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 obj = {
 | 
			
		||||
        name: user.name,
 | 
			
		||||
      const winnerObject = {
 | 
			
		||||
        name: person.name,
 | 
			
		||||
        color: win.color,
 | 
			
		||||
        wine: win.wine,
 | 
			
		||||
        date: epochDate
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      groupedLotteries[epochDate] ?
 | 
			
		||||
        groupedLotteries[epochDate].push(obj) : groupedLotteries[epochDate] = [obj];
 | 
			
		||||
      const existingDateIndex = highscoreByDate.findIndex(el => el.date == epochDate)
 | 
			
		||||
      if (existingDateIndex > -1)
 | 
			
		||||
        highscoreByDate[existingDateIndex].winners.push(winnerObject);
 | 
			
		||||
      else
 | 
			
		||||
        highscoreByDate.push({
 | 
			
		||||
          date: epochDate,
 | 
			
		||||
          winners: [winnerObject]
 | 
			
		||||
        })
 | 
			
		||||
    })
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  return groupedLotteries
 | 
			
		||||
  return sortNewestFirst(highscoreByDate);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const groupedHighscoreToSortedList = groupedLotteries => {
 | 
			
		||||
  return Object.keys(groupedLotteries).map(key => {
 | 
			
		||||
    const winners = groupedLotteries[key];
 | 
			
		||||
    return {
 | 
			
		||||
      date: parseInt(key),
 | 
			
		||||
      dateString: epochToDateString(key),
 | 
			
		||||
      winners
 | 
			
		||||
    }
 | 
			
		||||
  }).sort((a,b) => parseInt(a.date) > parseInt(b.date) ? 1 : -1) 
 | 
			
		||||
}
 | 
			
		||||
const resolveWineReferences = (highscoreObject, key) => {
 | 
			
		||||
  const listWithWines = highscoreObject[key]
 | 
			
		||||
 | 
			
		||||
const resolveWineReferences = listWithWines => {
 | 
			
		||||
  return Promise.all(listWithWines.map(element =>
 | 
			
		||||
    Wine.findById(element.wine)
 | 
			
		||||
      .then(wine => {
 | 
			
		||||
        element.wine = wine
 | 
			
		||||
        return 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 => getHighscoreByDates(highscore))
 | 
			
		||||
    .then(groupedLotteries => groupedHighscoreToSortedList(groupedLotteries))
 | 
			
		||||
    .then(highscore => groupHighscoreByDate(highscore))
 | 
			
		||||
    .then(lotteries => res.send({
 | 
			
		||||
      message: "Lotteries by date!",
 | 
			
		||||
      lotteries
 | 
			
		||||
@@ -60,56 +68,59 @@ const all = (req, res) => {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const latest = (req, res) => {
 | 
			
		||||
  return Highscore.find()
 | 
			
		||||
    .then(highscore => getHighscoreByDates(highscore))
 | 
			
		||||
    .then(groupedLotteries => groupedHighscoreToSortedList(groupedLotteries))
 | 
			
		||||
    .then(lotteries => res.send({
 | 
			
		||||
      message: "Latest lottery!",
 | 
			
		||||
      lottery: lotteries.slice(-1).pop()
 | 
			
		||||
    }))
 | 
			
		||||
  return groupHighscoreByDate()
 | 
			
		||||
    .then(lotteries => lotteries.shift())
 | 
			
		||||
    .then(latestLottery => resolveWineReferences(latestLottery, "winners"))
 | 
			
		||||
    .then(lottery => res.send({
 | 
			
		||||
        message: "Latest lottery!",
 | 
			
		||||
        winners: lottery.winners
 | 
			
		||||
      })
 | 
			
		||||
    )
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const byEpochDate = (req, res) => {
 | 
			
		||||
  const { date } = req.params;
 | 
			
		||||
  let { date } = req.params;
 | 
			
		||||
  date = new Date(new Date(parseInt(date)).setHours(0,0,0,0)).getTime()
 | 
			
		||||
  const dateString = epochToDateString(date);
 | 
			
		||||
 | 
			
		||||
  return Highscore.find()
 | 
			
		||||
    .then(highscore => getHighscoreByDates(highscore))
 | 
			
		||||
    .then(async (lotteries) => {
 | 
			
		||||
      const lottery = lotteries[date];
 | 
			
		||||
 | 
			
		||||
      if (lottery != null) {
 | 
			
		||||
        return res.send({
 | 
			
		||||
          message: `Lottery for date: ${dateString}`,
 | 
			
		||||
          lottery: await resolveWineReferences(lottery)
 | 
			
		||||
        })
 | 
			
		||||
  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}`
 | 
			
		||||
          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;
 | 
			
		||||
 | 
			
		||||
  return Highscore.find({ name })
 | 
			
		||||
    .then(async (highscore) => {
 | 
			
		||||
      highscore = highscore[0]
 | 
			
		||||
      if (highscore) {
 | 
			
		||||
        const highscoreWithResolvedWines = await resolveWineReferences(highscore.wins)
 | 
			
		||||
 | 
			
		||||
        return res.send({
 | 
			
		||||
          message: `Lottery winnings by name: ${name}`,
 | 
			
		||||
          highscore: highscoreWithResolvedWines
 | 
			
		||||
         })
 | 
			
		||||
    .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,
 | 
			
		||||
      wins: highscore.wins
 | 
			
		||||
    }))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user