100 lines
2.7 KiB
Ruby
100 lines
2.7 KiB
Ruby
|
# Copyright (C) 2012-2021 Zammad Foundation, http://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
|