diff --git a/api/lottery.js b/api/lottery.js index 2a0145f..3ed217a 100644 --- a/api/lottery.js +++ b/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 = {