feat: Add attachment support for Signal and WhatsApp channels

- Signal: Use base64Attachments field in signal-cli-rest-api
- WhatsApp: Implement Baileys attachment sending for images, videos, audio, and documents
- Both channels retrieve attachments from Zammad Store model
- Support multiple attachments per message
This commit is contained in:
Darren Clarke 2025-08-21 10:58:33 +02:00
parent 9139c8e8de
commit d2a3c71bcd
8 changed files with 255 additions and 85 deletions

View file

@ -334,6 +334,20 @@ class CdrSignal
options = {}
options[:conversationId] = ticket.number if ticket
# Get attachments from the article
attachments = Store.list(object: 'Ticket::Article', o_id: article.id)
if attachments.any?
attachment_data = attachments.map do |attachment|
{
data: Base64.strict_encode64(attachment.content),
filename: attachment.filename,
mime_type: attachment.preferences['Mime-Type'] || attachment.preferences['Content-Type'] || 'application/octet-stream'
}
end
options[:attachments] = attachment_data
Rails.logger.debug { "Sending #{attachment_data.length} attachment(s) with message" }
end
@api.send_message(recipient, article[:body], options)
end
end

View file

@ -41,6 +41,10 @@ class CdrSignalApi
params[:conversationId] = options[:conversationId]
options.delete(:conversationId)
end
if options[:attachments]
params[:attachments] = options[:attachments]
options.delete(:attachments)
end
post('send', params.merge(parse_hash(options)))
end
end

View file

@ -323,6 +323,22 @@ class CdrWhatsapp
Rails.logger.debug { "Sending to recipient: '#{recipient}'" }
@api.send_message(recipient, article[:body])
options = {}
# Get attachments from the article
attachments = Store.list(object: 'Ticket::Article', o_id: article.id)
if attachments.any?
attachment_data = attachments.map do |attachment|
{
data: Base64.strict_encode64(attachment.content),
filename: attachment.filename,
mime_type: attachment.preferences['Mime-Type'] || attachment.preferences['Content-Type'] || 'application/octet-stream'
}
end
options[:attachments] = attachment_data
Rails.logger.debug { "Sending #{attachment_data.length} attachment(s) with message" }
end
@api.send_message(recipient, article[:body], options)
end
end

View file

@ -35,6 +35,9 @@ class CdrWhatsappApi
end
def send_message(recipient, text, options = {})
post('send', { to: recipient.to_s, message: text }.merge(parse_hash(options)))
params = { to: recipient.to_s, message: text }
params[:attachments] = options[:attachments] if options[:attachments]
options.delete(:attachments) if options[:attachments]
post('send', params.merge(parse_hash(options)))
end
end