Refactored lottery controller.

This commit is contained in:
2020-10-11 15:26:11 +02:00
committed by KevinMidboe
parent 20be3cc5ca
commit c0f26f9061

View File

@@ -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 = {