From 4f054a0437ac4c85f865b7525dba1694b5f7d219 Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Sun, 6 Sep 2020 14:09:10 +0200 Subject: [PATCH] Message uses node's https insteadof requests. Messages re-written to use nodes built in https over external requests package. Also updated message functions to always return promises and have clearer names for what their purpose is. --- api/message.js | 129 ++++++++++++++++++++++++++++--------------------- 1 file changed, 73 insertions(+), 56 deletions(-) diff --git a/api/message.js b/api/message.js index e8a1eec..a763a7b 100644 --- a/api/message.js +++ b/api/message.js @@ -1,92 +1,109 @@ -const request = require("request"); +const https = require("https"); const path = require("path"); const config = require(path.join(__dirname + "/../config/defaults/lottery")); -async function sendMessage(winnerObject) { +async function sendWineSelectMessage(winnerObject) { winnerObject.timestamp_sent = new Date().getTime(); winnerObject.timestamp_limit = new Date().getTime() * 600000; await winnerObject.save(); let url = new URL(`/#/winner/${winnerObject.id}`, "https://lottis.vin"); - await sendMessageToUser( + return 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. ${url.href}. (Hvis den siden kommer opp som tom må du prøve å refreshe siden noen ganger.)` - ); - - return true; + ) } -async function sendWonWineMessage(winnerObject, wineObject) { - console.log( - `User ${winnerObject.id} is only one left, chosing wine for him/her.` - ); +async function sendLastWinnerMessage(winnerObject, wineObject) { + console.log(`User ${winnerObject.id} is only one left, chosing wine for him/her.`); winnerObject.timestamp_sent = new Date().getTime(); winnerObject.timestamp_limit = new Date().getTime(); await winnerObject.save(); - await sendMessageToUser( + return sendMessageToUser( winnerObject.phoneNumber, `Gratulerer som heldig vinner av vinlotteriet ${winnerObject.name}! Du har vunnet vinen ${wineObject.name}, og vil få nærmere info om hvordan/hvor du kan hente vinen snarest. Ha en ellers fin helg!` ); - - return true; } -async function sendMessageTooLate(winnerObject) { - await sendMessageToUser( +async function sendWineSelectMessageTooLate(winnerObject) { + return 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) { - try { - request.post( - { - url: `https://gatewayapi.com/rest/mtsms?token=${config.gatewayToken}`, - json: true, - body: { - sender: "Vinlottis", - message: message, - recipients: [{ msisdn: `47${phoneNumber}` }] - } - }, - function(err, r, body) { - console.log(err ? err : body); - if(err) { - console.log(phoneNumber, message); - } - } - ); - } catch(e) { - console.log(phoneNumber, message); - } + console.log(`Attempting to send message to ${ phoneNumber }.`) + + const body = { + sender: "Vinlottis", + message: message, + recipients: [{ msisdn: `47${ phoneNumber }`}] + }; + + return gatewayRequest(body); } -async function sendUpdate(winners) { + +async function sendInitialMessageToWinners(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.gatewayToken}`, - 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); - } - ); + + const body = { + sender: "Vinlottis", + message: + "Gratulerer som vinner av vinlottisen! Du vil snart få en SMS med oppdatering om hvordan gangen går!", + recipients: numbers + } + + return gatewayRequest(body); } -module.exports.sendUpdate = sendUpdate; -module.exports.sendMessage = sendMessage; -module.exports.sendMessageTooLate = sendMessageTooLate; -module.exports.sendWonWineMessage = sendWonWineMessage; +async function gatewayRequest(body) { + return new Promise((resolve, reject) => { + const options = { + hostname: "gatewayapi.com", + post: 443, + path: `/rest/mtsms?token=${ config.gatewayToken }`, + method: "POST", + headers: { + "Content-Type": "application/json" + } + } + + const req = https.request(options, (res) => { + console.log(`statusCode: ${ res.statusCode }`); + console.log(`statusMessage: ${ res.statusMessage }`); + + res.setEncoding('utf8'); + + if (res.statusCode == 200) { + res.on("data", (d) => resolve(JSON.parse(d))); + } else { + res.on("data", (data) => { + data = JSON.parse(data); + return reject('Gateway error: ' + data['message'] || data) + }); + } + }) + + req.on("error", (error) => { + console.error(`Error from sms service: ${ error }`); + reject(`Error from sms service: ${ error }`); + }) + + req.write(JSON.stringify(body)); + req.end(); + }); +} + +module.exports = { + sendWineSelectMessage, + sendLastWinnerMessage, + sendWineSelectMessageTooLate, + sendInitialMessageToWinners +}