From e07e6ae09aa60e29c71d930071111d5fa2c331e0 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Sun, 24 Jan 2021 10:05:00 +0100 Subject: [PATCH] Winner controller, winners by date, color or name. Winner controller replaces a lot of what happens in retrieve did for aggregating when and what had been won. Now this is more clearly defined in winner.js. Also leverage mongo's query more than sorting and aggregating data like previous implementation where a lot happened in js. --- api/controllers/winnerController.js | 39 +++++++++++++++--- api/winner.js | 61 +++++++++++++++++++++++++---- 2 files changed, 88 insertions(+), 12 deletions(-) diff --git a/api/controllers/winnerController.js b/api/controllers/winnerController.js index b2d74d8..a6c6af2 100644 --- a/api/controllers/winnerController.js +++ b/api/controllers/winnerController.js @@ -73,7 +73,7 @@ const byDate = (req, res) => { }); }; -const groupedByDate = (req, res) => { +const groupByDate = (req, res) => { const { sort, includeWines } = req.query; if (sort !== undefined && !sortOptions.includes(sort)) { @@ -156,7 +156,7 @@ const byName = (req, res) => { }); }; -const byColor = (req, res) => { +const groupByColor = (req, res) => { const { includeWines } = req.query; if (includeWines !== undefined && !includeWinesOptions.includes(includeWines)) { @@ -167,7 +167,7 @@ const byColor = (req, res) => { } return winnerRepository - .byColor(includeWines == "true") + .groupByColor(includeWines == "true") .then(colors => res.send({ colors: colors, @@ -184,11 +184,40 @@ const byColor = (req, res) => { }); }; +const orderByWins = (req, res) => { + const { includeWines } = req.query; + + if (includeWines !== undefined && !includeWinesOptions.includes(includeWines)) { + return res.status(400).send({ + message: `includeWines option must be: '${includeWinesOptions.join(", ")}'`, + success: false + }); + } + + return winnerRepository + .orderByWins(includeWines == "true") + .then(winners => + res.send({ + winners: winners, + success: true + }) + ) + .catch(error => { + const { statusCode, message } = error; + + return res.status(statusCode || 500).send({ + success: false, + message: message || "Unable to fetch winners by color." + }); + }); +}; + module.exports = { all, byDate, - groupedByDate, + groupByDate, latest, byName, - byColor + groupByColor, + orderByWins }; diff --git a/api/winner.js b/api/winner.js index d525c94..a528031 100644 --- a/api/winner.js +++ b/api/winner.js @@ -136,7 +136,7 @@ const latest = () => { return Winner.aggregate(query).then(winners => winners[0]); }; -const groupedByDate = (includeWines = false, sort = "desc") => { +const groupByDate = (includeWines = false, sort = "desc") => { const query = [ { $unwind: "$wins" @@ -181,7 +181,7 @@ const groupedByDate = (includeWines = false, sort = "desc") => { return Winner.aggregate(query).then(lotteries => (sort != "asc" ? lotteries : lotteries.reverse())); }; -const byColor = (includeWines = false) => { +const groupByColor = (includeWines = false) => { const query = [ { $unwind: "$wins" @@ -214,9 +214,6 @@ const byColor = (includeWines = false) => { } ]; - console.log("includeWines:", includeWines); - console.log("includeWines:", includeWines == true); - if (includeWines) { query.splice(1, 0, { $lookup: { @@ -231,10 +228,60 @@ const byColor = (includeWines = false) => { return Winner.aggregate(query); }; +const orderByWins = (includeWines = false) => { + let query = [ + { + $project: { + name: "$name", + wins: "$wins", + totalWins: { $size: "$wins" } + } + }, + { + $sort: { + totalWins: -1, + "wins.date": -1 + } + } + ]; + + if (includeWines) { + const includeWinesSubQuery = [ + { + $unwind: "$wins" + }, + { + $lookup: { + from: "wines", + localField: "wins.wine", + foreignField: "_id", + as: "wins.wine" + } + }, + { + $unwind: "$wins._id" + }, + { + $group: { + _id: "$_id", + name: { $first: "$name" }, + totalWins: { $first: "$totalWins" }, + wins: { $push: "$wins" } + } + } + ]; + + query = includeWinesSubQuery.concat(query); + } + + return Winner.aggregate(query); +}; + module.exports = { all, byDate, latest, - groupedByDate, - byColor + groupByDate, + groupByColor, + orderByWins };