Class: Edi::Walmart::CatalogItemInformationRetriever

Inherits:
BaseEdiService show all
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

#orchestrator

Instance Method Summary collapse

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

Parameters:

  • sku (String)

    The seller SKU

Returns:



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

Parameters:

  • offset (Integer) (defaults to: 0)

    Starting offset (default 0)

  • limit (Integer) (defaults to: 200)

    Number of items per page (max 200)

  • lifecycle_status (String, nil) (defaults to: nil)

    Filter by status (ACTIVE, ARCHIVED, RETIRED)

  • publish_status (String, nil) (defaults to: nil)

    Filter by publish status (PUBLISHED, UNPUBLISHED, etc.)

Returns:



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

Parameters:

  • status (String)

    The lifecycle status to filter (ACTIVE, ARCHIVED, RETIRED)

Returns:



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