Files
vinlottis/api/virtualRegistration.js
2020-04-04 01:05:52 +02:00

174 lines
3.8 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 config = require(path.join(__dirname + "/../config/defaults/push"));
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"
));
const lotteryConfig = require(path.join(
__dirname + "/../config/defaults/lottery"
));
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();
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 nextWinner = await VirtualWinner.find().sort({ timestamp_drawn: 1 });
if (nextWinner.length > 0) {
Message.sendMessage(nextWinner[0]);
}
startTimeout(id);
res.json({
success: true
});
return;
});
function startTimeout(id) {
setTimeout(async () => {
let virtualWinner = await VirtualWinner.findOne({ id: id });
if (!virtualWinner) {
return;
}
Message.sendMessageTooLate(virtualWinner);
virtualWinner.timestamp_drawn;
virtualWinner.timestamp_limit = null;
virtualWinner.timestamp_sent = null;
await virtualWinner.save();
}, 600000);
}
module.exports = router;