Feat/controllers - refactor entire backend and new admin interface #75
@@ -7,6 +7,9 @@ const VirtualWinner = require(path.join(__dirname, "/schemas/VirtualWinner"));
|
|||||||
const Lottery = require(path.join(__dirname, "/schemas/Purchase"));
|
const Lottery = require(path.join(__dirname, "/schemas/Purchase"));
|
||||||
|
|
||||||
const Message = require(path.join(__dirname, "/message"));
|
const Message = require(path.join(__dirname, "/message"));
|
||||||
|
const historyRepository = require(path.join(__dirname, "/history"));
|
||||||
|
const wineRepository = require(path.join(__dirname, "/wine"));
|
||||||
|
|
||||||
const {
|
const {
|
||||||
WinnerNotFound,
|
WinnerNotFound,
|
||||||
NoMoreAttendeesToWin,
|
NoMoreAttendeesToWin,
|
||||||
@@ -17,11 +20,9 @@ const {
|
|||||||
const archive = (date, raffles, stolen, wines) => {
|
const archive = (date, raffles, stolen, wines) => {
|
||||||
const { blue, red, yellow, green } = raffles;
|
const { blue, red, yellow, green } = raffles;
|
||||||
const bought = blue + red + yellow + green;
|
const bought = blue + red + yellow + green;
|
||||||
date = date.setHours(0, 0, 0, 0);
|
|
||||||
|
|
||||||
return Lottery.findOneAndUpdate(
|
return Promise.all(wines.map(wine => wineRepository.findWine(wine))).then(resolvedWines => {
|
||||||
{ date },
|
const lottery = new Lottery({
|
||||||
{
|
|
||||||
date,
|
date,
|
||||||
blue,
|
blue,
|
||||||
red,
|
red,
|
||||||
@@ -29,10 +30,11 @@ const archive = (date, raffles, stolen, wines) => {
|
|||||||
green,
|
green,
|
||||||
bought,
|
bought,
|
||||||
stolen,
|
stolen,
|
||||||
wines
|
wines: resolvedWines
|
||||||
},
|
});
|
||||||
{ upsert: true }
|
|
||||||
);
|
return lottery.save();
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const lotteryByDate = date => {
|
const lotteryByDate = date => {
|
||||||
@@ -67,10 +69,65 @@ const lotteryByDate = date => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const allLotteries = () => {
|
const allLotteries = (sort = "asc", yearFilter = undefined) => {
|
||||||
return Lottery.find()
|
const sortDirection = sort == "asc" ? 1 : -1;
|
||||||
.select("-_id -__v")
|
|
||||||
.populate("wines");
|
let startQueryDate = new Date("1970-01-01");
|
||||||
|
let endQueryDate = new Date("2999-01-01");
|
||||||
|
if (yearFilter) {
|
||||||
|
startQueryDate = new Date(`${yearFilter}-01-01`);
|
||||||
|
endQueryDate = new Date(`${Number(yearFilter) + 1}-01-01`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const query = [
|
||||||
|
{
|
||||||
|
$match: {
|
||||||
|
date: {
|
||||||
|
$gte: startQueryDate,
|
||||||
|
$lte: endQueryDate
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
$sort: {
|
||||||
|
date: sortDirection
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
$unset: ["_id", "__v"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
$lookup: {
|
||||||
|
from: "wines",
|
||||||
|
localField: "wines",
|
||||||
|
foreignField: "_id",
|
||||||
|
as: "wines"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
return Lottery.aggregate(query);
|
||||||
|
};
|
||||||
|
|
||||||
|
const allLotteriesIncludingWinners = async (sort = "asc", yearFilter = undefined) => {
|
||||||
|
const lotteries = await allLotteries(sort, yearFilter);
|
||||||
|
const allWinners = await historyRepository.groupByDate(false, sort);
|
||||||
|
|
||||||
|
return lotteries.map(lottery => {
|
||||||
|
const { winners } = allWinners.pop();
|
||||||
|
|
||||||
|
return {
|
||||||
|
wines: lottery.wines,
|
||||||
|
date: lottery.date,
|
||||||
|
blue: lottery.blue,
|
||||||
|
green: lottery.green,
|
||||||
|
yellow: lottery.yellow,
|
||||||
|
red: lottery.red,
|
||||||
|
bought: lottery.bought,
|
||||||
|
stolen: lottery.stolen,
|
||||||
|
winners: winners
|
||||||
|
};
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const drawWinner = async () => {
|
const drawWinner = async () => {
|
||||||
@@ -140,10 +197,6 @@ const drawWinner = async () => {
|
|||||||
|
|
||||||
let winner = attendeeListDemocratic[Math.floor(Math.random() * attendeeListDemocratic.length)];
|
let winner = attendeeListDemocratic[Math.floor(Math.random() * attendeeListDemocratic.length)];
|
||||||
|
|
||||||
let winners = await VirtualWinner.find({ timestamp_sent: undefined }).sort({
|
|
||||||
timestamp_drawn: 1
|
|
||||||
});
|
|
||||||
|
|
||||||
let newWinnerElement = new VirtualWinner({
|
let newWinnerElement = new VirtualWinner({
|
||||||
name: winner.name,
|
name: winner.name,
|
||||||
phoneNumber: winner.phoneNumber,
|
phoneNumber: winner.phoneNumber,
|
||||||
@@ -159,6 +212,10 @@ const drawWinner = async () => {
|
|||||||
await newWinnerElement.save();
|
await newWinnerElement.save();
|
||||||
await Attendee.updateOne({ name: winner.name, phoneNumber: winner.phoneNumber }, { $set: { winner: true } });
|
await Attendee.updateOne({ name: winner.name, phoneNumber: winner.phoneNumber }, { $set: { winner: true } });
|
||||||
|
|
||||||
|
let winners = await VirtualWinner.find({ timestamp_sent: undefined }).sort({
|
||||||
|
timestamp_drawn: 1
|
||||||
|
});
|
||||||
|
|
||||||
return { winner, color: colorToChooseFrom, winners };
|
return { winner, color: colorToChooseFrom, winners };
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -201,5 +258,6 @@ module.exports = {
|
|||||||
drawWinner,
|
drawWinner,
|
||||||
archive,
|
archive,
|
||||||
lotteryByDate,
|
lotteryByDate,
|
||||||
allLotteries
|
allLotteries,
|
||||||
|
allLotteriesIncludingWinners
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user