trabajo-afectivo/lib/sequencer/unit/import/kayako/sub_sequence/generic.rb

100 lines
2.7 KiB
Ruby
Raw Normal View History

2022-01-01 13:38:12 +00:00
# Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
class Sequencer
class Unit
module Import
module Kayako
module SubSequence
class Generic < Sequencer::Unit::Base
uses :dry_run, :import_job, :field_map, :id_map, :default_language
attr_accessor :iteration, :result
EXPECTING = %i[action response].freeze
def process
loop.each_with_index do |_, iteration|
@iteration = iteration
@result = ::Sequencer.process(sequence_name,
parameters: sequence_params,
expecting: self.class.const_get(:EXPECTING))
break if iteration_should_stop?
end
end
def sequence_params
{
request_params: request_params,
import_job: import_job,
dry_run: dry_run,
object: object,
default_language: default_language,
field_map: field_map,
id_map: id_map,
}
end
def request_params
return {} if iteration.zero?
if cursor_pagination?
return cursor_pagination
end
offset_pagination
end
def object
@object ||= self.class.name.demodulize.singularize
end
def sequence_name
raise NotImplementedError
end
private
def offset_pagination
{
offset: offset,
}
end
def offset
iteration * 5 # TODO: only ddebug, normally 100
end
def cursor_pagination?
return if result.nil?
@cursor_pagination ||= result[:response].header['link'].include?('after_id')
end
def cursor_pagination
{
after_id: cursor_after_id
}
end
def cursor_after_id
unescaped_header_next_link.match(%r{after_id=(\d+)})[1]
end
def unescaped_header_next_link
CGI.unescape(CGI.unescape(result[:response].header['link']))
end
def iteration_should_stop?
return true if result[:action] == :failed
return true if result[:response].header['link'].blank? || result[:response].header['link'].exclude?('rel="next"')
false
end
end
end
end
end
end
end