Class: Edi::Retriever
- Inherits:
-
BaseService
- Object
- BaseService
- Edi::Retriever
- Defined in:
- app/services/edi/retriever.rb
Overview
I connect to a transport, retrieve files and save them in the Edi Communication log
Direct Known Subclasses
Instance Method Summary collapse
- #instantiate_transporter(transporter, transporter_profile = nil) ⇒ Object
- #process(transporter: :sftp, transporter_profile: nil, remote_path:, file_pattern: nil, partner:, category:, data_type: 'xml', store_to_upload: false) ⇒ Object
Methods inherited from BaseService
#initialize, #log_debug, #log_error, #log_info, #log_warning, #logger, #options, #tagged_logger
Constructor Details
This class inherits a constructor from BaseService
Instance Method Details
#instantiate_transporter(transporter, transporter_profile = nil) ⇒ Object
56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
# File 'app/services/edi/retriever.rb', line 56 def instantiate_transporter(transporter, transporter_profile = nil) case transporter when :sftp Transport::SftpConnection.new(transporter_profile) when :basic_http_api Transport::BasicHttpApiConnection.new({profile: transporter_profile}) when :http_api Transport::HttpApiConnection.new when :local_file Transport::LocalFile.new else raise "Unknown transporter: #{transporter}" end end |
#process(transporter: :sftp, transporter_profile: nil, remote_path:, file_pattern: nil, partner:, category:, data_type: 'xml', store_to_upload: false) ⇒ Object
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
# File 'app/services/edi/retriever.rb', line 5 def process(transporter: :sftp, transporter_profile: nil, # Transporter profile for sftp connection, see secrets.yml remote_path:, # Directory to pull from, usually specified in partner configuration file_pattern: nil, # Regexp file pattern to match partner:, # Name of partner for creating log entry category:, # Category for log entry data_type: 'xml', store_to_upload: false) # By default the file content is stored to the log directly, if true then an upload is created ) transport = instantiate_transporter(transporter, transporter_profile) batch_data = {} batch_data = if store_to_upload transport.batch_download_to_file(remote_path, nil, file_pattern) else transport.batch_download_data(remote_path, file_pattern) end logger.warn "No new files found at #{remote_path} with pattern: #{file_pattern}" unless batch_data.present? edi_logs = [] batch_data.each do |file_name, data| begin EdiCommunicationLog.transaction do data_blob = nil data_blob = data.encode("UTF-8", invalid: :replace, replace: "") unless store_to_upload # clean the data so our normalizr doesn't explode here on non-UTF-8 characters edi_log = EdiCommunicationLog.new partner: partner, category: category, data: data_blob, data_type: data_type, file_name: file_name, transmit_datetime: Time.current edi_log.save! if store_to_upload upload = Upload.uploadify(data, 'custom_packing_slip_pdf', edi_log, file_name) raise "Could not uploadify file #{file_name}" unless upload.persisted? end logger.info "#{file_name} saved to edi log #{edi_log.id}" edi_logs << edi_log # delete the file remote_file_path = "#{remote_path}/#{file_name}" transport.rm(remote_file_path) end rescue StandardError => exc ErrorReporting.error(exc, "Problem during the processing of batch_data in file: #{file_name}") end end edi_logs end |