Class: Www::PublicationsController

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

Overview

Controller: publications.

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 =

Outdoor heating catalog usa sku.

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

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

Instance Method Summary collapse

Methods inherited from ApplicationController

#account_impersonated?, #add_to_flash, #after_sign_in_path_for, #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?, #skip_layout_for_turbo_frame?, #stamp_impersonation_context, #tab_frame_breakout_request?, #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, #registration_lead_type, #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::TurboSafeRedirect

#redirect_to

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, #render_unpermitted_parameters, #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_edge_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!, #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 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?

Instance Method Details

#showvoid

This method returns an undefined value.

Serves a publication PDF (or redirects to the correct SKU/legacy catalog).



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
75
76
77
78
79
80
81
82
# File 'app/controllers/www/publications_controller.rb', line 19

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
    # :id is a scalar route param; params.expect would 400 on a normal read.
    if redirection_path.nil? && params[:id].match(/^\d+$/) # rubocop:disable Rails/StrongParametersExpect
      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)
      # download is the optional ?download=true flag; params.expect would 400 when absent.
      send_publication_proxied @publication, download: params[:download].to_b # rubocop:disable Rails/StrongParametersExpect
    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