diff --git a/api/lottery.js b/api/lottery.js index e336ada..eaf6815 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,61 +68,60 @@ 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]; - let highscoreWithResolvedWines = await resolveWineReferences(lottery) - highscoreWithResolvedWines = highscoreWithResolvedWines.reverse() - - if (lottery != null) { - return res.send({ - message: `Lottery for date: ${dateString}`, - lottery: highscoreWithResolvedWines - }) + 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; const regexName = new RegExp(name, "i"); // lowercase regex of the name - return Highscore.find({ "name": { $regex : regexName } }) - .then(async (highscore) => { - highscore = highscore[0] - if (highscore) { - let highscoreWithResolvedWines = await resolveWineReferences(highscore.wins) - highscoreWithResolvedWines = highscoreWithResolvedWines.reverse() - - return res.send({ - message: `Lottery winnings by name: ${name}`, - name: name, - highscore: highscoreWithResolvedWines - }) + 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, + wins: highscore.wins + })) } module.exports = { diff --git a/src/api.js b/src/api.js index 2733701..e747b1f 100644 --- a/src/api.js +++ b/src/api.js @@ -333,9 +333,8 @@ const historyAll = () => { }); } -const getWinnerByName = (name) => { - const encodedName = encodeURIComponent(name) - const url = new URL(`/api/lottery/by-name/${name}`, BASE_URL); +const historyByDate = (date) => { + const url = new URL(`/api/lottery/by-date/${ date }`, BASE_URL); return fetch(url.href).then(resp => { if (resp.ok) { @@ -343,7 +342,7 @@ const getWinnerByName = (name) => { } else { return handleErrors(resp); } - }) + }); } export { @@ -378,5 +377,5 @@ export { getAmIWinner, postWineChosen, historyAll, - getWinnerByName + historyByDate }; diff --git a/src/components/HistoryPage.vue b/src/components/HistoryPage.vue index 372e348..2e60cf2 100644 --- a/src/components/HistoryPage.vue +++ b/src/components/HistoryPage.vue @@ -2,14 +2,15 @@

Historie fra tidligere lotteri

-
- +
+
diff --git a/src/ui/Winners.vue b/src/ui/Winners.vue index 132119d..0fd7d37 100644 --- a/src/ui/Winners.vue +++ b/src/ui/Winners.vue @@ -2,8 +2,10 @@

{{ title ? title : 'Vinnere' }}

-
-
{{ winner.name }}
+
+ +
{{ winner.name }}
+