diff --git a/app/services/line/send_on_line_service.rb b/app/services/line/send_on_line_service.rb index b0b6d828d..3c9d6cf17 100644 --- a/app/services/line/send_on_line_service.rb +++ b/app/services/line/send_on_line_service.rb @@ -44,10 +44,15 @@ class Line::SendOnLineService < Base::SendOnChannelService # Support only image and video for now, https://developers.line.biz/en/reference/messaging-api/#image-message next unless attachment.file_type == 'image' || attachment.file_type == 'video' + # Use file_url (permanent redirect-based URL) instead of download_url (signed URL that expires in 5 minutes). + # LINE mobile app lazy-loads images and may fetch them well after the message is sent. + original_url = attachment.file_url + preview_url = attachment.thumb_url.presence || original_url + { type: attachment.file_type, - originalContentUrl: attachment.download_url, - previewImageUrl: attachment.download_url + originalContentUrl: original_url, + previewImageUrl: preview_url } end end diff --git a/spec/services/line/send_on_line_service_spec.rb b/spec/services/line/send_on_line_service_spec.rb index a7520b8d8..4451a53b9 100644 --- a/spec/services/line/send_on_line_service_spec.rb +++ b/spec/services/line/send_on_line_service_spec.rb @@ -161,7 +161,9 @@ describe Line::SendOnLineService do it 'sends the message with text and attachments' do attachment = message.attachments.new(account_id: message.account_id, file_type: :image) attachment.file.attach(io: Rails.root.join('spec/assets/avatar.png').open, filename: 'avatar.png', content_type: 'image/png') - expected_url_regex = %r{rails/active_storage/disk/[a-zA-Z0-9=_\-+]+/avatar\.png} + attachment.save! + expected_original_url_regex = %r{rails/active_storage/blobs/redirect/[a-zA-Z0-9=_\-+]+/avatar\.png} + expected_preview_url_regex = %r{rails/active_storage/representations/redirect/[a-zA-Z0-9=_\-+]+/[a-zA-Z0-9=_\-+]+/avatar\.png} expect(line_client).to receive(:push_message).with( message.conversation.contact_inbox.source_id, @@ -169,8 +171,8 @@ describe Line::SendOnLineService do { type: 'text', text: message.content }, { type: 'image', - originalContentUrl: match(expected_url_regex), - previewImageUrl: match(expected_url_regex) + originalContentUrl: match(expected_original_url_regex), + previewImageUrl: match(expected_preview_url_regex) } ] ) @@ -181,16 +183,18 @@ describe Line::SendOnLineService do it 'sends the message with attachments only' do attachment = message.attachments.new(account_id: message.account_id, file_type: :image) attachment.file.attach(io: Rails.root.join('spec/assets/avatar.png').open, filename: 'avatar.png', content_type: 'image/png') + attachment.save! message.update!(content: nil) - expected_url_regex = %r{rails/active_storage/disk/[a-zA-Z0-9=_\-+]+/avatar\.png} + expected_original_url_regex = %r{rails/active_storage/blobs/redirect/[a-zA-Z0-9=_\-+]+/avatar\.png} + expected_preview_url_regex = %r{rails/active_storage/representations/redirect/[a-zA-Z0-9=_\-+]+/[a-zA-Z0-9=_\-+]+/avatar\.png} expect(line_client).to receive(:push_message).with( message.conversation.contact_inbox.source_id, [ { type: 'image', - originalContentUrl: match(expected_url_regex), - previewImageUrl: match(expected_url_regex) + originalContentUrl: match(expected_original_url_regex), + previewImageUrl: match(expected_preview_url_regex) } ] )