Class: Edi::Wayfair::CatalogItemInformationRetriever

Inherits:
BaseEdiService show all
Defined in:
app/services/edi/wayfair/catalog_item_information_retriever.rb

Overview

Retrieves catalog item information from the Wayfair Supplier Catalog API
Uses the product-catalog-api endpoint to fetch product details including:

  • productId (Wayfair's internal ID, basis for the W-prefixed SKU)
  • supplierPartNumber (our internal SKU)
  • skus with variant details (displaySku, retailPrice, etc.)

API Documentation: https://developer.wayfair.io/posts/catalog-read

Constant Summary collapse

CATALOG_API_URL =

Catalog API uses a different endpoint than the Orders API
Documentation: https://developer.wayfair.io/posts/catalog-read

'https://api.wayfair.io/v1/supplier-catalog-api/graphql'
SANDBOX_CATALOG_API_URL =
'https://api.wayfair.io/sandbox/v1/supplier-catalog-api/graphql'
SUPPLIER_CATALOG_QUERY_WITH_FILTER =

GraphQL query to retrieve product catalog information (with filter)
Key fields:

  • productId: Wayfair's product ID (e.g., 1001)
  • supplierPartNumber: Our SKU (e.g., "WRM1245")
  • skus[].sku: Wayfair's variant SKU
  • skus[].displaySku: Customer-facing SKU (e.g., "W001498355")
  • skus[].retailPrice: Current pricing
<<~GRAPHQL.squish
  query GetSupplierCatalog($supplierId: Int!, $filter: ProductFilter, $paginationOptions: PaginationOptions) {
    supplierCatalog(supplierId: $supplierId, filter: $filter, paginationOptions: $paginationOptions) {
      supplierId
      pageInfo {
        page
        pageSize
        totalPages
        hasNextPage
      }
      products {
        productId
        supplierPartNumber
        status
        upc
        skus {
          isLive
          sku
          displaySku
          productName
          className
          classId
          retailPrice {
            unit { amount currency }
            item { amount currency }
          }
          urls
          status
          productDimensions {
            lengthUnit depth height width weightUnit weight
          }
          primaryImage { id url }
        }
        images { id url }
        manufacturerPart { partId partNumber }
      }
    }
  }
GRAPHQL
SUPPLIER_CATALOG_QUERY_SIMPLE =

Simpler query without filter for pagination-only requests

<<~GRAPHQL.squish
  query GetSupplierCatalog($supplierId: Int!, $paginationOptions: PaginationOptions) {
    supplierCatalog(supplierId: $supplierId, paginationOptions: $paginationOptions) {
      supplierId
      pageInfo { page pageSize totalPages hasNextPage }
      products {
        productId
        supplierPartNumber
        status
        skus { sku displaySku productName retailPrice { unit { amount currency } } primaryImage { url } }
      }
    }
  }
GRAPHQL

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(supplier_part_number:, file_info: {}) ⇒ EdiCommunicationLog?

Process retrieval for a specific supplier part number (our SKU)

Parameters:

  • supplier_part_number (String)

    Our internal SKU (e.g., "WRM1245")

  • file_info (Hash) (defaults to: {})

    Optional metadata to attach to the ECL

Returns:

Raises:

  • (ArgumentError)


84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'app/services/edi/wayfair/catalog_item_information_retriever.rb', line 84

def process(supplier_part_number:, file_info: {})
  supplier_id = orchestrator.try(:warehouse_code)&.to_i
  raise ArgumentError, "Warehouse code (supplier_id) not configured for #{orchestrator.partner}" if supplier_id.blank? || supplier_id.zero?

  variables = {
    supplierId: supplier_id,
    filter: {
      supplierPartNumber: {
        in: [supplier_part_number]
      }
    },
    paginationOptions: {
      page: 1,
      pageSize: 10
    }
  }

  fetch_catalog_data(variables: variables, file_info: file_info, use_filter: true)
end

#process_all(page: 1, page_size: 25, file_info: {}) ⇒ EdiCommunicationLog?

Fetch all products for the supplier (paginated)

Parameters:

  • page (Integer) (defaults to: 1)

    Page number to fetch (default: 1)

  • page_size (Integer) (defaults to: 25)

    Number of products per page (10, 20, or 25)

Returns:

Raises:

  • (ArgumentError)


108
109
110
111
112
113
114
115
116
117
118
119
120
121
# File 'app/services/edi/wayfair/catalog_item_information_retriever.rb', line 108

def process_all(page: 1, page_size: 25, file_info: {})
  supplier_id = orchestrator.try(:warehouse_code)&.to_i
  raise ArgumentError, "Warehouse code (supplier_id) not configured for #{orchestrator.partner}" if supplier_id.blank? || supplier_id.zero?

  variables = {
    supplierId: supplier_id,
    paginationOptions: {
      page: page,
      pageSize: page_size
    }
  }

  fetch_catalog_data(variables: variables, file_info: file_info, use_filter: false)
end