Replaced for clearer project structure & new ctrls.
These files where directly called from the api endpoints. Now all functoins have been replaced with a controller interfacing to the endpoint and a repository file for each of the functions.
This commit is contained in:
154
api/retrieve.js
154
api/retrieve.js
@@ -1,154 +0,0 @@
|
|||||||
const path = require("path");
|
|
||||||
|
|
||||||
const Purchase = require(path.join(__dirname, "/schemas/Purchase"));
|
|
||||||
const Wine = require(path.join(__dirname, "/schemas/Wine"));
|
|
||||||
const Highscore = require(path.join(__dirname, "/schemas/Highscore"));
|
|
||||||
const PreLotteryWine = require(path.join(
|
|
||||||
__dirname, "/schemas/PreLotteryWine"
|
|
||||||
));
|
|
||||||
|
|
||||||
const prelotteryWines = async (req, res) => {
|
|
||||||
let wines = await PreLotteryWine.find();
|
|
||||||
return res.json(wines);
|
|
||||||
};
|
|
||||||
|
|
||||||
const allPurchase = async (req, res) => {
|
|
||||||
let purchases = await Purchase.find()
|
|
||||||
.populate("wines")
|
|
||||||
.sort({ date: 1 });
|
|
||||||
return res.json(purchases);
|
|
||||||
};
|
|
||||||
|
|
||||||
const purchaseByColor = async (req, res) => {
|
|
||||||
const countColor = await Purchase.find();
|
|
||||||
let red = 0;
|
|
||||||
let blue = 0;
|
|
||||||
let yellow = 0;
|
|
||||||
let green = 0;
|
|
||||||
let stolen = 0;
|
|
||||||
for (let i = 0; i < countColor.length; i++) {
|
|
||||||
let element = countColor[i];
|
|
||||||
red += element.red;
|
|
||||||
blue += element.blue;
|
|
||||||
yellow += element.yellow;
|
|
||||||
green += element.green;
|
|
||||||
if (element.stolen != undefined) {
|
|
||||||
stolen += element.stolen;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const highscore = await Highscore.find();
|
|
||||||
let redWin = 0;
|
|
||||||
let blueWin = 0;
|
|
||||||
let yellowWin = 0;
|
|
||||||
let greenWin = 0;
|
|
||||||
for (let i = 0; i < highscore.length; i++) {
|
|
||||||
let element = highscore[i];
|
|
||||||
for (let y = 0; y < element.wins.length; y++) {
|
|
||||||
let currentWin = element.wins[y];
|
|
||||||
switch (currentWin.color) {
|
|
||||||
case "blue":
|
|
||||||
blueWin += 1;
|
|
||||||
break;
|
|
||||||
case "red":
|
|
||||||
redWin += 1;
|
|
||||||
break;
|
|
||||||
case "yellow":
|
|
||||||
yellowWin += 1;
|
|
||||||
break;
|
|
||||||
case "green":
|
|
||||||
greenWin += 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const total = red + yellow + blue + green;
|
|
||||||
|
|
||||||
return res.json({
|
|
||||||
red: {
|
|
||||||
total: red,
|
|
||||||
win: redWin
|
|
||||||
},
|
|
||||||
blue: {
|
|
||||||
total: blue,
|
|
||||||
win: blueWin
|
|
||||||
},
|
|
||||||
green: {
|
|
||||||
total: green,
|
|
||||||
win: greenWin
|
|
||||||
},
|
|
||||||
yellow: {
|
|
||||||
total: yellow,
|
|
||||||
win: yellowWin
|
|
||||||
},
|
|
||||||
stolen: stolen,
|
|
||||||
total: total
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const highscore = async (req, res) => {
|
|
||||||
const highscore = await Highscore.find().populate("wins.wine");
|
|
||||||
|
|
||||||
return res.json(highscore);
|
|
||||||
};
|
|
||||||
|
|
||||||
const allWines = async (req, res) => {
|
|
||||||
const wines = await Wine.find();
|
|
||||||
|
|
||||||
return res.json(wines);
|
|
||||||
};
|
|
||||||
|
|
||||||
const allWinesSummary = async (req, res) => {
|
|
||||||
const highscore = await Highscore.find().populate("wins.wine");
|
|
||||||
let wines = {};
|
|
||||||
|
|
||||||
for (let i = 0; i < highscore.length; i++) {
|
|
||||||
let person = highscore[i];
|
|
||||||
for (let y = 0; y < person.wins.length; y++) {
|
|
||||||
let wine = person.wins[y].wine;
|
|
||||||
let date = person.wins[y].date;
|
|
||||||
let color = person.wins[y].color;
|
|
||||||
|
|
||||||
if (wines[wine._id] == undefined) {
|
|
||||||
wines[wine._id] = {
|
|
||||||
name: wine.name,
|
|
||||||
occurences: wine.occurences,
|
|
||||||
vivinoLink: wine.vivinoLink,
|
|
||||||
rating: wine.rating,
|
|
||||||
image: wine.image,
|
|
||||||
id: wine.id,
|
|
||||||
_id: wine._id,
|
|
||||||
dates: [date],
|
|
||||||
winners: [person.name],
|
|
||||||
red: 0,
|
|
||||||
blue: 0,
|
|
||||||
green: 0,
|
|
||||||
yellow: 0
|
|
||||||
};
|
|
||||||
wines[wine._id][color] += 1;
|
|
||||||
} else {
|
|
||||||
wines[wine._id].dates.push(date);
|
|
||||||
wines[wine._id].winners.push(person.name);
|
|
||||||
if (wines[wine._id][color] == undefined) {
|
|
||||||
wines[wine._id][color] = 1;
|
|
||||||
} else {
|
|
||||||
wines[wine._id][color] += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
wines = Object.values(wines).reverse()
|
|
||||||
|
|
||||||
return res.json(wines);
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
prelotteryWines,
|
|
||||||
allPurchase,
|
|
||||||
purchaseByColor,
|
|
||||||
highscore,
|
|
||||||
allWines,
|
|
||||||
allWinesSummary
|
|
||||||
};
|
|
||||||
142
api/update.js
142
api/update.js
@@ -1,142 +0,0 @@
|
|||||||
const express = require("express");
|
|
||||||
const path = require("path");
|
|
||||||
|
|
||||||
const sub = require(path.join(__dirname, "/subscriptions"));
|
|
||||||
|
|
||||||
const _wineFunctions = require(path.join(__dirname, "/wine"));
|
|
||||||
const _personFunctions = require(path.join(__dirname, "/person"));
|
|
||||||
const Subscription = require(path.join(__dirname, "/schemas/Subscription"));
|
|
||||||
const Lottery = require(path.join(__dirname, "/schemas/Purchase"));
|
|
||||||
const PreLotteryWine = require(path.join(
|
|
||||||
__dirname, "/schemas/PreLotteryWine"
|
|
||||||
));
|
|
||||||
|
|
||||||
const submitWines = async (req, res) => {
|
|
||||||
const wines = req.body;
|
|
||||||
for (let i = 0; i < wines.length; i++) {
|
|
||||||
let wine = wines[i];
|
|
||||||
let newWonWine = new PreLotteryWine({
|
|
||||||
name: wine.name,
|
|
||||||
vivinoLink: wine.vivinoLink,
|
|
||||||
rating: wine.rating,
|
|
||||||
image: wine.image,
|
|
||||||
price: wine.price,
|
|
||||||
country: wine.country,
|
|
||||||
id: wine.id
|
|
||||||
});
|
|
||||||
await newWonWine.save();
|
|
||||||
}
|
|
||||||
|
|
||||||
let subs = await Subscription.find();
|
|
||||||
console.log("Sending new wines w/ push notification to all subscribers.")
|
|
||||||
for (let i = 0; i < subs.length; i++) {
|
|
||||||
let subscription = subs[i]; //get subscription from your databse here.
|
|
||||||
|
|
||||||
const message = JSON.stringify({
|
|
||||||
message: "Dagens vin er lagt til, se den på lottis.vin/dagens!",
|
|
||||||
title: "Ny vin!",
|
|
||||||
link: "/#/dagens"
|
|
||||||
});
|
|
||||||
|
|
||||||
try {
|
|
||||||
sub.sendNotification(subscription, message);
|
|
||||||
} catch (error) {
|
|
||||||
console.error("Error when trying to send push notification to subscriber.");
|
|
||||||
console.error(error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return res.send({
|
|
||||||
message: "Submitted and notified push subscribers of new wines!",
|
|
||||||
success: true
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const schema = async (req, res) => {
|
|
||||||
let schema = { ...PreLotteryWine.schema.obj };
|
|
||||||
let nulledSchema = Object.keys(schema).reduce((accumulator, current) => {
|
|
||||||
accumulator[current] = "";
|
|
||||||
return accumulator
|
|
||||||
}, {});
|
|
||||||
|
|
||||||
return res.send(nulledSchema);
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO IMPLEMENT WITH FRONTEND (unused)
|
|
||||||
const submitWinesToLottery = async (req, res) => {
|
|
||||||
const { lottery } = req.body;
|
|
||||||
const { date, wines } = lottery;
|
|
||||||
const wineObjects = await Promise.all(wines.map(async (wine) => await _wineFunctions.findSaveWine(wine)))
|
|
||||||
|
|
||||||
return Lottery.findOneAndUpdate({ date: date }, {
|
|
||||||
date: date,
|
|
||||||
wines: wineObjects
|
|
||||||
}, {
|
|
||||||
upsert: true
|
|
||||||
}).then(_ => res.send(true))
|
|
||||||
.catch(err => res.status(500).send({ message: 'Unexpected error while updating/saving wine to lottery.',
|
|
||||||
success: false,
|
|
||||||
exception: err.message }));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @apiParam (Request body) {Array} winners List of winners
|
|
||||||
*/
|
|
||||||
const submitWinnersToLottery = async (req, res) => {
|
|
||||||
const { lottery } = req.body;
|
|
||||||
const { winners, date } = lottery;
|
|
||||||
|
|
||||||
for (let i = 0; i < winners.length; i++) {
|
|
||||||
let currentWinner = winners[i];
|
|
||||||
let wonWine = await _wineFunctions.findSaveWine(currentWinner.wine); // TODO rename to findAndSaveWineToLottery
|
|
||||||
await _personFunctions.findSavePerson(currentWinner, wonWine, date); // TODO rename to findAndSaveWineToPerson
|
|
||||||
}
|
|
||||||
|
|
||||||
return res.json(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @apiParam (Request body) {Date} date Date of lottery
|
|
||||||
* @apiParam (Request body) {Number} blue Number of blue tickets
|
|
||||||
* @apiParam (Request body) {Number} red Number of red tickets
|
|
||||||
* @apiParam (Request body) {Number} green Number of green tickets
|
|
||||||
* @apiParam (Request body) {Number} yellow Number of yellow tickets
|
|
||||||
* @apiParam (Request body) {Number} bought Number of tickets bought
|
|
||||||
* @apiParam (Request body) {Number} stolen Number of tickets stolen
|
|
||||||
*/
|
|
||||||
const submitLottery = async (req, res) => {
|
|
||||||
const { lottery } = req.body
|
|
||||||
|
|
||||||
const { date,
|
|
||||||
blue,
|
|
||||||
red,
|
|
||||||
yellow,
|
|
||||||
green,
|
|
||||||
bought,
|
|
||||||
stolen } = lottery;
|
|
||||||
|
|
||||||
return Lottery.findOneAndUpdate({ date: date }, {
|
|
||||||
date: date,
|
|
||||||
blue: blue,
|
|
||||||
yellow: yellow,
|
|
||||||
red: red,
|
|
||||||
green: green,
|
|
||||||
bought: bought,
|
|
||||||
stolen: stolen
|
|
||||||
}, {
|
|
||||||
upsert: true
|
|
||||||
}).then(_ => res.send(true))
|
|
||||||
.catch(err => res.status(500).send({ message: 'Unexpected error while updating/saving lottery.',
|
|
||||||
success: false,
|
|
||||||
exception: err.message }));
|
|
||||||
|
|
||||||
return res.send(true);
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
submitWines,
|
|
||||||
schema,
|
|
||||||
submitLottery,
|
|
||||||
submitWinnersToLottery,
|
|
||||||
submitWinesToLottery
|
|
||||||
};
|
|
||||||
@@ -1,281 +0,0 @@
|
|||||||
const path = require("path");
|
|
||||||
const crypto = require("crypto");
|
|
||||||
|
|
||||||
const config = require(path.join(__dirname, "/../config/defaults/lottery"));
|
|
||||||
const Message = require(path.join(__dirname, "/message"));
|
|
||||||
const { findAndNotifyNextWinner } = require(path.join(__dirname, "/virtualRegistration"));
|
|
||||||
|
|
||||||
const Attendee = require(path.join(__dirname, "/schemas/Attendee"));
|
|
||||||
const VirtualWinner = require(path.join(__dirname, "/schemas/VirtualWinner"));
|
|
||||||
const PreLotteryWine = require(path.join(__dirname, "/schemas/PreLotteryWine"));
|
|
||||||
|
|
||||||
|
|
||||||
const winners = async (req, res) => {
|
|
||||||
let winners = await VirtualWinner.find();
|
|
||||||
let winnersRedacted = [];
|
|
||||||
let winner;
|
|
||||||
for (let i = 0; i < winners.length; i++) {
|
|
||||||
winner = winners[i];
|
|
||||||
winnersRedacted.push({
|
|
||||||
name: winner.name,
|
|
||||||
color: winner.color
|
|
||||||
});
|
|
||||||
}
|
|
||||||
res.json(winnersRedacted);
|
|
||||||
};
|
|
||||||
|
|
||||||
const winnersSecure = async (req, res) => {
|
|
||||||
let winners = await VirtualWinner.find();
|
|
||||||
|
|
||||||
return res.json(winners);
|
|
||||||
};
|
|
||||||
|
|
||||||
const deleteWinners = async (req, res) => {
|
|
||||||
await VirtualWinner.deleteMany();
|
|
||||||
var io = req.app.get('socketio');
|
|
||||||
io.emit("refresh_data", {});
|
|
||||||
return res.json(true);
|
|
||||||
};
|
|
||||||
|
|
||||||
const attendees = async (req, res) => {
|
|
||||||
let attendees = await Attendee.find();
|
|
||||||
let attendeesRedacted = [];
|
|
||||||
let attendee;
|
|
||||||
for (let i = 0; i < attendees.length; i++) {
|
|
||||||
attendee = attendees[i];
|
|
||||||
attendeesRedacted.push({
|
|
||||||
name: attendee.name,
|
|
||||||
raffles: attendee.red + attendee.blue + attendee.yellow + attendee.green,
|
|
||||||
red: attendee.red,
|
|
||||||
blue: attendee.blue,
|
|
||||||
green: attendee.green,
|
|
||||||
yellow: attendee.yellow
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return res.json(attendeesRedacted);
|
|
||||||
};
|
|
||||||
|
|
||||||
const attendeesSecure = async (req, res) => {
|
|
||||||
let attendees = await Attendee.find();
|
|
||||||
|
|
||||||
return res.json(attendees);
|
|
||||||
};
|
|
||||||
|
|
||||||
const addAttendee = async (req, res) => {
|
|
||||||
const attendee = req.body;
|
|
||||||
const { red, blue, yellow, green } = attendee;
|
|
||||||
|
|
||||||
let newAttendee = new Attendee({
|
|
||||||
name: attendee.name,
|
|
||||||
red,
|
|
||||||
blue,
|
|
||||||
green,
|
|
||||||
yellow,
|
|
||||||
phoneNumber: attendee.phoneNumber,
|
|
||||||
winner: false
|
|
||||||
});
|
|
||||||
await newAttendee.save();
|
|
||||||
|
|
||||||
|
|
||||||
var io = req.app.get('socketio');
|
|
||||||
io.emit("new_attendee", {});
|
|
||||||
|
|
||||||
return res.send(true);
|
|
||||||
};
|
|
||||||
|
|
||||||
const deleteAttendees = async (req, res) => {
|
|
||||||
await Attendee.deleteMany();
|
|
||||||
var io = req.app.get('socketio');
|
|
||||||
io.emit("refresh_data", {});
|
|
||||||
return res.json(true);
|
|
||||||
};
|
|
||||||
|
|
||||||
const drawWinner = async (req, res) => {
|
|
||||||
let allContestants = await Attendee.find({ winner: false });
|
|
||||||
|
|
||||||
if (allContestants.length == 0) {
|
|
||||||
return res.json({
|
|
||||||
success: false,
|
|
||||||
message: "No attendees left that have not won."
|
|
||||||
});
|
|
||||||
}
|
|
||||||
let raffleColors = [];
|
|
||||||
for (let i = 0; i < allContestants.length; i++) {
|
|
||||||
let currentContestant = allContestants[i];
|
|
||||||
for (let blue = 0; blue < currentContestant.blue; blue++) {
|
|
||||||
raffleColors.push("blue");
|
|
||||||
}
|
|
||||||
for (let red = 0; red < currentContestant.red; red++) {
|
|
||||||
raffleColors.push("red");
|
|
||||||
}
|
|
||||||
for (let green = 0; green < currentContestant.green; green++) {
|
|
||||||
raffleColors.push("green");
|
|
||||||
}
|
|
||||||
for (let yellow = 0; yellow < currentContestant.yellow; yellow++) {
|
|
||||||
raffleColors.push("yellow");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
raffleColors = shuffle(raffleColors);
|
|
||||||
|
|
||||||
let colorToChooseFrom =
|
|
||||||
raffleColors[Math.floor(Math.random() * raffleColors.length)];
|
|
||||||
let findObject = { winner: false };
|
|
||||||
|
|
||||||
findObject[colorToChooseFrom] = { $gt: 0 };
|
|
||||||
|
|
||||||
let tries = 0;
|
|
||||||
const maxTries = 3;
|
|
||||||
let contestantsToChooseFrom = undefined;
|
|
||||||
while (contestantsToChooseFrom == undefined && tries < maxTries) {
|
|
||||||
const hit = await Attendee.find(findObject);
|
|
||||||
if (hit && hit.length) {
|
|
||||||
contestantsToChooseFrom = hit;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
tries++;
|
|
||||||
}
|
|
||||||
if (contestantsToChooseFrom == undefined) {
|
|
||||||
return res.status(404).send({
|
|
||||||
success: false,
|
|
||||||
message: `Klarte ikke trekke en vinner etter ${maxTries} forsøk.`
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
let attendeeListDemocratic = [];
|
|
||||||
|
|
||||||
let currentContestant;
|
|
||||||
for (let i = 0; i < contestantsToChooseFrom.length; i++) {
|
|
||||||
currentContestant = contestantsToChooseFrom[i];
|
|
||||||
for (let y = 0; y < currentContestant[colorToChooseFrom]; y++) {
|
|
||||||
attendeeListDemocratic.push({
|
|
||||||
name: currentContestant.name,
|
|
||||||
phoneNumber: currentContestant.phoneNumber,
|
|
||||||
red: currentContestant.red,
|
|
||||||
blue: currentContestant.blue,
|
|
||||||
green: currentContestant.green,
|
|
||||||
yellow: currentContestant.yellow
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
attendeeListDemocratic = shuffle(attendeeListDemocratic);
|
|
||||||
|
|
||||||
let winner =
|
|
||||||
attendeeListDemocratic[
|
|
||||||
Math.floor(Math.random() * attendeeListDemocratic.length)
|
|
||||||
];
|
|
||||||
|
|
||||||
let winners = await VirtualWinner.find({ timestamp_sent: undefined }).sort({
|
|
||||||
timestamp_drawn: 1
|
|
||||||
});
|
|
||||||
|
|
||||||
var io = req.app.get('socketio');
|
|
||||||
io.emit("winner", {
|
|
||||||
color: colorToChooseFrom,
|
|
||||||
name: winner.name,
|
|
||||||
winner_count: winners.length + 1
|
|
||||||
});
|
|
||||||
|
|
||||||
let newWinnerElement = new VirtualWinner({
|
|
||||||
name: winner.name,
|
|
||||||
phoneNumber: winner.phoneNumber,
|
|
||||||
color: colorToChooseFrom,
|
|
||||||
red: winner.red,
|
|
||||||
blue: winner.blue,
|
|
||||||
green: winner.green,
|
|
||||||
yellow: winner.yellow,
|
|
||||||
id: sha512(winner.phoneNumber, genRandomString(10)),
|
|
||||||
timestamp_drawn: new Date().getTime()
|
|
||||||
});
|
|
||||||
|
|
||||||
await Attendee.update(
|
|
||||||
{ name: winner.name, phoneNumber: winner.phoneNumber },
|
|
||||||
{ $set: { winner: true } }
|
|
||||||
);
|
|
||||||
|
|
||||||
await newWinnerElement.save();
|
|
||||||
return res.json({
|
|
||||||
success: true,
|
|
||||||
winner
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const finish = async (req, res) => {
|
|
||||||
if (!config.gatewayToken) {
|
|
||||||
return res.json({
|
|
||||||
message: "Missing api token for sms gateway.",
|
|
||||||
success: false
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
let winners = await VirtualWinner.find({ timestamp_sent: undefined }).sort({
|
|
||||||
timestamp_drawn: 1
|
|
||||||
});
|
|
||||||
|
|
||||||
if (winners.length == 0) {
|
|
||||||
return res.json({
|
|
||||||
message: "No winners to draw from.",
|
|
||||||
success: false
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
Message.sendInitialMessageToWinners(winners.slice(1));
|
|
||||||
|
|
||||||
return findAndNotifyNextWinner()
|
|
||||||
.then(() => res.json({
|
|
||||||
success: true,
|
|
||||||
message: "Sent wine select message to first winner and update message to rest of winners."
|
|
||||||
}))
|
|
||||||
.catch(error => res.json({
|
|
||||||
message: error["message"] || "Unable to send message to first winner.",
|
|
||||||
success: false
|
|
||||||
}))
|
|
||||||
};
|
|
||||||
|
|
||||||
const genRandomString = function(length) {
|
|
||||||
return crypto
|
|
||||||
.randomBytes(Math.ceil(length / 2))
|
|
||||||
.toString("hex") /** convert to hexadecimal format */
|
|
||||||
.slice(0, length); /** return required number of characters */
|
|
||||||
};
|
|
||||||
|
|
||||||
const sha512 = function(password, salt) {
|
|
||||||
var hash = crypto.createHmac("md5", salt); /** Hashing algorithm sha512 */
|
|
||||||
hash.update(password);
|
|
||||||
var value = hash.digest("hex");
|
|
||||||
return value;
|
|
||||||
};
|
|
||||||
|
|
||||||
function shuffle(array) {
|
|
||||||
let currentIndex = array.length,
|
|
||||||
temporaryValue,
|
|
||||||
randomIndex;
|
|
||||||
|
|
||||||
// While there remain elements to shuffle...
|
|
||||||
while (0 !== currentIndex) {
|
|
||||||
// Pick a remaining element...
|
|
||||||
randomIndex = Math.floor(Math.random() * currentIndex);
|
|
||||||
currentIndex -= 1;
|
|
||||||
|
|
||||||
// And swap it with the current element.
|
|
||||||
temporaryValue = array[currentIndex];
|
|
||||||
array[currentIndex] = array[randomIndex];
|
|
||||||
array[randomIndex] = temporaryValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
return array;
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
deleteWinners,
|
|
||||||
deleteAttendees,
|
|
||||||
winners,
|
|
||||||
winnersSecure,
|
|
||||||
drawWinner,
|
|
||||||
finish,
|
|
||||||
attendees,
|
|
||||||
attendeesSecure,
|
|
||||||
addAttendee
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,200 +0,0 @@
|
|||||||
const path = require("path");
|
|
||||||
|
|
||||||
const _wineFunctions = require(path.join(__dirname, "/wine"));
|
|
||||||
const _personFunctions = require(path.join(__dirname, "/person"));
|
|
||||||
const Message = require(path.join(__dirname, "/message"));
|
|
||||||
const VirtualWinner = require(path.join(
|
|
||||||
__dirname, "/schemas/VirtualWinner"
|
|
||||||
));
|
|
||||||
const PreLotteryWine = require(path.join(
|
|
||||||
__dirname, "/schemas/PreLotteryWine"
|
|
||||||
));
|
|
||||||
|
|
||||||
|
|
||||||
const getWinesToWinnerById = async (req, res) => {
|
|
||||||
let id = req.params.id;
|
|
||||||
let foundWinner = await VirtualWinner.findOne({ id: id });
|
|
||||||
|
|
||||||
if (!foundWinner) {
|
|
||||||
return res.json({
|
|
||||||
success: false,
|
|
||||||
message: "No winner with this id.",
|
|
||||||
existing: false,
|
|
||||||
turn: false
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
let allWinners = await VirtualWinner.find().sort({ timestamp_drawn: 1 });
|
|
||||||
if (
|
|
||||||
allWinners[0].id != foundWinner.id ||
|
|
||||||
foundWinner.timestamp_limit == undefined ||
|
|
||||||
foundWinner.timestamp_sent == undefined
|
|
||||||
) {
|
|
||||||
return res.json({
|
|
||||||
success: false,
|
|
||||||
message: "Not the winner next in line!",
|
|
||||||
existing: true,
|
|
||||||
turn: false
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return res.json({
|
|
||||||
success: true,
|
|
||||||
existing: true,
|
|
||||||
turn: true,
|
|
||||||
name: foundWinner.name,
|
|
||||||
color: foundWinner.color
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const registerWinnerSelection = async (req, res) => {
|
|
||||||
let id = req.params.id;
|
|
||||||
let wineName = req.body.wineName;
|
|
||||||
let foundWinner = await VirtualWinner.findOne({ id: id });
|
|
||||||
|
|
||||||
if (!foundWinner) {
|
|
||||||
return res.json({
|
|
||||||
success: false,
|
|
||||||
message: "No winner with this id."
|
|
||||||
})
|
|
||||||
} else if (foundWinner.timestamp_limit < new Date().getTime()) {
|
|
||||||
return res.json({
|
|
||||||
success: false,
|
|
||||||
message: "Timelimit expired, you will receive a wine after other users have chosen.",
|
|
||||||
limit: true
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
let date = new Date();
|
|
||||||
date.setHours(5, 0, 0, 0);
|
|
||||||
let prelotteryWine = await PreLotteryWine.findOne({ name: wineName });
|
|
||||||
|
|
||||||
if (!prelotteryWine) {
|
|
||||||
return res.json({
|
|
||||||
success: false,
|
|
||||||
message: "No wine with this name.",
|
|
||||||
wine: false
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
let wonWine = await _wineFunctions.findSaveWine(prelotteryWine);
|
|
||||||
await prelotteryWine.delete();
|
|
||||||
await _personFunctions.findSavePerson(foundWinner, wonWine, date);
|
|
||||||
await Message.sendWineConfirmation(foundWinner, wonWine, date);
|
|
||||||
|
|
||||||
await foundWinner.delete();
|
|
||||||
console.info("Saved winners choice.");
|
|
||||||
|
|
||||||
return findAndNotifyNextWinner()
|
|
||||||
.then(() => res.json({
|
|
||||||
message: "Choice saved and next in line notified.",
|
|
||||||
success: true
|
|
||||||
}))
|
|
||||||
.catch(error => res.json({
|
|
||||||
message: error["message"] || "Error when notifing next winner.",
|
|
||||||
success: false
|
|
||||||
}))
|
|
||||||
};
|
|
||||||
|
|
||||||
const chooseLastWineForUser = (winner, preLotteryWine) => {
|
|
||||||
let date = new Date();
|
|
||||||
date.setHours(5, 0, 0, 0);
|
|
||||||
|
|
||||||
return _wineFunctions.findSaveWine(preLotteryWine)
|
|
||||||
.then(wonWine => _personFunctions.findSavePerson(winner, wonWine, date))
|
|
||||||
.then(() => preLotteryWine.delete())
|
|
||||||
.then(() => Message.sendLastWinnerMessage(winner, preLotteryWine))
|
|
||||||
.then(() => winner.delete())
|
|
||||||
.catch(err => {
|
|
||||||
console.log("Error thrown from chooseLastWineForUser: " + err);
|
|
||||||
throw err;
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
const findAndNotifyNextWinner = async () => {
|
|
||||||
let nextWinner = undefined;
|
|
||||||
|
|
||||||
let winnersLeft = await VirtualWinner.find().sort({ timestamp_drawn: 1 });
|
|
||||||
let winesLeft = await PreLotteryWine.find();
|
|
||||||
|
|
||||||
if (winnersLeft.length > 1) {
|
|
||||||
console.log("multiple winners left, choose next in line")
|
|
||||||
nextWinner = winnersLeft[0]; // multiple winners left, choose next in line
|
|
||||||
} else if (winnersLeft.length == 1 && winesLeft.length > 1) {
|
|
||||||
console.log("one winner left, but multiple wines")
|
|
||||||
nextWinner = winnersLeft[0] // one winner left, but multiple wines
|
|
||||||
} else if (winnersLeft.length == 1 && winesLeft.length == 1) {
|
|
||||||
console.log("one winner and one wine left, choose for user")
|
|
||||||
nextWinner = winnersLeft[0] // one winner and one wine left, choose for user
|
|
||||||
wine = winesLeft[0]
|
|
||||||
return chooseLastWineForUser(nextWinner, wine);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nextWinner) {
|
|
||||||
return Message.sendWineSelectMessage(nextWinner)
|
|
||||||
.then(messageResponse => startTimeout(nextWinner.id))
|
|
||||||
} else {
|
|
||||||
console.info("All winners notified. Could start cleanup here.");
|
|
||||||
return Promise.resolve({
|
|
||||||
message: "All winners notified."
|
|
||||||
})
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const sendNotificationToWinnerById = async (req, res) => {
|
|
||||||
const { id } = req.params;
|
|
||||||
let winner = await VirtualWinner.findOne({ id: id });
|
|
||||||
|
|
||||||
if (!winner) {
|
|
||||||
return res.json({
|
|
||||||
message: "No winner with this id.",
|
|
||||||
success: false
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return Message.sendWineSelectMessage(winner)
|
|
||||||
.then(success => res.json({
|
|
||||||
success: success,
|
|
||||||
message: `Message sent to winner ${id} successfully!`
|
|
||||||
}))
|
|
||||||
.catch(err => res.json({
|
|
||||||
success: false,
|
|
||||||
message: "Error while trying to send sms.",
|
|
||||||
error: err
|
|
||||||
}))
|
|
||||||
}
|
|
||||||
|
|
||||||
function startTimeout(id) {
|
|
||||||
const minute = 60000;
|
|
||||||
const minutesForTimeout = 10;
|
|
||||||
|
|
||||||
console.log(`Starting timeout for user ${id}.`);
|
|
||||||
console.log(`Timeout duration: ${ minutesForTimeout * minute }`)
|
|
||||||
setTimeout(async () => {
|
|
||||||
let virtualWinner = await VirtualWinner.findOne({ id: id });
|
|
||||||
if (!virtualWinner) {
|
|
||||||
console.log(`Timeout done for user ${id}, but user has already sent data.`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
console.log(`Timeout done for user ${id}, sending update to user.`);
|
|
||||||
|
|
||||||
Message.sendWineSelectMessageTooLate(virtualWinner);
|
|
||||||
|
|
||||||
virtualWinner.timestamp_drawn = new Date().getTime();
|
|
||||||
virtualWinner.timestamp_limit = null;
|
|
||||||
virtualWinner.timestamp_sent = null;
|
|
||||||
await virtualWinner.save();
|
|
||||||
|
|
||||||
findAndNotifyNextWinner();
|
|
||||||
}, minutesForTimeout * minute);
|
|
||||||
|
|
||||||
return Promise.resolve()
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
getWinesToWinnerById,
|
|
||||||
registerWinnerSelection,
|
|
||||||
findAndNotifyNextWinner,
|
|
||||||
|
|
||||||
sendNotificationToWinnerById
|
|
||||||
};
|
|
||||||
Reference in New Issue
Block a user