1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- # Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
- module Sequencer::Unit::Import::Zendesk::SubSequence::Base
- module ClassMethods
- def resource_klass
- @resource_klass ||= name.split('::').last.singularize
- end
- end
- def self.included(base)
- base.extend(ClassMethods)
- base.uses :dry_run, :import_job, :field_map
- end
- private
- def default_params
- {
- dry_run: dry_run,
- import_job: import_job,
- field_map: field_map,
- }
- end
- def resource_klass
- # base.instance_delegate [:resource_klass] => base
- # doesn't work since we are included and then inherited
- # there might be multiple inherited hooks which overwrite
- # each other :/
- self.class.resource_klass
- end
- def sequence_name
- "Import::Zendesk::#{resource_klass}"
- end
- def resource_iteration(&)
- resource_collection.public_send(resource_iteration_method, &)
- rescue ZendeskAPI::Error::NetworkError, Faraday::SSLError => e
- return if expected_exception?(e)
- raise if !retry_exception?(e)
- raise if (fail_count ||= 1) > 10
- logger.error e
- logger.info "Sleeping 10 seconds after ZendeskAPI::Error::NetworkError and retry (##{fail_count}/10)."
- sleep 10
- fail_count += 1
- retry
- end
- # #2262 Zendesk-Import fails for User & Organizations when 403 "access" denied
- def expected_exception?(e)
- status = e.response&.status.to_s
- return false if !status || status != '403'
- %w[UserField OrganizationField].include?(resource_klass)
- end
- def retry_exception?(e)
- e.is_a?(Faraday::SSLError) || !(200..399).cover?(e&.response&.status)
- end
- def resource_collection
- @resource_collection ||= collection_provider.public_send(resource_collection_attribute)
- end
- def resource_iteration_method
- :all!
- end
- def resource_collection_attribute
- @resource_collection_attribute ||= resource_klass.pluralize.underscore
- end
- end
|