Class: Edi::Walmart::CatalogItemInformationRetriever
- Inherits:
-
BaseEdiService
- Object
- BaseService
- BaseEdiService
- Edi::Walmart::CatalogItemInformationRetriever
- Defined in:
- app/services/edi/walmart/catalog_item_information_retriever.rb
Overview
Service object: catalog item information retriever.
Constant Summary
Constants included from AddressAbbreviator
AddressAbbreviator::MAX_LENGTH
Instance Attribute Summary
Attributes inherited from BaseEdiService
Attributes inherited from BaseService
Instance Method Summary collapse
-
#process(sku:, file_info: {}) ⇒ EdiCommunicationLog?
Retrieve a single item by SKU.
-
#process_all(offset: 0, limit: 200, lifecycle_status: nil, publish_status: nil, file_info: {}) ⇒ EdiCommunicationLog?
Retrieve all items with pagination.
-
#process_by_status(status:) ⇒ Array<EdiCommunicationLog>
Retrieve items with specific status for monitoring.
Methods inherited from BaseEdiService
#duplicate_po_already_notified?, #initialize, #mark_duplicate_po_as_notified, #report_order_creation_issues, #safe_process_edi_communication_log
Methods included from AddressAbbreviator
#abbreviate_street, #collect_street_originals, #record_address_abbreviation_notes
Methods inherited from BaseService
#initialize, #log_debug, #log_error, #log_info, #log_warning, #logger, #tagged_logger
Constructor Details
This class inherits a constructor from Edi::BaseEdiService
Instance Method Details
#process(sku:, file_info: {}) ⇒ EdiCommunicationLog?
Retrieve a single item by SKU
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# File 'app/services/edi/walmart/catalog_item_information_retriever.rb', line 19 def process(sku:, file_info: {}) return nil if sku.blank? transport = instantiate_transporter remote_path = "#{orchestrator.items_remote_path}/#{CGI.escape(sku)}" logger.info "[Walmart CatalogRetriever] Fetching item: #{sku}" res = transport.send_data('', remote_path, 'GET') if res[:success] && res[:http_result]&.body.present? create_ecl( data: res[:http_result].body.to_s, file_info: file_info.merge(sku: sku, type: 'single_item') ) else logger.warn "[Walmart CatalogRetriever] Failed to fetch item #{sku}: #{res[:http_result]&.body}" nil end end |
#process_all(offset: 0, limit: 200, lifecycle_status: nil, publish_status: nil, file_info: {}) ⇒ EdiCommunicationLog?
Retrieve all items with pagination
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
# File 'app/services/edi/walmart/catalog_item_information_retriever.rb', line 46 def process_all(offset: 0, limit: 200, lifecycle_status: nil, publish_status: nil, file_info: {}) transport = instantiate_transporter query_params = { offset: offset, limit: [limit, 200].min # Max 200 per request } query_params[:lifecycleStatus] = lifecycle_status if lifecycle_status query_params[:publishStatus] = publish_status if publish_status query_string = URI.encode_www_form(query_params) remote_path = "#{orchestrator.items_remote_path}?#{query_string}" logger.info "[Walmart CatalogRetriever] Fetching items page, offset: #{offset}, limit: #{limit}" res = transport.send_data('', remote_path, 'GET') if res[:success] && res[:http_result]&.body.present? create_ecl( data: res[:http_result].body.to_s, file_info: file_info.merge(offset: offset, limit: limit, type: 'items_batch') ) else logger.warn "[Walmart CatalogRetriever] Failed to fetch items: #{res[:http_result]&.body}" nil end end |
#process_by_status(status:) ⇒ Array<EdiCommunicationLog>
Retrieve items with specific status for monitoring
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
# File 'app/services/edi/walmart/catalog_item_information_retriever.rb', line 76 def process_by_status(status:) ecls = [] offset = 0 limit = 200 max_pages = 50 # Safety limit loop do break if (offset / limit) >= max_pages ecl = process_all(offset: offset, limit: limit, lifecycle_status: status) break unless ecl ecls << ecl # Check if there are more pages data = JSON.parse(ecl.data).with_indifferent_access total_items = data.dig(:totalItems) || 0 break if offset + limit >= total_items offset += limit sleep(0.5) # Rate limiting end ecls end |