import { WebhookHandler } from "@webuildbots/webuildbots-sdk/lib/util/webhook-client"; import { ResponseBuilder, WebhookRequest, BlockPointer, } from "@webuildbots/webuildbots-sdk"; import { FunctionFailureParams } from "@webuildbots/webuildbots-sdk/lib/interfaces/webhook"; import TwilioService from "../services/twilio.service"; enum TwilioBlocks { CREDENTIALS_NOT_SET = "no-twilio-credentials-set", MESSAGE_NOT_SET = "no-message-set", PHONE_NUMBER_NOT_SET = "no-to-number-set", FROM_NOT_SET = "no-from-number-set", } const checkArgs = ( param: string, blockId: string ): FunctionFailureParams | null => { if (!param) { const errorBlock: BlockPointer = { id: blockId }; return { errorBP: errorBlock, resetForm: true, tryAgain: false, }; } }; export const sendSMS: WebhookHandler = async ( webhookReq: WebhookRequest, responseBuilder: ResponseBuilder ): Promise => { const { args, formValue } = webhookReq; // eslint-disable-next-line prefer-const const { to_property, twilioAccountSid, twilioAuthId, from, to, message, unset, } = args; if (unset == null) { unset = true; } let phoneNumberFormValue = webhookReq.formValue[to_property]; if (phoneNumberFormValue) { phoneNumberFormValue = phoneNumberFormValue.value; } else { phoneNumberFormValue = to; } const messagePropertyFP = checkArgs( webhookReq.args?.message, TwilioBlocks.MESSAGE_NOT_SET ); const fromPropertyFP = checkArgs( webhookReq.args?.from, TwilioBlocks.FROM_NOT_SET ); const accountSidPropertyFP = checkArgs( webhookReq.args?.twilioAccountSid, TwilioBlocks.CREDENTIALS_NOT_SET ); const authIdPropertyFP = checkArgs( webhookReq.args?.twilioAuthId, TwilioBlocks.CREDENTIALS_NOT_SET ); if (messagePropertyFP) { responseBuilder.functionFailure(messagePropertyFP); } else if (fromPropertyFP) { responseBuilder.functionFailure(fromPropertyFP); } else if (accountSidPropertyFP || authIdPropertyFP) { responseBuilder.functionFailure(accountSidPropertyFP || authIdPropertyFP); } else if (!phoneNumberFormValue) { // no number to send things to. responseBuilder.functionFailure({ errorBP: { id: TwilioBlocks.PHONE_NUMBER_NOT_SET }, resetForm: true, tryAgain: false, }); } else { const twilioService = new TwilioService(twilioAccountSid, twilioAuthId); const processedFormValues = {}; for (const [key, valueObject] of Object.entries(formValue)) { if (valueObject?.value) { processedFormValues[key] = valueObject.value; } else if (valueObject) { processedFormValues[key] = valueObject; } } try { const formattedMessage = replaceParameters(message, { ...args, ...processedFormValues, ...(webhookReq.user.session as any).variables, }); twilioService.sendSMS(formattedMessage, from, phoneNumberFormValue); } catch (e) { responseBuilder.functionFailure({ errorBP: { id: webhookReq.args?.errorBlock }, resetForm: true, tryAgain: false, }); return; } if (unset) { responseBuilder .pushBlockPointer({ id: webhookReq.args?.confirmationBlock }) .unsetFunctionForm(); } else { responseBuilder.pushBlockPointer({ id: webhookReq.args?.confirmationBlock, }); } } }; const replaceParameters = (message: string, obj): string => { const find = Object.keys(obj); for (let i = 0; i < find.length; i++) { const replace = obj[find[i]]; message = message.replace("%%" + find[i] + "%%", replace); } return message; };