import Twilio from 'twilio' import GeneralUtils from '../general' import { logger } from '../logger' import * as UserController from '../../controllers/user' import { prismaClient as prisma } from '../../prismaClient' import { MessageInstance } from 'twilio/lib/rest/api/v2010/account/message' import { TwilioSendInput } from './types' import config from '../../config' import { getFormattedNumber } from './getFormattedNumber' const twilioClient = Twilio(process.env.TWILIO_SID, process.env.TWILIO_AUTH_TOKEN) export const sendSMS = async ({ to, body, mediaUrl, itemId, from = process.env.TWILIO_PHONE_NUMBER_NOTIFICATION, }: TwilioSendInput): Promise => { if (!to) { throw new Error('sendSMS: missing TO') } if (process.env.SEND_SMS !== 'true') { throw new Error('SEND_SMS is false') } if (process.env.NODE_ENV === 'development') { logger.info(`CAREFUL! SENDING SMS EVEN IF WE'RE IN DEV`) } try { const result = await getFormattedNumber(to) if (!result) { throw new Error("Can't get phone number result to send SMS") } return twilioClient.messages.create({ body: GeneralUtils.truncate({ str: body, maxChars: 1500 }), // Real max is 1600 but just to be sure with emojis and etc... to: result.phoneNumber, from, mediaUrl, ...(!config.hostNameHttps.includes('localhost') && { statusCallback: `${config.hostNameHttps}/api/twilio/smsStatus/${itemId}`, }), }) } catch (error) { logger.error(error) // User cant receive any SMS UserController.querySingleUser({ phoneNumber: to }) .then((user) => { if (user) { return prisma.user.update({ where: { id: user.id }, data: { cantDeliverSMS: true } }) } }) .catch(logger.error) throw error } }