Class: Www::PublicationsController

Inherits:
ApplicationController show all
Defined in:
app/controllers/www/publications_controller.rb

Constant Summary collapse

LEGACY_OUTDOOR_HEATING_CATALOG_SKU =

Legacy marketing SKU → region-specific catalogs (business rule; keep in app, not edge redirects).

'WARMLYYOURS-OUTDOOR-HEATING-CATALOG'
OUTDOOR_HEATING_CATALOG_USA_SKU =
'WARMLYYOURS-OUTDOOR-HEATING-CATALOG-USA'
OUTDOOR_HEATING_CATALOG_CANADA_SKU =
'WARMLYYOURS-OUTDOOR-HEATING-CATALOG-CANADA'

Constants included from Controllers::AnalyticsEvents

Controllers::AnalyticsEvents::MAX_QUEUED_EVENTS, Controllers::AnalyticsEvents::SESSION_KEY

Constants included from Controllers::ErrorRendering

Controllers::ErrorRendering::NON_CONTENT_PATH_PREFIXES

Constants included from SeoHelper

SeoHelper::AWARDS, SeoHelper::CA_ADDRESS, SeoHelper::CA_BUSINESS_HOURS, SeoHelper::CA_CONTACT_POINT, SeoHelper::CA_CURRENCIES, SeoHelper::CA_DESCRIPTION, SeoHelper::CA_FOUNDING_DATE, SeoHelper::CA_GLOBAL_LOCATION_NUMBER, SeoHelper::CA_LEGAL_NAME, SeoHelper::CA_LOCAL_BUSINESS, SeoHelper::CA_ONLINE_STORE, SeoHelper::CA_RETURN_POLICY, SeoHelper::CA_SALES_DEPARTMENT, SeoHelper::CA_SERVICE_AREA, SeoHelper::CA_URL, SeoHelper::CA_VAT_ID, SeoHelper::CA_WAREHOUSE_DEPARTMENT, SeoHelper::CA_WAREHOUSE_HOURS, SeoHelper::COMPANY_EMAIL, SeoHelper::COMPANY_LOGO, SeoHelper::COMPANY_NAME, SeoHelper::COMPANY_SLOGAN, SeoHelper::EXPERTISE, SeoHelper::FAX_NUMBER, SeoHelper::GS1_COMPANY_PREFIX, SeoHelper::ISO6523_CODE, SeoHelper::PAYMENT_METHODS, SeoHelper::PHONE_NUMBER, SeoHelper::PRIMARY_NAICS, SeoHelper::REFUND_TYPE, SeoHelper::RETURN_FEES, SeoHelper::RETURN_METHOD, SeoHelper::RETURN_POLICY_CATEGORY, SeoHelper::SECONDARY_NAICS, SeoHelper::SOCIAL_PROFILES, SeoHelper::US_ADDRESS, SeoHelper::US_BUSINESS_HOURS, SeoHelper::US_CONTACT_POINT, SeoHelper::US_CURRENCIES, SeoHelper::US_DESCRIPTION, SeoHelper::US_FOUNDING_DATE, SeoHelper::US_GLOBAL_LOCATION_NUMBER, SeoHelper::US_IMAGE, SeoHelper::US_LEGAL_NAME, SeoHelper::US_LOCAL_BUSINESS, SeoHelper::US_ONLINE_STORE, SeoHelper::US_RETURN_POLICY, SeoHelper::US_SALES_DEPARTMENT, SeoHelper::US_SERVICE_AREA, SeoHelper::US_TAX_ID, SeoHelper::US_URL, SeoHelper::US_WAREHOUSE_DEPARTMENT, SeoHelper::US_WAREHOUSE_HOURS

Constants included from IconHelper

IconHelper::CUSTOM_ICON_MAP, IconHelper::CUSTOM_SVG_DIR, IconHelper::DEFAULT_FAMILY

Instance Method Summary collapse

Methods inherited from ApplicationController

#account_impersonated?, #add_to_flash, #append_token, #bypass_forgery_protection?, #chat_enabled?, #cloudflare_cleared?, #default_catalog, #default_url_options, #enable_turbo_frames, #find_publication, #fix_invalid_accept_header, #init_js_utils, #is_globals_call?, #layout_by_resource, #locale_store, #redirect_to, #require_employee_for_crm, #set_base_host, #set_real_ip, #set_report_errors_for, #should_render_layout?, #stamp_impersonation_context, #warmlyyours_canada_ip?, #warmlyyours_ip?, #y

Methods included from Controllers::ReturnPathHandling

#check_for_return_path, #redirect_to_return_path_or_default

Methods included from Controllers::AnalyticsEvents

#consume_queued_analytics_events, #track_event

Methods included from Controllers::DeviceDetection

#device_detector, #is_ie?

Methods included from Controllers::SubdomainDetection

#is_crm_request?, #is_www_request?, #json_request?

Methods included from Controllers::TrackingDetection

#bot_request?, #gdpr_country?, #gdpr_country_data, #prevent_bots, #set_tracking_cookie, #track_visitor?

Methods included from Controllers::AcceleratedFileSending

#send_file_accelerated, #send_upload_accelerated

Methods included from Controllers::ErrorRendering

#excp_string, #mail_to_for_error_reporting, #render_400, #render_404, #render_406, #render_410, #render_500, #render_invalid_authenticity_token, #render_ip_spoof_error, #safe_referer_or_fallback

Methods included from Controllers::TurnstileVerification

#load_turnstile_script_tag, #turnstile_lazy_widget, #turnstile_script_tag, #turnstile_widget, #validate_turnstile!

Methods included from Controllers::CloudflareCaching

edge_cached, #edge_cached_action?, #reset_cloudflare_cache, #set_cloudflare_cache, #skip_session

Methods included from Controllers::Webpackable

#preload_webpack_fonts, #webpack_css_include, #webpack_css_url, #webpack_js_include, #wpd_is_running?

Methods included from Controllers::Localizable

#cloudflare_country_locale, #determine_request_locale, #geocoder_locale, #guest_user_locale_check, #locale_optional_www_auth_path?, #param_locale, #set_locale, #set_request_locale, #skip_localization?, #warmlyyours_ip_locale

Methods included from Controllers::Authenticable

#access_denied, #authenticate_account, #authenticate_account!, #authenticate_account_from_login_token!, #authenticate_account_from_token!, #check_is_a_manager, #check_is_a_sales_manager, #check_is_an_admin, #check_is_an_employee, #check_party, #clear_mismatched_guest_user, #create_guest_user, #credentials?, #current_or_guest_user, #current_or_guest_user_id_read_only, #current_user, #devise_mapping, #fully_logged_in?, #generate_bot_id, #guest_user, #identifiable?, #init_current_user, #initialize_guest, #load_context_user, #logging_in, #resource, #resource_name, #restrict_access_for_non_employees, #scrubbed_request_path, #user_object, #warn_on_session_guest_id_leak

Methods included from ApplicationHelper

#better_number_to_currency, #check_force_logout, #check_or_cross, #check_or_times, #error_messages, #general_disclaimer_on_product_installation_and_local_codes, #gridjs_from_html_table, #gridjs_table, #is_wy_ip, #line_break, #parent_layout, #pass_or_fail, #render_error_messages_list, #render_video_card, #resolved_auth_form_turbo_frame, #return_path_or, #safe_css_color, #set_return_path_if_present, #set_section_if_present, #tab_frame_id, #to_underscore, #track_page?, #turbo_section_wrapper, #turbo_tabs_request?, #url_on_same_domain_as_request, #widget_index_daily_focus_index_path, #working_hours?, #yes_or_no, #yes_or_no_highlighted, #yes_or_no_with_check_or_cross, #youtube_video

Methods included from UppyUploaderHelper

#file_uploader, #image_uploader, #large_file_uploader_s3, #lead_sketch_uploader, #rma_image_uploader, #rma_image_uploader_s3, #uppy_uploader, #video_uploader

Methods included from ImagesHelper

#image_asset_tag, #image_asset_url

Methods included from SeoHelper

#add_page_schema, #canada?, #company_social_links, #ensure_context_json, #json_ld_script_tag, #local_business_schema, #online_store_id, #online_store_schema, #page_main_entity, #page_main_entity_json, #render_auto_collection_page_schema, #render_collection_page_schema, #render_local_business_schema, #render_online_store_schema, #render_page_schemas, #render_page_video_schemas, #render_webpage_schema, #render_webpage_schema_with_collections, #usa?

Methods included from UrlsHelper

#catalog_breadcrumb_links, #catalog_link, #catalog_link_for_product_line, #catalog_link_for_sku, #cms_link, #delocalized_path, #path_to_sales_product_sku, #path_to_sales_product_sku_for_product_line, #path_to_sales_product_sku_for_product_line_slug, #product_line_from_catalog_link, #protocol_neutral_url, #sanitize_external_url, #valid_external_url?

Methods included from IconHelper

#account_nav_icon, #fa_icon, #star_rating_html

Instance Method Details

#searchObject



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'app/controllers/www/publications_controller.rb', line 76

def search
  locale_for_request = params[:locale] || I18n.locale || 'en-US'
  store = Store.locale_to_catalog(locale_for_request)
  @publications = Item.publications_for_public_in_store(store.id).wild_search(params[:q])
  results = @publications.map do |p|
    {
      title: p.name,
      id: p.sku,
      url: www_publication_path(p.sku, format: 'pdf'),
      image: cms_link("/publications/#{p.sku}.jpg?size=140x"),
      body: p.detailed_description_html.presence
    }
  end
  render json: results
end

#showObject



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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
69
70
71
72
73
74
# File 'app/controllers/www/publications_controller.rb', line 13

def show
  # Validate incoming id to prevent malformed regex and garbage inputs
  requested_id = params[:id].to_s.strip
  unless requested_id.present? && requested_id.size <= 200 && requested_id.match?(/\A(\d+|[A-Za-z0-9-]+)\z/)
    flash[:info] = t('controllers.www.publications.not_found')
    @q = requested_id
    render_404 && return
  end

  if requested_id == LEGACY_OUTDOOR_HEATING_CATALOG_SKU
    redirect_legacy_outdoor_heating_catalog
    return
  end

  # Analyze sku for revisions
  @publication = find_publication(requested_id)
  redirection_path = nil
  if @publication
    # TODO, we probably have two things doing the same here
    redirection_path ||= @publication.content_url.presence
    redirection_path ||= @publication.redirection_path.presence
    # If our params[:id] was numeric, we redirect to the sku
    if redirection_path.nil? && params[:id].match(/^\d+$/)
      redirection_path = www_publication_path(@publication.sku, format: (params[:format] == 'pdf' ? 'pdf' : nil))
    end
    # If our found sku is different than the requested id, we redirect to the right sku
    if redirection_path.nil? && @publication.sku != params[:id]
      redirection_path = www_publication_path(@publication.sku, format: (params[:format] == 'pdf' ? 'pdf' : nil))
    end
  else
    redirection_path = Item.publications.where(is_discontinued: true).where.not(redirection_path: nil).find_by(sku: params[:id])&.redirection_path
  end

  if redirection_path
    flash[:info] = t('controllers.www.publications.no_longer_available')
    redirect_to(cms_link(redirection_path)) && return
  elsif @publication.nil? || !@publication.literature&.attachment
    flash[:info] = t('controllers.www.publications.not_found')
    @q = params[:id]
    render_404 && return
  end

  size = params[:size] || '900x'

  # Note to future self.  Do not try to redirect to the cdn authenticated url, a few problems will occur
  # 1 - stale url could end up being cached despite your best attempt at controlling the cache header
  # 2 - Google will detect the canonical or the page as a redirect, and will not index it, and pdfs are good for ranking
  respond_to do |format|
    format.html { set_cloudflare_cache(time_in_secs: 30.days.to_i, tags: %w[publication]) }
    format.pdf do
      set_header_links_for_publication(@publication, response)
      send_publication_proxied @publication, download: params[:download].to_b
    end
    format.png do
      redirect_to @publication.image_url2(size:, format: 'png'), allow_other_host: true
    end
    format.jpeg do
      redirect_to @publication.image_url2(size:, format: 'jpeg'), allow_other_host: true
    end
    format.any { head :not_acceptable }
  end
end