Class: Www::SearchController

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

Overview

Controller: site search.

The single endpoint behind the navbar search modal. The browser used to call
Swiftype directly and blend in a second request to the publications endpoint;
it now asks here once and renders what comes back, which is what makes the
search engine swappable without a bundle release.

Anonymous and deterministic for a given (locale, q, type, page), so it is
edge-cached — popular queries never reach Rails, and edge_cached keeps the
old per-search guest-session churn from coming back.

Constant Summary collapse

MAX_QUERY_LENGTH =

Matches the maxlength on both search inputs. Anything longer is a bot or a
paste accident, and pg_search/Swiftype both degrade badly on huge terms.

100
MAX_PAGE =

Swiftype stops paginating well before this and publications are far shorter;
the cap exists so a crafted ?page= can't walk the catalogue.

50

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

#indexvoid

This method returns an undefined value.

Returns renders the blended search page as JSON.



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
# File 'app/controllers/www/search_controller.rb', line 24

def index
  result = SiteSearch::Query.call(
    query: search_query,
    type: requested_type,
    page: requested_page,
    locale: I18n.locale.to_s
  )

  # Search results change when the catalogue does, not per visitor. A short
  # edge TTL with a long stale window keeps the origin cold without pinning
  # a stale answer for long.
  #
  # A degraded page is a 200 carrying "we couldn't reach the engine", so
  # caching it would pin that message at the edge for an hour for everyone —
  # a momentary Swiftype blip turned into an outage. Those go uncached and
  # the next visitor retries.
  if result.degraded
    reset_cloudflare_cache
  else
    set_cloudflare_cache(time_in_secs: 1.hour.to_i, stale_while_revalidate_in_secs: 1.day.to_i,
                         public_cache_expires_in: 5.minutes, tags: %w[search])
  end

  render json: result
end