236 lines
5.5 KiB
JavaScript
236 lines
5.5 KiB
JavaScript
const express = require("express");
|
|
const path = require("path");
|
|
const router = express.Router();
|
|
const mongoose = require("mongoose");
|
|
|
|
mongoose.connect("mongodb://localhost:27017/vinlottis", {
|
|
useNewUrlParser: true
|
|
});
|
|
|
|
const Message = require(path.join(__dirname + "/../api/message"));
|
|
const VirtualWinner = require(path.join(
|
|
__dirname + "/../schemas/VirtualWinner"
|
|
));
|
|
const Highscore = require(path.join(__dirname + "/../schemas/Highscore"));
|
|
const Wine = require(path.join(__dirname + "/../schemas/Wine"));
|
|
const PreLotteryWine = require(path.join(
|
|
__dirname + "/../schemas/PreLotteryWine"
|
|
));
|
|
|
|
router.use((req, res, next) => {
|
|
next();
|
|
});
|
|
|
|
router.route("/winner/:id").get((req, res) => {
|
|
res.redirect(`/#/winner/${req.params.id}`);
|
|
});
|
|
|
|
router.route("/:id").get(async (req, res) => {
|
|
let id = req.params.id;
|
|
let foundWinner = await VirtualWinner.findOne({ id: id });
|
|
|
|
if (!foundWinner) {
|
|
res.json({
|
|
existing: false,
|
|
turn: false
|
|
});
|
|
return;
|
|
}
|
|
|
|
let allWinners = await VirtualWinner.find().sort({ timestamp_drawn: 1 });
|
|
|
|
if (
|
|
allWinners[0].id != foundWinner.id ||
|
|
foundWinner.timestamp_limit == undefined ||
|
|
foundWinner.timestamp_sent == undefined
|
|
) {
|
|
res.json({ existing: true, turn: false });
|
|
return;
|
|
}
|
|
|
|
res.json({
|
|
existing: true,
|
|
turn: true,
|
|
name: foundWinner.name,
|
|
color: foundWinner.color
|
|
});
|
|
return;
|
|
});
|
|
|
|
router.route("/:id").post(async (req, res) => {
|
|
let id = req.params.id;
|
|
let wineName = req.body.wineName;
|
|
let foundWinner = await VirtualWinner.findOne({ id: id });
|
|
|
|
if (!foundWinner) {
|
|
res.json(false);
|
|
return;
|
|
}
|
|
|
|
if (foundWinner.timestamp_limit < new Date().getTime()) {
|
|
res.json({
|
|
success: false,
|
|
limit: true
|
|
});
|
|
return;
|
|
}
|
|
let date = new Date();
|
|
date.setHours(5, 0, 0, 0);
|
|
|
|
let prelotteryWine = await PreLotteryWine.findOne({ name: wineName });
|
|
|
|
if (!prelotteryWine) {
|
|
res.json({
|
|
success: false,
|
|
wine: true
|
|
});
|
|
}
|
|
|
|
let wonWine = await Wine.findOne({ name: prelotteryWine.name });
|
|
if (wonWine == undefined) {
|
|
let newWonWine = new Wine({
|
|
name: prelotteryWine.name,
|
|
vivinoLink: prelotteryWine.vivinoLink,
|
|
rating: prelotteryWine.rating,
|
|
occurences: 1,
|
|
image: prelotteryWine.image,
|
|
id: prelotteryWine.id
|
|
});
|
|
await newWonWine.save();
|
|
wonWine = newWonWine;
|
|
} else {
|
|
wonWine.occurences += 1;
|
|
wonWine.image = prelotteryWine.image;
|
|
wonWine.id = prelotteryWine.id;
|
|
await wonWine.save();
|
|
}
|
|
|
|
await prelotteryWine.delete();
|
|
|
|
const person = await Highscore.findOne({
|
|
name: foundWinner.name
|
|
});
|
|
|
|
if (person == undefined) {
|
|
let newPerson = new Highscore({
|
|
name: foundWinner.name,
|
|
wins: [
|
|
{
|
|
color: foundWinner.color,
|
|
date: date,
|
|
wine: wonWine
|
|
}
|
|
]
|
|
});
|
|
|
|
await newPerson.save();
|
|
} else {
|
|
person.wins.push({
|
|
color: foundWinner.color,
|
|
date: date,
|
|
wine: wonWine
|
|
});
|
|
person.markModified("wins");
|
|
await person.save();
|
|
}
|
|
|
|
await foundWinner.delete();
|
|
|
|
let prelotteryWine = await PreLotteryWine.find();
|
|
let nextWinner = await VirtualWinner.find().sort({ timestamp_drawn: 1 });
|
|
if (nextWinner.length > 1 && prelotteryWine.length > 1) {
|
|
Message.sendMessage(nextWinner[0]);
|
|
startTimeout(id);
|
|
} else if (nextWinner.length == 1 && prelotteryWine.length == 1) {
|
|
chooseForUser(nextWinner[0], prelotteryWine[0]);
|
|
}
|
|
|
|
res.json({
|
|
success: true
|
|
});
|
|
return;
|
|
});
|
|
|
|
async function chooseForUser(winner, prelotteryWine) {
|
|
let date = new Date();
|
|
date.setHours(5, 0, 0, 0);
|
|
let wonWine = await Wine.findOne({ name: prelotteryWine.name });
|
|
if (wonWine == undefined) {
|
|
let newWonWine = new Wine({
|
|
name: prelotteryWine.name,
|
|
vivinoLink: prelotteryWine.vivinoLink,
|
|
rating: prelotteryWine.rating,
|
|
occurences: 1,
|
|
image: prelotteryWine.image,
|
|
id: prelotteryWine.id
|
|
});
|
|
await newWonWine.save();
|
|
wonWine = newWonWine;
|
|
} else {
|
|
wonWine.occurences += 1;
|
|
wonWine.image = prelotteryWine.image;
|
|
wonWine.id = prelotteryWine.id;
|
|
await wonWine.save();
|
|
}
|
|
|
|
const person = await Highscore.findOne({
|
|
name: winner.name
|
|
});
|
|
|
|
if (person == undefined) {
|
|
let newPerson = new Highscore({
|
|
name: winner.name,
|
|
wins: [
|
|
{
|
|
color: winner.color,
|
|
date: date,
|
|
wine: wonWine
|
|
}
|
|
]
|
|
});
|
|
|
|
await newPerson.save();
|
|
} else {
|
|
person.wins.push({
|
|
color: winner.color,
|
|
date: date,
|
|
wine: wonWine
|
|
});
|
|
person.markModified("wins");
|
|
await person.save();
|
|
}
|
|
|
|
await prelotteryWine.delete();
|
|
Message.sendWonWineMessage(winner, prelotteryWine);
|
|
}
|
|
|
|
function startTimeout(id) {
|
|
console.log(`Starting timeout for user ${id}.`);
|
|
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.sendMessageTooLate(virtualWinner);
|
|
|
|
virtualWinner.timestamp_drawn = new Date().getTime();
|
|
virtualWinner.timestamp_limit = null;
|
|
virtualWinner.timestamp_sent = null;
|
|
|
|
await virtualWinner.save();
|
|
|
|
let prelotteryWine = await PreLotteryWine.find();
|
|
let nextWinner = await VirtualWinner.find().sort({ timestamp_drawn: 1 });
|
|
if (nextWinner.length == 1 && prelotteryWine.length == 1) {
|
|
chooseForUser(nextWinner[0], prelotteryWine[0]);
|
|
}
|
|
}, 600000);
|
|
}
|
|
|
|
module.exports = router;
|