From 90eb557f0b14f7477c050011a92223d3b6a6aaf0 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Sun, 11 Oct 2020 14:04:08 +0200 Subject: [PATCH 1/5] New api route for history by date. --- src/api.js | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/api.js b/src/api.js index 05145b9..e747b1f 100644 --- a/src/api.js +++ b/src/api.js @@ -333,6 +333,18 @@ const historyAll = () => { }); } +const historyByDate = (date) => { + const url = new URL(`/api/lottery/by-date/${ date }`, BASE_URL); + + return fetch(url.href).then(resp => { + if (resp.ok) { + return resp.json(); + } else { + return handleErrors(resp); + } + }); +} + export { statistics, colorStatistics, @@ -364,5 +376,6 @@ export { finishedDraw, getAmIWinner, postWineChosen, - historyAll + historyAll, + historyByDate }; From 20be3cc5cac7cbeea591693886509113a22ca3f7 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Sun, 11 Oct 2020 14:04:42 +0200 Subject: [PATCH 2/5] If date in params, fetch only that date. - Now handles only fetching date by epoch from url params. - Displays date w/ helper function humanReadableDate. --- src/components/HistoryPage.vue | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/components/HistoryPage.vue b/src/components/HistoryPage.vue index 372e348..c1951b4 100644 --- a/src/components/HistoryPage.vue +++ b/src/components/HistoryPage.vue @@ -2,14 +2,15 @@

Historie fra tidligere lotteri

-
- +
+
From c0f26f9061005f3c82ffa4b226a4f0190352952d Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Sun, 11 Oct 2020 15:26:11 +0200 Subject: [PATCH 3/5] Refactored lottery controller. --- api/lottery.js | 123 +++++++++++++++++++++++++++---------------------- 1 file changed, 67 insertions(+), 56 deletions(-) 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 = { From 03c13d9558a19eb65f5547d711db23f7d77eaade Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Sun, 11 Oct 2020 15:27:00 +0200 Subject: [PATCH 4/5] Linting. --- src/components/HistoryPage.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/HistoryPage.vue b/src/components/HistoryPage.vue index c1951b4..2e60cf2 100644 --- a/src/components/HistoryPage.vue +++ b/src/components/HistoryPage.vue @@ -3,7 +3,7 @@

Historie fra tidligere lotteri

- +
From 823bbb743769d07fb04ae3c43b8216b6a94d8ba6 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Sun, 11 Oct 2020 15:42:45 +0200 Subject: [PATCH 5/5] Winners clickable to route to highscore/{name}. --- src/ui/Winners.vue | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/ui/Winners.vue b/src/ui/Winners.vue index fc76fd6..9258039 100644 --- a/src/ui/Winners.vue +++ b/src/ui/Winners.vue @@ -2,8 +2,10 @@

{{ title ? title : 'Vinnere' }}

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