diff --git a/server/graphql-client/queries.js b/server/graphql-client/queries.js index 8e7a5707c..61294e008 100644 --- a/server/graphql-client/queries.js +++ b/server/graphql-client/queries.js @@ -20,6 +20,28 @@ mutation UNARCHIVE_CONVERSATION($id: uuid!) { } `; +exports.RECEIVE_MESSAGE = ` +mutation RECEIVE_MESSAGE($msg: [messages_insert_input!]!) { + + insert_messages(objects: $msg) { + returning { + conversation { + id + archived + bodyshop { + associations(where: {active: {_eq: true}}) { + user { + fcmtokens + } + } + } + } + } + } +} + + `; + exports.INSERT_MESSAGE = ` mutation INSERT_MESSAGE($msg: [messages_insert_input!]!, $conversationid: uuid!) { update_conversations_by_pk(pk_columns: {id: $conversationid}, _set: {archived: false}) { diff --git a/server/sms/receive.js b/server/sms/receive.js index 0c0bc8e27..d05ae725d 100644 --- a/server/sms/receive.js +++ b/server/sms/receive.js @@ -11,7 +11,7 @@ const queries = require("../graphql-client/queries"); const { phone } = require("phone"); const admin = require("../firebase/firebase-handler").admin; const logger = require("../utils/logger"); -exports.receive = (req, res) => { +exports.receive = async (req, res) => { //Perform request validation logger.log("sms-inbound", "DEBUG", "api", null, { @@ -36,114 +36,80 @@ exports.receive = (req, res) => { res.status(400); res.json({ success: false, error: "Malformed Request" }); } else { - client - .request(queries.FIND_BODYSHOP_BY_MESSAGING_SERVICE_SID, { - mssid: req.body.MessagingServiceSid, - phone: phone(req.body.From).phoneNumber, - }) - .then((response) => { - let newMessage = { - msid: req.body.SmsMessageSid, - text: req.body.Body, - image: !!req.body.MediaUrl0, - image_path: generateMediaArray(req.body), - }; - if (response.bodyshops[0]) { - //Found a bodyshop - should always happen. - if (response.bodyshops[0].conversations.length === 0) { - //No conversation Found, create one. - console.log("[SMS Receive] No conversation found. Creating one."); - newMessage.conversation = { - data: { - bodyshopid: response.bodyshops[0].id, - phone_num: phone(req.body.From).phoneNumber, - }, - }; - } else if (response.bodyshops[0].conversations.length === 1) { - //Just add it to the conversation - console.log("[SMS Receive] Conversation found. Added ID."); - newMessage.conversationid = - response.bodyshops[0].conversations[0].id; - } else { - //We should never get here. - logger.log("sms-inbound-error", "ERROR", "api", null, { - msid: req.body.SmsMessageSid, - text: req.body.Body, - image: !!req.body.MediaUrl0, - image_path: generateMediaArray(req.body), - messagingServiceSid: req.body.MessagingServiceSid, - type: "duplicate-phone", + try { + const response = await client.request( + queries.FIND_BODYSHOP_BY_MESSAGING_SERVICE_SID, + { + mssid: req.body.MessagingServiceSid, + phone: phone(req.body.From).phoneNumber, + } + ); + + let newMessage = { + msid: req.body.SmsMessageSid, + text: req.body.Body, + image: !!req.body.MediaUrl0, + image_path: generateMediaArray(req.body), + }; + if (response.bodyshops[0]) { + //Found a bodyshop - should always happen. + if (response.bodyshops[0].conversations.length === 0) { + //No conversation Found, create one. + console.log("[SMS Receive] No conversation found. Creating one."); + newMessage.conversation = { + data: { + bodyshopid: response.bodyshops[0].id, + phone_num: phone(req.body.From).phoneNumber, + }, + }; + } else if (response.bodyshops[0].conversations.length === 1) { + //Just add it to the conversation + console.log("[SMS Receive] Conversation found. Added ID."); + newMessage.conversationid = response.bodyshops[0].conversations[0].id; + } else { + //We should never get here. + logger.log("sms-inbound-error", "ERROR", "api", null, { + msid: req.body.SmsMessageSid, + text: req.body.Body, + image: !!req.body.MediaUrl0, + image_path: generateMediaArray(req.body), + messagingServiceSid: req.body.MessagingServiceSid, + type: "duplicate-phone", + }); + } + try { + const r2 = await client.request(queries.RECEIVE_MESSAGE, { + msg: newMessage, + }); + if (response.bodyshops[0].conversations[0]) { + const r3 = await client.request(queries.INSERT_MESSAGE, { + id: + response.bodyshops[0].conversations[0] && + response.bodyshops[0].conversations[0].id, }); } - client - .request(queries.INSERT_MESSAGE, { - msg: newMessage, - conversationid: response.bodyshops[0].conversations[0].id, - }) - .then((r2) => { - logger.log("sms-inbound-success", "DEBUG", "api", null, { - newMessage, - }); - res.status(200).send(""); + logger.log("sms-inbound-success", "DEBUG", "api", null, { + newMessage, + }); + res.status(200).send(""); + } catch (e2) { + logger.log("sms-inbound-error", "ERROR", "api", null, { + msid: req.body.SmsMessageSid, + text: req.body.Body, + image: !!req.body.MediaUrl0, + image_path: generateMediaArray(req.body), + messagingServiceSid: req.body.MessagingServiceSid, + error: e2, + }); - const arrayOfAllUserFcmTokens = - r2.insert_messages.returning[0].conversation.bodyshop.associations.map( - (a) => a.user.fcmtokens - ); - const allTokens = []; - arrayOfAllUserFcmTokens.map((i) => - Object.keys(i).map((k) => allTokens.push(k)) - ); - const uniqueTokens = [...new Set(allTokens)]; - var message = { - notification: { - title: `SMS - ${phone(req.body.From).phoneNumber}`, - body: req.body.Body, - click_action: "TEST CLICK ACTION", - }, - data: { - jobid: "1234", - title: `New SMS From ${phone(req.body.From).phoneNumber}`, - body: req.body.Body, - }, - tokens: uniqueTokens, - }; - - // Send a message to the device corresponding to the provided - // registration token. - // admin - // .messaging() - // .sendMulticast(message) - // .then((response) => { - // // Response is a message ID string. - // console.log( - // "[SMS Receive] Successfully sent FCM Broadcast.:" - // //JSON.stringify(response) - // ); - // }) - // .catch((error) => { - // console.log("Error sending message:", error); - // }); - }) - .catch((e2) => { - logger.log("sms-inbound-error", "ERROR", "api", null, { - msid: req.body.SmsMessageSid, - text: req.body.Body, - image: !!req.body.MediaUrl0, - image_path: generateMediaArray(req.body), - messagingServiceSid: req.body.MessagingServiceSid, - error: e2, - }); - - res.sendStatus(500).json(e2); - }); + res.sendStatus(500).json(e2); } - }) - .catch((e1) => { - console.log("e1", e1); - res.sendStatus(500).json(e1); - }); + } + } catch (e1) { + console.log("e1", e1); + res.sendStatus(500).json(e1); + } } };