126 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			126 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
const path = require('path');
 | 
						|
 | 
						|
const mongoose = require('mongoose');
 | 
						|
mongoose.connect('mongodb://localhost:27017/vinlottis', {
 | 
						|
  useNewUrlParser: true
 | 
						|
})
 | 
						|
 | 
						|
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 getHighscoreByDates = highscore => {
 | 
						|
  let groupedLotteries = {}
 | 
						|
 | 
						|
  highscore.forEach(user => {
 | 
						|
    user.wins.map(win => {
 | 
						|
      const epochDate = new Date(win.date).setHours(0,0,0,0);
 | 
						|
      const obj = {
 | 
						|
        name: user.name,
 | 
						|
        color: win.color,
 | 
						|
        wine: win.wine,
 | 
						|
        date: epochDate
 | 
						|
      }
 | 
						|
 | 
						|
      groupedLotteries[epochDate] ?
 | 
						|
        groupedLotteries[epochDate].push(obj) : groupedLotteries[epochDate] = [obj];
 | 
						|
    })
 | 
						|
  })
 | 
						|
 | 
						|
  return groupedLotteries
 | 
						|
}
 | 
						|
 | 
						|
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 = listWithWines => {
 | 
						|
  return Promise.all(listWithWines.map(element =>
 | 
						|
    Wine.findById(element.wine)
 | 
						|
      .then(wine => {
 | 
						|
        element.wine = wine
 | 
						|
        return element
 | 
						|
      })
 | 
						|
  ))
 | 
						|
}
 | 
						|
 | 
						|
// Routes
 | 
						|
const all = (req, res) => {
 | 
						|
  return Highscore.find()
 | 
						|
    .then(highscore => getHighscoreByDates(highscore))
 | 
						|
    .then(groupedLotteries => groupedHighscoreToSortedList(groupedLotteries))
 | 
						|
    .then(lotteries => res.send({
 | 
						|
      message: "Lotteries by date!",
 | 
						|
      lotteries
 | 
						|
    }))
 | 
						|
}
 | 
						|
 | 
						|
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()
 | 
						|
    }))
 | 
						|
}
 | 
						|
 | 
						|
const byEpochDate = (req, res) => {
 | 
						|
  const { date } = req.params;
 | 
						|
  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)
 | 
						|
        })
 | 
						|
      } else {
 | 
						|
        return res.status(404).send({
 | 
						|
          message: `No lottery found for date: ${dateString}`
 | 
						|
        })
 | 
						|
      }
 | 
						|
    })
 | 
						|
}
 | 
						|
 | 
						|
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
 | 
						|
         })
 | 
						|
      } else {
 | 
						|
        return res.status(404).send({
 | 
						|
          message: `Name: ${ name } not found in leaderboards.`
 | 
						|
        })
 | 
						|
      }
 | 
						|
    })
 | 
						|
}
 | 
						|
 | 
						|
module.exports = {
 | 
						|
  all,
 | 
						|
  latest,
 | 
						|
  byEpochDate,
 | 
						|
  byName
 | 
						|
};
 |