Add sms capabilities, and online-fixing of everything
This commit is contained in:
70
api/message.js
Normal file
70
api/message.js
Normal file
@@ -0,0 +1,70 @@
|
||||
const request = require("request");
|
||||
const path = require("path");
|
||||
const config = require(path.join(__dirname + "/../config/defaults/lottery"));
|
||||
|
||||
async function sendMessage(winnerObject) {
|
||||
console.log("sent message to ", winnerObject);
|
||||
winnerObject.timestamp_sent = new Date().getTime();
|
||||
winnerObject.timestamp_limit = new Date().getTime() * (600000 * 10000);
|
||||
await winnerObject.save();
|
||||
|
||||
await sendMessageToUser(
|
||||
winnerObject.phoneNumber,
|
||||
`Gratulerer som heldig vinner av vinlotteriet ${winnerObject.name}! Her er linken for å velge hva slags vin du vil ha, du har 10 minutter på å velge ut noe før du blir lagt bakerst i køen. /#/winner/${winnerObject.id}`
|
||||
);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
async function sendMessageTooLate(winnerObject) {
|
||||
await sendMessageToUser(
|
||||
winnerObject.phoneNumber,
|
||||
`Hei ${winnerObject.name}, du har dessverre brukt mer enn 10 minutter på å velge premie og blir derfor puttet bakerst i køen. Du vil få en ny SMS når det er din tur igjen.`
|
||||
);
|
||||
}
|
||||
|
||||
async function sendMessageToUser(phoneNumber, message) {
|
||||
console.log("num", phoneNumber);
|
||||
console.log("message", message);
|
||||
|
||||
request.post(
|
||||
{
|
||||
url: `https://gatewayapi.com/rest/mtsms?token=${config.token}`,
|
||||
json: true,
|
||||
body: {
|
||||
sender: "Vinlottis",
|
||||
message: message,
|
||||
recipients: [{ msisdn: `47${phoneNumber}` }]
|
||||
}
|
||||
},
|
||||
function(err, r, body) {
|
||||
console.log(err ? err : body);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
async function sendUpdate(winners) {
|
||||
let numbers = [];
|
||||
for (let i = 0; i < winners.length; i++) {
|
||||
numbers.push({ msisdn: `47${winners[i].phoneNumber}` });
|
||||
}
|
||||
request.post(
|
||||
{
|
||||
url: `https://gatewayapi.com/rest/mtsms?token=${config.token}`,
|
||||
json: true,
|
||||
body: {
|
||||
sender: "Vinlottis",
|
||||
message:
|
||||
"Gratulerer som vinner av vinlottisen! Du vil snart få en SMS med oppdatering om hvordan gangen går!",
|
||||
recipients: numbers
|
||||
}
|
||||
},
|
||||
function(err, r, body) {
|
||||
console.log(err ? err : body);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
module.exports.sendUpdate = sendUpdate;
|
||||
module.exports.sendMessage = sendMessage;
|
||||
module.exports.sendMessageTooLate = sendMessageTooLate;
|
||||
@@ -1,6 +1,7 @@
|
||||
const express = require("express");
|
||||
const path = require("path");
|
||||
const router = express.Router();
|
||||
const crypto = require("crypto");
|
||||
const mongoose = require("mongoose");
|
||||
mongoose.connect("mongodb://localhost:27017/vinlottis", {
|
||||
useNewUrlParser: true
|
||||
@@ -9,11 +10,13 @@ let io;
|
||||
const mustBeAuthenticated = require(path.join(
|
||||
__dirname + "/../middleware/mustBeAuthenticated"
|
||||
));
|
||||
const config = require(path.join(__dirname + "/../config/defaults/lottery"));
|
||||
|
||||
const Attendee = require(path.join(__dirname + "/../schemas/Attendee"));
|
||||
const VirtualWinner = require(path.join(
|
||||
__dirname + "/../schemas/VirtualWinner"
|
||||
));
|
||||
const Message = require(path.join(__dirname + "/../api/message"));
|
||||
|
||||
router.use((req, res, next) => {
|
||||
next();
|
||||
@@ -133,7 +136,9 @@ router.route("/winner").get(mustBeAuthenticated, async (req, res) => {
|
||||
red: winner.red,
|
||||
blue: winner.blue,
|
||||
green: winner.green,
|
||||
yellow: winner.yellow
|
||||
yellow: winner.yellow,
|
||||
id: sha512(winner.phoneNumber, genRandomString(10)),
|
||||
timestamp_drawn: new Date().getTime()
|
||||
});
|
||||
|
||||
await Attendee.update(
|
||||
@@ -145,6 +150,56 @@ router.route("/winner").get(mustBeAuthenticated, async (req, res) => {
|
||||
res.json(winner);
|
||||
});
|
||||
|
||||
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;
|
||||
};
|
||||
|
||||
router.route("/finish").get(mustBeAuthenticated, async (req, res) => {
|
||||
if (!config.token) {
|
||||
res.json(false);
|
||||
return;
|
||||
}
|
||||
let winners = await VirtualWinner.find({ timestamp_sent: undefined }).sort({
|
||||
timestamp_drawn: 1
|
||||
});
|
||||
|
||||
if (winners.length == 0) {
|
||||
res.json(false);
|
||||
return;
|
||||
}
|
||||
|
||||
let firstWinner = winners[0];
|
||||
messageSent = false;
|
||||
try {
|
||||
let messageSent = await Message.sendMessage(firstWinner);
|
||||
Message.sendUpdate(winners.slice(1));
|
||||
if (!messageSent) {
|
||||
res.json(false);
|
||||
return;
|
||||
}
|
||||
} catch (e) {
|
||||
res.json(false);
|
||||
return;
|
||||
}
|
||||
|
||||
firstWinner.timestamp_sent = new Date().getTime();
|
||||
firstWinner.timestamp_limit = new Date().getTime() + 600000;
|
||||
|
||||
await firstWinner.save();
|
||||
res.json(true);
|
||||
return;
|
||||
});
|
||||
|
||||
router.route("/attendees").get(async (req, res) => {
|
||||
let attendees = await Attendee.find();
|
||||
let attendeesRedacted = [];
|
||||
|
||||
173
api/virtualRegistration.js
Normal file
173
api/virtualRegistration.js
Normal file
@@ -0,0 +1,173 @@
|
||||
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;
|
||||
Reference in New Issue
Block a user