Class: Retailer::UrlConstructor

Inherits:
Object
  • Object
show all
Includes:
CatalogConstants
Defined in:
app/services/retailer/url_constructor.rb

Overview

Constructs product URLs for retailer catalog items dynamically.
Prioritizes hardcoded URLs but can generate URLs from product identifiers.

Examples:

Get URL for a catalog item

constructor = Retailer::UrlConstructor.new
url = constructor.product_url(catalog_item)

Reset hardcoded URL to generated

catalog_item.update!(url: constructor.generate_url(catalog_item))

Constant Summary collapse

CATALOG_BUILDERS =

Catalog ID to URL builder method mapping
Uses CatalogConstants for maintainability

{
  # Home Depot
  HOME_DEPOT_USA => :home_depot_usa_url,
  HOME_DEPOT_CANADA => :home_depot_canada_url,
  # Costco
  COSTCO_CANADA => :costco_canada_url,
  # Wayfair
  WAYFAIR_USA => :wayfair_usa_url,
  WAYFAIR_CANADA => :wayfair_canada_url,
  WAYFAIR_GERMANY => :wayfair_germany_url,
  # Rona/Lowe's
  RONA_CANADA => :rona_url,
  LOWES_USA => :lowes_usa_url,
  LOWES_CANADA => :lowes_canada_url,
  # Build.com (Ferguson Home)
  BUILD_COM => :build_com_url,
  # Amazon Seller Marketplaces
  AMAZON_SC_US_CATALOG_ID => :amazon_url,
  AMAZON_SC_CA_CATALOG_ID => :amazon_url,
  # Amazon European Marketplaces
  AMAZON_SC_FR_CATALOG_ID => :amazon_url,
  AMAZON_SC_IT_CATALOG_ID => :amazon_url,
  AMAZON_SC_ES_CATALOG_ID => :amazon_url,
  AMAZON_SC_DE_CATALOG_ID => :amazon_url,
  AMAZON_SC_NL_CATALOG_ID => :amazon_url,
  AMAZON_SC_PL_CATALOG_ID => :amazon_url,
  AMAZON_SC_UK_CATALOG_ID => :amazon_url,
  AMAZON_SC_SE_CATALOG_ID => :amazon_url,
  AMAZON_SC_BE_CATALOG_ID => :amazon_url,
  # Walmart Seller Marketplaces
  WALMART_SELLER_USA => :walmart_usa_url,
  WALMART_SELLER_CANADA => :walmart_canada_url,
  # Canadian Tire
  CANADIAN_TIRE => :canadian_tire_url,
  # Houzz
  HOUZZ => :houzz_url,
  # Best Buy Canada
  BESTBUY_CANADA => :bestbuy_canada_url
}.freeze

Constants included from CatalogConstants

CatalogConstants::ALL_MAIN_CATALOG_IDS, CatalogConstants::AMAZON_CATALOG_IDS, CatalogConstants::AMAZON_CA_CATALOG_IDS, CatalogConstants::AMAZON_EU_CATALOG_IDS, CatalogConstants::AMAZON_NA_SELLER_IDS, CatalogConstants::AMAZON_SC_BE_CATALOG_ID, CatalogConstants::AMAZON_SC_CATALOG_IDS, CatalogConstants::AMAZON_SC_CA_CATALOG_ID, CatalogConstants::AMAZON_SC_DE_CATALOG_ID, CatalogConstants::AMAZON_SC_ES_CATALOG_ID, CatalogConstants::AMAZON_SC_FR_CATALOG_ID, CatalogConstants::AMAZON_SC_IT_CATALOG_ID, CatalogConstants::AMAZON_SC_NL_CATALOG_ID, CatalogConstants::AMAZON_SC_PL_CATALOG_ID, CatalogConstants::AMAZON_SC_SE_CATALOG_ID, CatalogConstants::AMAZON_SC_UK_CATALOG_ID, CatalogConstants::AMAZON_SC_US_CATALOG_ID, CatalogConstants::AMAZON_SELLER_IDS, CatalogConstants::AMAZON_US_CATALOG_IDS, CatalogConstants::AMAZON_VC_CATALOG_IDS, CatalogConstants::AMAZON_VC_CA_CATALOG_ID, CatalogConstants::AMAZON_VC_CA_CATALOG_IDS, CatalogConstants::AMAZON_VC_DIRECT_FULFILLMENT_CATALOG_IDS, CatalogConstants::AMAZON_VC_US_CATALOG_IDS, CatalogConstants::AMAZON_VC_US_WASN4_CATALOG_ID, CatalogConstants::AMAZON_VC_US_WAX7V_CATALOG_ID, CatalogConstants::AMAZON_VC_WAT0F_CA_CATALOG_ID, CatalogConstants::AMAZON_VC_WAT4D_CA_CATALOG_ID, CatalogConstants::AMAZON_VENDOR_CODE_TO_CATALOG_ID, CatalogConstants::BESTBUY_CANADA, CatalogConstants::BUILD_COM, CatalogConstants::CANADIAN_TIRE, CatalogConstants::CA_CATALOG_ID, CatalogConstants::COSTCO_CANADA, CatalogConstants::COSTCO_CATALOGS, CatalogConstants::COSTCO_USA, CatalogConstants::EU_CATALOG_ID, CatalogConstants::HOME_DEPOT_CANADA, CatalogConstants::HOME_DEPOT_CATALOGS, CatalogConstants::HOME_DEPOT_USA, CatalogConstants::HOUZZ, CatalogConstants::LOCALE_TO_CATALOG, CatalogConstants::LOWES_CANADA, CatalogConstants::LOWES_USA, CatalogConstants::MARKETPLACE_CATALOGS, CatalogConstants::PRICE_CHECK_ENABLED_CATALOGS, CatalogConstants::RONA_CANADA, CatalogConstants::US_CATALOG_ID, CatalogConstants::VENDOR_CATALOGS, CatalogConstants::WALMART_CATALOGS, CatalogConstants::WALMART_SELLER_CANADA, CatalogConstants::WALMART_SELLER_USA, CatalogConstants::WAYFAIR_CANADA, CatalogConstants::WAYFAIR_CATALOGS, CatalogConstants::WAYFAIR_GERMANY, CatalogConstants::WAYFAIR_USA

Instance Method Summary collapse

Methods included from CatalogConstants

amazon_catalog?, amazon_seller_catalog?, costco_catalog?, home_depot_catalog?, marketplace_catalog?, price_check_enabled?, vendor_catalog?, walmart_catalog?, wayfair_catalog?

Instance Method Details

#amazon_domain(catalog) ⇒ String

Returns the Amazon domain for a catalog based on its marketplace

Parameters:

Returns:

  • (String)

    Domain like 'amazon.com' or 'amazon.ca'



95
96
97
98
99
100
101
102
103
# File 'app/services/retailer/url_constructor.rb', line 95

def amazon_domain(catalog)
  marketplace = catalog.amazon_marketplace
  return 'amazon.com' unless marketplace&.url

  # Extract domain from marketplace URL (https://www.amazon.com -> amazon.com)
  URI.parse(marketplace.url).host.gsub(/^www\./, '')
rescue URI::InvalidURIError
  'amazon.com'
end

#can_generate_url?(catalog) ⇒ Boolean

Check if we can generate a URL for this catalog

Parameters:

Returns:

  • (Boolean)


87
88
89
# File 'app/services/retailer/url_constructor.rb', line 87

def can_generate_url?(catalog)
  CATALOG_BUILDERS.key?(catalog.id)
end

#generate_url(catalog_item) ⇒ String?

Generates a URL from product identifiers (ASIN, third_party_part_number, UPC)
Does not use the hardcoded URL field

Parameters:

Returns:

  • (String, nil)


72
73
74
75
76
77
78
79
80
81
# File 'app/services/retailer/url_constructor.rb', line 72

def generate_url(catalog_item)
  catalog = catalog_item.catalog
  return nil unless catalog

  # Find matching retailer builder by catalog ID
  builder_method = CATALOG_BUILDERS[catalog.id]
  return nil unless builder_method

  send(builder_method, catalog_item, catalog)
end

#product_url(catalog_item) ⇒ String?

Returns the best URL for a catalog item
Prefers hardcoded URL if present, otherwise generates from identifiers

Parameters:

Returns:

  • (String, nil)


63
64
65
# File 'app/services/retailer/url_constructor.rb', line 63

def product_url(catalog_item)
  catalog_item.url.presence || generate_url(catalog_item)
end