Class: Www::EmailPreferencesController

Inherits:
BasePortalController show all
Defined in:
app/controllers/www/email_preferences_controller.rb

Overview

Controller: email preferences.

Constant Summary

Constants included from Controllers::MasqueradeGuarded

Controllers::MasqueradeGuarded::DEFAULT_BLOCK_MESSAGE

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 BasePortalController

#current_ability, #portal_party, #set_catalog, #set_webpack

Methods included from Controllers::MasqueradeGuarded

block_while_masquerading, #masquerade_blocks?

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

#editvoid

This method returns an undefined value.

Renders the email preferences form for the tokenized email address.



35
36
37
38
39
40
41
# File 'app/controllers/www/email_preferences_controller.rb', line 35

def edit
  email_address = EmailPreference.decrypt_token(params[:token])
  @email_preference = EmailPreference.find_or_create_by!(email: email_address)
  @show_tracking_consent = @email_preference.eu_recipient?
rescue StandardError
  redirect_to root_path, notice: 'Unable to display email preferences, please contact customer service on 1-800-875-5285 for further assistance.'
end

#one_click_unsubscribevoid

This method returns an undefined value.

RFC 8058 one-click unsubscribe endpoint. Always returns a bare 200.



19
20
21
22
23
24
25
26
27
28
29
30
# File 'app/controllers/www/email_preferences_controller.rb', line 19

def one_click_unsubscribe
  email_address = EmailPreference.decrypt_token(params[:token])
  if email_address.present?
    PaperTrail.request(whodunnit: 'OneClickUnsubscribe') do
      EmailPreference.find_or_create_by!(email: email_address)
      EmailPreference.unsubscribe(email_address)
    end
  end
  # RFC 8058 only requires a 2xx. Always return a bare 200 — never reveal
  # whether the token resolved to a real recipient.
  head :ok
end

#updatevoid

This method returns an undefined value.

Saves the submitted email preferences and marks the related
communication recipient unsubscribed when applicable.



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

def update
  email_address = EmailPreference.decrypt_token(params[:token])
  @email_preference = EmailPreference.find_or_create_by!(email: email_address)
  permitted = params.expect(
    email_preference: %i[disable_announcements disable_events disable_newsletters disable_promotions disable_reviews disable_webinars disable_email_tracking]
  )
  @email_preference.update(permitted)
  has_unsubscribed = @email_preference.unsubscribed_categories_changes.any?
  # If our user has unsubscribed from any category, and the email preference has a link to the
  # communication record, we will find the communication recipient and mark it unsubscribed
  # this improves the reporting on campaign
  if has_unsubscribed && params[:uid].present? && (co = Communication.find_by(unique_id: params[:uid]))
    # Find the recipient
    if (cr = co.communication_recipients.emails.find_by(detail: email_address))
      cr.ignore_global_unsubscribe = true # this prevents from unsubscribing from all
      cr.unsubscribe
    end
  end

  respond_to do |format|
    format.turbo_stream do
      flash.now[:success] = 'Preferences updated.'
      render partial: 'shared/flash'
    end
    format.html do
      # Fallback path when Turbo/JS isn't driving the submit (e.g. the
      # "Save preferences" button with the bundle unavailable). `_alerts`
      # renders flash[:info] as a success banner after the redirect.
      flash[:info] = 'Preferences updated.'
      redirect_to (token: params[:token], uid: params[:uid])
    end
  end
end