diff options
Diffstat (limited to 'app')
| -rw-r--r-- | app/controllers/api/v1/netex_imports_controller.rb | 4 | ||||
| -rw-r--r-- | app/services/http_service.rb | 4 | ||||
| -rw-r--r-- | app/services/zip_service.rb | 9 | ||||
| -rw-r--r-- | app/workers/workbench_import_worker.rb | 56 |
4 files changed, 33 insertions, 40 deletions
diff --git a/app/controllers/api/v1/netex_imports_controller.rb b/app/controllers/api/v1/netex_imports_controller.rb index 7dc18a7be..fd28ba45a 100644 --- a/app/controllers/api/v1/netex_imports_controller.rb +++ b/app/controllers/api/v1/netex_imports_controller.rb @@ -44,10 +44,8 @@ module Api ReferentialMetadataKludge.make_metadata_from_name! netex_import_params['name'], referential_id: @new_referential.id # <<< REMOVE ME !!!! rescue ActiveRecord::RecordInvalid - require 'pry' - binding.pry # render json: {errors: @new_referential.errors}, status: 406 - render json: {errors: ErrorFormat.detailed(@new_referential)}, status: 406 + render json: {errors: ErrorFormat.details(@new_referential)}, status: 406 finish_action! end diff --git a/app/services/http_service.rb b/app/services/http_service.rb index 6cf8ef93b..d3999f293 100644 --- a/app/services/http_service.rb +++ b/app/services/http_service.rb @@ -26,13 +26,11 @@ module HTTPService extend self # params: { netex_import: {referential_id: 13, workbench_id: 1}}, # upload: {file: [StringIO.new('howdy'), 'application/zip', 'greeting']}) def post_resource(host:, path:, token: nil, params: {}, upload: nil) - Faraday.new(url: host) do |c| + result = Faraday.new(url: host) do |c| c.headers['Authorization'] = "Token token=#{token.inspect}" if token c.request :multipart c.request :url_encoded c.adapter Faraday.default_adapter - require 'pry' - binding.pry return c.post path, params end end diff --git a/app/services/zip_service.rb b/app/services/zip_service.rb index f2e7fc2ed..cab301b01 100644 --- a/app/services/zip_service.rb +++ b/app/services/zip_service.rb @@ -1,12 +1,15 @@ class ZipService + # TODO: Remove me before merge https://github.com/rubyzip/rubyzip - class Subdir < Struct.new( :name, :stream) + class Subdir < Struct.new(:name, :stream) end attr_reader :current_key, :current_output, :yielder def initialize data - @zip_data = StringIO.new(data) + @zip_data = StringIO.new(data) + @current_key = nil + @current_output = nil end def subdirs @@ -38,6 +41,7 @@ class ZipService end def write_to_current_output input_stream + # the condition below is true for directory entries return if Zip::NullInputStream == input_stream current_output.write input_stream.read end @@ -58,6 +62,7 @@ class ZipService end def entry_key entry + # last dir name File.dirname.split("/").last entry.name.split('/', -1)[-2] end end diff --git a/app/workers/workbench_import_worker.rb b/app/workers/workbench_import_worker.rb index d06d4607c..325ff401d 100644 --- a/app/workers/workbench_import_worker.rb +++ b/app/workers/workbench_import_worker.rb @@ -3,15 +3,13 @@ class WorkbenchImportWorker include Rails.application.routes.url_helpers include Configurable - RETRY_DELAYS = [3, 5, 8] - # Workers # ======= def perform(import_id) @workbench_import = WorkbenchImport.find(import_id) @response = nil - @workbench_import.update_attributes(status: 'running') + @workbench_import.update(status: 'running') downloaded = download zip_service = ZipService.new(downloaded) upload zip_service @@ -34,49 +32,38 @@ class WorkbenchImportWorker params: params(eg_file, eg_name)) end - def log_failure reason, count - logger.warn "HTTP POST failed with #{reason}, count = #{count}, response=#{@response}" - end - - def try_upload_entry_group eg_name, eg_file - result = execute_post eg_name, eg_file - return Result.ok(result) if result && result.status < 400 - Result.error(JSON.parse result.body) - end - def upload zip_service entry_group_streams = zip_service.subdirs - @workbench_import.update_attributes total_steps: entry_group_streams.size + @workbench_import.update total_steps: entry_group_streams.size entry_group_streams.each_with_index(&method(:upload_entry_group)) - rescue StopIteration - @workbench_import.update_attributes( current_step: entry_group_streams.size, status: 'failed' ) + rescue Exception => e + logger.error e.message + @workbench_import.update( current_step: entry_group_streams.size, status: 'failed' ) + raise end def upload_entry_group entry_pair, element_count - @workbench_import.update_attributes( current_step: element_count.succ ) - retry_service = RetryService.new( - delays: RETRY_DELAYS, - rescue_from: [HTTPService::Timeout], - logger: logger, - &method(:log_failure)) - status = retry_service.execute(&upload_entry_group_proc(entry_pair)) - raise StopIteration unless status.ok? - end - - def upload_entry_group_proc entry_pair + @workbench_import.update( current_step: element_count.succ ) + # status = retry_service.execute(&upload_entry_group_proc(entry_pair)) eg_name = entry_pair.name eg_stream = entry_pair.stream - eg_file = Tempfile.new("WorkbenchImport_#{eg_name}_#{$$}").tap do |file| - eg_stream.read + eg_file = File.new(Rails.root.join('tmp', "WorkbenchImport_#{eg_name}_#{$$}.zip"), 'wb').tap do |file| + eg_stream.rewind + file.write eg_stream.read end eg_file.rewind - -> do - try_upload_entry_group(eg_name, eg_file) + result = execute_post eg_name, eg_file + if result && result.status < 400 + result + else + raise StopIteration, result.body end + ensure + eg_file.close rescue nil + eg_file.unlink rescue nil end - # Queries # ======= @@ -112,6 +99,11 @@ class WorkbenchImportWorker end def params file, name + if dest = ENV["DEBUG_TEMPFILE"] + require 'pry' + binding.pry + %x{unzip -oqq #{file.path} -d #{dest}} + end { netex_import: { referential_id: @workbench_import.referential_id, workbench_id: @workbench_import.workbench_id, |
