Module: Retailer::UrlPatterns

Defined in:
app/services/retailer/url_patterns.rb

Overview

Shared URL patterns for identifying direct product pages vs search/category pages.
Used by PriceChecker (sync) and WebhookResultProcessor (async) to decide whether
a discovered or redirect URL should be stored on a catalog item.

Constant Summary collapse

PRODUCT_PATTERNS =
[
  %r{/p/[^/]+/\d+},           # Home Depot USA: /p/{slug}/{id}
  %r{/p/-/[^/]+/\d+},         # Costco (new): /p/-/{slug}/{id}
  %r{/product/[^/]+},         # Generic / HD Canada: /product/{slug}
  %r{\.product\.\d+\.html},   # Costco (legacy): /{slug}.product.{tppn}.html
  %r{/dp/},                   # Amazon: /dp/{asin}
  %r{/pdp/[^?]+\.html},       # Wayfair / Canadian Tire: /pdp/{slug}.html
  %r{/pd/[^/]+/\d+},          # Lowe's USA: /pd/{slug}/{id}
  %r{/ip/[^/]+/\d+},          # Walmart: /ip/{slug}/{id}
  %r{/en-ca/product/},        # Best Buy Canada: /en-ca/product/{slug}
  %r{/products/[^/]+/pid},    # Houzz: /products/{slug}/pid{id}
  %r{/s\d+\?uid=}             # Ferguson Home (Build.com): /{slug}/s{id}?uid={uid}
].freeze
SEARCH_PATTERNS =
[
  /search\?/,
  /search-results/,
  %r{/s/[^/]*$}               # HD USA search: /s/{query}
].freeze

Class Method Summary collapse

Class Method Details

.direct_product_url?(url) ⇒ Boolean

Returns:

  • (Boolean)


28
29
30
31
32
33
# File 'app/services/retailer/url_patterns.rb', line 28

def self.direct_product_url?(url)
  return false if url.blank?
  return false if SEARCH_PATTERNS.any? { |p| url.match?(p) }

  PRODUCT_PATTERNS.any? { |p| url.match?(p) }
end