123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- # Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
- class Sequencer::Unit::Import::Kayako::Post::Attachments < Sequencer::Unit::Base
- include ::Sequencer::Unit::Import::Kayako::Requester
- prepend ::Sequencer::Unit::Import::Common::Model::Mixin::Skip::Action
- optional :action
- skip_action :skipped, :failed
- uses :resource, :instance, :model_class, :dry_run
- def self.mutex
- @mutex ||= Mutex.new
- end
- def process
- return if skip?
- download_threads.each(&:join)
- end
- private
- def local_attachments
- @local_attachments ||= instance.attachments&.filter { |attachment| attachment.preferences&.dig('Content-Disposition') != 'inline' }
- end
- def skip?
- ensure_common_ground
- attachments_equal?
- end
- def ensure_common_ground
- return if attachments_equal?
- local_attachments.each(&:delete)
- end
- def attachments_equal?
- resource['attachments'].count == local_attachments.count
- end
- def download_threads
- resource['attachments'].map do |attachment|
- Thread.new do
- sync(attachment)
- end
- end
- end
- def sync(attachment)
- logger.debug { "Downloading attachment #{attachment}" }
- response = request(
- api_path: attachment['url_download'].gsub("#{Setting.get('import_kayako_endpoint')}/", ''),
- attachment: true,
- )
- return if dry_run
- store_attachment(attachment, response)
- rescue => e
- logger.error(e)
- end
- def store_attachment(attachment, response)
- self.class.mutex.synchronize do
- ::Store.create!(
- object: model_class.name,
- o_id: instance.id,
- data: response.body,
- filename: attachment['name'],
- preferences: {
- 'Content-Type' => attachment['type']
- },
- created_by_id: 1
- )
- end
- end
- end
|