From 16637c03c654bd93baa083e365f42ad1b4242b48 Mon Sep 17 00:00:00 2001 From: gabrieljablonski Date: Thu, 8 May 2025 22:23:54 -0300 Subject: [PATCH] feat: add support for file mimetypes and update attachment filename generation --- .../incoming_message_baileys_service.rb | 18 +++++++++++++++++- .../incoming_message_baileys_service_spec.rb | 16 ++++++++-------- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/app/services/whatsapp/incoming_message_baileys_service.rb b/app/services/whatsapp/incoming_message_baileys_service.rb index a39b59591..b0eb2879f 100644 --- a/app/services/whatsapp/incoming_message_baileys_service.rb +++ b/app/services/whatsapp/incoming_message_baileys_service.rb @@ -227,7 +227,8 @@ class Whatsapp::IncomingMessageBaileysService < Whatsapp::IncomingMessageBaseSer filename = @raw_message.dig(:message, :documentMessage, :fileName) return filename if filename.present? - "#{file_content_type}_#{message_id}_#{Time.current.strftime('%Y%m%d')}" + ext = ".#{message_mimetype.split(';').first.split('/').last}" if message_mimetype.present? + "#{file_content_type}_#{message_id}_#{Time.current.strftime('%Y%m%d')}#{ext}" end def message_content @@ -247,6 +248,21 @@ class Whatsapp::IncomingMessageBaileysService < Whatsapp::IncomingMessageBaseSer @raw_message[:key][:id] end + def message_mimetype + case message_type + when 'image' + @raw_message.dig(:message, :imageMessage, :mimetype) + when 'sticker' + @raw_message.dig(:message, :stickerMessage, :mimetype) + when 'video' + @raw_message.dig(:message, :videoMessage, :mimetype) + when 'audio' + @raw_message.dig(:message, :audioMessage, :mimetype) + when 'file' + @raw_message.dig(:message, :documentMessage, :mimetype) + end + end + def message_under_process? key = format(Redis::RedisKeys::MESSAGE_SOURCE_KEY, id: message_id) Redis::Alfred.get(key) diff --git a/spec/services/whatsapp/incoming_message_baileys_service_spec.rb b/spec/services/whatsapp/incoming_message_baileys_service_spec.rb index a54fed37f..ed59fc5a7 100644 --- a/spec/services/whatsapp/incoming_message_baileys_service_spec.rb +++ b/spec/services/whatsapp/incoming_message_baileys_service_spec.rb @@ -445,7 +445,7 @@ describe Whatsapp::IncomingMessageBaileysService do let(:raw_message) do { key: { id: 'msg_123', remoteJid: '5511912345678@s.whatsapp.net', fromMe: false }, - message: { imageMessage: { caption: 'Hello from Baileys' } }, + message: { imageMessage: { caption: 'Hello from Baileys', mimetype: 'image/png' } }, pushName: 'John Doe' } end @@ -487,7 +487,7 @@ describe Whatsapp::IncomingMessageBaileysService do expect(attachment.file).to be_present expect(attachment.file_type).to eq('image') - expect(attachment.file.filename.to_s).to eq("image_msg_123_#{Time.current.strftime('%Y%m%d')}") + expect(attachment.file.filename.to_s).to eq("image_msg_123_#{Time.current.strftime('%Y%m%d')}.png") expect(attachment.file.content_type).to eq('image/png') end end @@ -496,7 +496,7 @@ describe Whatsapp::IncomingMessageBaileysService do let(:raw_message) do { key: { id: 'msg_123', remoteJid: '5511912345678@s.whatsapp.net', fromMe: false }, - message: { videoMessage: { caption: 'Hello from Baileys' } }, + message: { videoMessage: { caption: 'Hello from Baileys', mimetype: 'video/mp4' } }, pushName: 'John Doe' } end @@ -538,7 +538,7 @@ describe Whatsapp::IncomingMessageBaileysService do expect(attachment.file).to be_present expect(attachment.file_type).to eq('video') - expect(attachment.file.filename.to_s).to eq("video_msg_123_#{Time.current.strftime('%Y%m%d')}") + expect(attachment.file.filename.to_s).to eq("video_msg_123_#{Time.current.strftime('%Y%m%d')}.mp4") expect(attachment.file.content_type).to eq('video/mp4') end end @@ -588,7 +588,7 @@ describe Whatsapp::IncomingMessageBaileysService do let(:raw_message) do { key: { id: 'msg_123', remoteJid: '5511912345678@s.whatsapp.net', fromMe: false }, - message: { audioMessage: {} }, + message: { audioMessage: { mimetype: 'audio/opus' } }, pushName: 'John Doe' } end @@ -621,7 +621,7 @@ describe Whatsapp::IncomingMessageBaileysService do expect(attachment.file_type).to eq('audio') expect(attachment.file).to be_present - expect(attachment.file.filename.to_s).to eq("audio_msg_123_#{Time.current.strftime('%Y%m%d')}") + expect(attachment.file.filename.to_s).to eq("audio_msg_123_#{Time.current.strftime('%Y%m%d')}.opus") expect(attachment.file.content_type).to eq('audio/opus') end end @@ -630,7 +630,7 @@ describe Whatsapp::IncomingMessageBaileysService do let(:raw_message) do { key: { id: 'msg_123', remoteJid: '5511912345678@s.whatsapp.net', fromMe: false }, - message: { stickerMessage: {} }, + message: { stickerMessage: { mimetype: 'image/png' } }, pushName: 'John Doe' } end @@ -663,7 +663,7 @@ describe Whatsapp::IncomingMessageBaileysService do expect(attachment.file_type).to eq('image') expect(attachment.file).to be_present - expect(attachment.file.filename.to_s).to eq("image_msg_123_#{Time.current.strftime('%Y%m%d')}") + expect(attachment.file.filename.to_s).to eq("image_msg_123_#{Time.current.strftime('%Y%m%d')}.png") expect(attachment.file.content_type).to eq('image/png') end end