/by-color endpoint for sort all winners by color.

Can also include query parameter includeWines for resolved wine
references.
This commit is contained in:
2021-01-17 17:26:37 +01:00
parent 53780878af
commit e9ece6963e
2 changed files with 85 additions and 7 deletions

View File

@@ -5,7 +5,7 @@ const sortOptions = ["desc", "asc"];
const includeWinesOptions = ["true", "false"];
const all = (req, res) => {
let { sort, includeWines } = req.query;
const { sort, includeWines } = req.query;
if (sort !== undefined && !sortOptions.includes(sort)) {
return res.status(400).send({
@@ -74,7 +74,7 @@ const byDate = (req, res) => {
};
const groupedByDate = (req, res) => {
let { sort, includeWines } = req.query;
const { sort, includeWines } = req.query;
if (sort !== undefined && !sortOptions.includes(sort)) {
return res.status(400).send({
@@ -91,7 +91,7 @@ const groupedByDate = (req, res) => {
}
return winnerRepository
.groupedByDate(includeWines, sort)
.groupedByDate(includeWines == "true", sort)
.then(lotteries =>
res.send({
lotteries: lotteries,
@@ -156,10 +156,39 @@ const byName = (req, res) => {
});
};
const byColor = (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
.byColor(includeWines == "true")
.then(colors =>
res.send({
colors: colors,
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,
latest,
byName
byName,
byColor
};

View File

@@ -78,8 +78,6 @@ const byDate = date => {
};
const byName = (name, sort = "desc") => {
const populateOptions = { sort: "date" };
return Winner.findOne({ name }, ["name", "wins"])
.sort("-wins.date")
.populate("wins.wine")
@@ -183,9 +181,60 @@ const groupedByDate = (includeWines = false, sort = "desc") => {
return Winner.aggregate(query).then(lotteries => (sort != "asc" ? lotteries : lotteries.reverse()));
};
const byColor = (includeWines = false) => {
const query = [
{
$unwind: "$wins"
},
{
$group: {
_id: "$wins.color",
winners: {
$push: {
_id: "$_id",
name: "$name",
date: "$wins.date",
wine: "$wins.wine"
}
},
count: { $sum: 1 }
}
},
{
$project: {
color: "$_id",
count: "$count",
winners: "$winners"
}
},
{
$sort: {
_id: -1
}
}
];
console.log("includeWines:", includeWines);
console.log("includeWines:", includeWines == true);
if (includeWines) {
query.splice(1, 0, {
$lookup: {
from: "wines",
localField: "wins.wine",
foreignField: "_id",
as: "wins.wine"
}
});
}
return Winner.aggregate(query);
};
module.exports = {
all,
byDate,
latest,
groupedByDate
groupedByDate,
byColor
};