Class: Edi::Walmart::CatalogItemInformationRetriever
- Inherits:
-
BaseEdiService
- Object
- BaseService
- BaseEdiService
- Edi::Walmart::CatalogItemInformationRetriever
- Defined in:
- app/services/edi/walmart/catalog_item_information_retriever.rb
Constant Summary
Constants included from AddressAbbreviator
AddressAbbreviator::MAX_LENGTH
Instance Attribute Summary
Attributes inherited from BaseEdiService
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, #options, #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
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# File 'app/services/edi/walmart/catalog_item_information_retriever.rb', line 17 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
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
# File 'app/services/edi/walmart/catalog_item_information_retriever.rb', line 43 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
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
# File 'app/services/edi/walmart/catalog_item_information_retriever.rb', line 73 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 |