lib/whatsapp/retry/media.rb
# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
class Whatsapp::Retry::Media
attr_reader :article, :channel
def initialize(article:)
@article = article
raise ArticleInvalidError if media_id.blank?
@channel = find_channel!
end
def process
download_media
update_article
end
private
def update_article
article.preferences['whatsapp'].delete('media_error')
article.save!
end
def media_id
@media_id ||= article.preferences&.dig('whatsapp', 'media_id')
end
def find_channel!
channel_id = article.ticket.preferences&.dig('channel_id')
raise ArticleInvalidError if channel_id.nil?
Channel.find_by(id: channel_id).tap do |channel|
if channel.nil? || channel.area != 'WhatsApp::Business' || !channel.active
raise ArticleInvalidError
end
end
end
def download_media
data, filename, mime_type = attachment
Store.create!(
object: 'Ticket::Article',
o_id: article.id,
data: data,
filename: filename,
preferences: {
'Mime-Type' => mime_type,
},
)
end
def attachment
media = Whatsapp::Incoming::Media.new(access_token: channel.options[:access_token])
data, mime_type = media.download(media_id: media_id)
filename = article.preferences.dig('whatsapp', 'filename').presence || "#{article.ticket.number}-#{media_id}.#{Whatsapp.file_suffix(mime_type:)}"
[data, filename, mime_type]
end
class ArticleInvalidError < StandardError
attr_reader :reason
def initialize(reason = __('The given article is not a media article.'))
@reason = reason
message = __('Retrying to download the sent media via WhatsApp failed.')
message += " #{reason}" if reason.present?
super(message)
end
end
end