## Summary Preserves the original filename provided in the WhatsApp Cloud attachment payload when downloading media files. ## Problem Files containing accented or special characters could be saved with malformed names or incorrect extensions due to relying on remote download metadata. ## Changes Made - Uses attachment_payload[:filename] when present - Creates a tempfile using the original filename and extension - Preserves content type metadata - Falls back to existing behavior when no filename is provided ## Notes This should improve attachment downloads for filenames containing accented characters. Related to #10973 --------- Co-authored-by: Rorrick Smith <rorrick@bulksms.com> Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com> Co-authored-by: Muhsin <12408980+muhsin-k@users.noreply.github.com> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
30 lines
1.2 KiB
Ruby
30 lines
1.2 KiB
Ruby
# https://docs.360dialog.com/whatsapp-api/whatsapp-api/media
|
|
# https://developers.facebook.com/docs/whatsapp/api/media/
|
|
|
|
class Whatsapp::IncomingMessageWhatsappCloudService < Whatsapp::IncomingMessageBaseService
|
|
private
|
|
|
|
def processed_params
|
|
@processed_params ||= params[:entry].try(:first).try(:[], 'changes').try(:first).try(:[], 'value')
|
|
end
|
|
|
|
def download_attachment_file(attachment_payload)
|
|
url_response = HTTParty.get(
|
|
inbox.channel.media_url(attachment_payload[:id]),
|
|
headers: inbox.channel.api_headers
|
|
)
|
|
|
|
# This url response will be failure if the access token has expired.
|
|
inbox.channel.authorization_error! if url_response.unauthorized?
|
|
|
|
return unless url_response.success?
|
|
|
|
downloaded_file = Down.download(url_response.parsed_response['url'], headers: inbox.channel.api_headers)
|
|
# WhatsApp Cloud sends the original filename in the payload; preserve it so accented
|
|
# names keep their correct extension instead of relying on the mangled remote metadata.
|
|
filename = attachment_payload[:filename]
|
|
downloaded_file.define_singleton_method(:original_filename) { filename } if filename.present?
|
|
downloaded_file
|
|
end
|
|
end
|