Class: Crm::SiteMapRecommendationsController

Inherits:
CrmController show all
Includes:
ActionView::RecordIdentifier
Defined in:
app/controllers/crm/site_map_recommendations_controller.rb

Overview

Controller: site map recommendations.

Constant Summary

Constants included from Controllers::ReferenceFindable

Controllers::ReferenceFindable::ID_EMBEDDED_PATTERNS

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 CrmController

#access_denied, #context_id, #context_object, #crm_home_path, #current_ability, #default_url_options, #download_temp, #get_tempfile_path_for_download, #init_status_job_collector, #initialize_crm_lazy_chunks, #persist_enqueued_status_jobs, #record_not_found, #redirect_to_job_or_fallback, #render_edit_action, #set_context, #set_download_path, #stash_file_for_temp_download, #sync_admin_presence_cookie, #touch_employee_last_seen

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

#bulk_updatevoid

This method returns an undefined value.

Updates status for multiple site map recommendations at once.



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'app/controllers/crm/site_map_recommendations_controller.rb', line 46

def bulk_update
  authorize! :manage, SiteMap
  ids = params[:recommendation_ids] || []
  new_status = params[:status]

  unless new_status.in?(SiteMapRecommendation::STATUSES)
    redirect_back_or_to action_items_site_maps_path, alert: 'Invalid status'
    return
  end

  attrs = { status: new_status }
  attrs[:completed_at] = Time.current if new_status == 'completed'
  attrs[:completed_at] = nil unless new_status == 'completed'

  SiteMapRecommendation.where(id: ids).update_all(attrs.merge(updated_at: Time.current))

  redirect_back_or_to action_items_site_maps_path,
                      notice: "#{ids.size} recommendation(s) updated to #{new_status}"
end

#discussvoid

This method returns an undefined value.

Creates a Sunny Agent conversation to discuss selected recommendations.



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'app/controllers/crm/site_map_recommendations_controller.rb', line 69

def discuss
  authorize! :manage, SiteMap
   = Array(params[:recommendation_ids]).map(&:to_i).reject(&:zero?)

  if .empty?
    respond_with_flash_or_redirect('Select at least one action item', action_items_site_maps_path)
    return
  end

  ids = SiteMapRecommendation.actionable.where(id: ).ids
  skipped = .size - ids.size

  if ids.empty?
    respond_with_flash_or_redirect(
      "All #{.size} selected item(s) are already completed, ignored, or stale — nothing to send to Sunny.",
      action_items_site_maps_path
    )
    return
  end

  conversation = Assistant::SunnyAgent.create!(user: current_user)
  conversation.update!(
    tool_services: %w[seo_audit blog_management content faq_management],
    conversation_type: 'seo_discuss',
    draft_prefill: SiteMapRecommendation.sunny_batch_prompt(ids),
    default_tool_handles: %w[seo-audit blog-management content-search faq-management]
  )

  flash[:notice] = "Skipped #{skipped} item(s) already completed, ignored, or stale." if skipped > 0

  # For HTML this is a plain 303; for turbo_stream form submissions
  # `TurboSafeRedirect` (ApplicationController) rewrites it into a
  # `<turbo-stream action="redirect">` so Turbo runs a clean Drive visit.
  redirect_to assistant_path(conversation)
end

#updatevoid

This method returns an undefined value.

Updates a single site map recommendation's status and notes.



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
# File 'app/controllers/crm/site_map_recommendations_controller.rb', line 14

def update
  authorize! :manage, SiteMap
  @recommendation = SiteMapRecommendation.find(params.expect(:id))

  new_status = params[:status]
  unless new_status.in?(SiteMapRecommendation::STATUSES)
    head :unprocessable_content
    return
  end

  attrs = { status: new_status }
  attrs[:completed_at] = Time.current if new_status == 'completed'
  attrs[:completed_at] = nil unless new_status == 'completed'
  attrs[:notes] = params[:notes] if params[:notes].present?

  @recommendation.update!(attrs)

  respond_to do |format|
    format.turbo_stream do
      render turbo_stream: turbo_stream.replace(
        dom_id(@recommendation),
        partial: 'crm/site_map_recommendations/recommendation_row',
        locals: { recommendation: @recommendation }
      )
    end
    format.html { redirect_back_or_to site_map_path(@recommendation.site_map) }
  end
end