diff --git a/apps/meteor/app/livechat/imports/server/rest/sms.ts b/apps/meteor/app/livechat/imports/server/rest/sms.ts index b271194c1f05c..c606a17c3a9e1 100644 --- a/apps/meteor/app/livechat/imports/server/rest/sms.ts +++ b/apps/meteor/app/livechat/imports/server/rest/sms.ts @@ -33,13 +33,15 @@ const getUploadFile = async (details: Omit, fileUrl: string) => throw new Meteor.Error('error-invalid-url', 'Invalid URL'); } - const response = await fetch(fileUrl, { redirect: 'error' }); + // Follow redirects to support Twilio media URLs that redirect to actual media location + const response = await fetch(fileUrl, { redirect: 'follow' }); const content = Buffer.from(await response.arrayBuffer()); const contentSize = content.length; if (response.status !== 200 || contentSize === 0) { + logger.warn(`Failed to fetch file from ${fileUrl}: status ${response.status}, size ${contentSize}`); throw new Meteor.Error('error-invalid-file-uploaded', 'Invalid file uploaded'); } diff --git a/apps/meteor/server/services/omnichannel-integrations/providers/twilio.ts b/apps/meteor/server/services/omnichannel-integrations/providers/twilio.ts index 26b6dbaea1cf9..bca2ffd69914e 100644 --- a/apps/meteor/server/services/omnichannel-integrations/providers/twilio.ts +++ b/apps/meteor/server/services/omnichannel-integrations/providers/twilio.ts @@ -99,6 +99,16 @@ export class Twilio implements ISMSProvider { returnData.media.push(media); } + // Append media URLs to the message body for better visibility + if (returnData.media.length > 0) { + const links = returnData.media + .map((media) => media.url) + .filter((url) => !!url) // skip empty URLs + .join('\n'); + + returnData.body = [returnData.body, links].filter(Boolean).join('\n'); + } + return returnData; }