Class: Admin::AdminController

Inherits:
CrmController show all
Defined in:
app/controllers/admin/admin_controller.rb

Overview

Admin testing controller for various framework features and diagnostics.

Provides test pages for simple forms, stimulus integration, search, cache status,
exception reporting, and X-Sendfile functionality. Also includes admin action
handlers for system-wide operations (cache refresh, exchange rates, deliveries).

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

#auto_ship_confirm_deliveriesvoid

This method returns an undefined value.

Auto-confirms deliveries pending ship confirmation.

Processes any Delivery records waiting for automatic ship confirmation.
Requires :manage authorization on Delivery.



211
212
213
214
215
216
# File 'app/controllers/admin/admin_controller.rb', line 211

def auto_ship_confirm_deliveries
  authorize! :manage, Delivery
  Delivery.auto_ship_confirm
  flash[:info] = 'Any deliveries pending ship confirm are now being processed.'
  redirect_to action: :index
end

#cache_statusvoid

This method returns an undefined value.

Renders the cache and Redis connection diagnostics page.

Gathers and displays information about Redis connectivity, latency,
and server info across all services (sessions, Sidekiq, Action Cable, etc.).



117
118
119
120
# File 'app/controllers/admin/admin_controller.rb', line 117

def cache_status
  @cache_info = gather_cache_status
  @redis_connections = gather_redis_connections
end

#check_for_receiptsvoid

This method returns an undefined value.

Checks for pending receipts against unsettled orders.

Queries for invoices that should have receipts and processes any found.



157
158
159
160
161
# File 'app/controllers/admin/admin_controller.rb', line 157

def check_for_receipts
  Order.check_for_receipts
  flash[:info] = 'Any unsettled orders are being checked to see if all invoices are paid'
  redirect_to action: :index
end

#exception_testvoid

This method returns an undefined value.

Renders the exception testing page for AppSignal diagnostics.

Allows manual triggering of various exception types to verify error reporting.
Requires :manage authorization on Employee.



300
301
302
# File 'app/controllers/admin/admin_controller.rb', line 300

def exception_test
  authorize! :manage, Employee
end

#flush_cachevoid

This method returns an undefined value.

Clears the Rails cache (Redis).

Only allowed for admin users. Requires :manage authorization on ExchangeRate.



192
193
194
195
196
197
198
199
200
201
202
203
# File 'app/controllers/admin/admin_controller.rb', line 192

def flush_cache
  if .has_role?('admin')
    Rails.cache.clear
    flash[:info] = 'Successfully flushed redis'
    redirect_to action: :index
  else
    head :forbidden
  end
rescue StandardError => e
  flash[:error] = "Could not flush cache: #{e}"
  redirect_to action: :index
end

#get_all_exchange_ratesvoid

This method returns an undefined value.

Fetches all missing historical exchange rates.

Requires :manage authorization on ExchangeRate.



180
181
182
183
184
185
# File 'app/controllers/admin/admin_controller.rb', line 180

def get_all_exchange_rates
  authorize! :manage, ExchangeRate
  ExchangeRate.get_all_exchange_rates
  flash[:info] = 'Missing exchange rates have been downloaded'
  redirect_to action: :index
end

#get_exchange_rates_for_todayvoid

This method returns an undefined value.

Fetches and updates exchange rates for today.

Requires :manage authorization on ExchangeRate.



168
169
170
171
172
173
# File 'app/controllers/admin/admin_controller.rb', line 168

def get_exchange_rates_for_today
  authorize! :manage, ExchangeRate
  ExchangeRate.get_exchange_rates_for_today
  flash[:info] = 'Exchange rate has been downloaded'
  redirect_to action: :index
end

#indexObject

Renders the admin dashboard home page.



123
# File 'app/controllers/admin/admin_controller.rb', line 123

def index; end

#invoice_shipped_deliveriesvoid

This method returns an undefined value.

Queues shipped deliveries for invoicing.

Enqueues a background job to invoice all deliveries marked as shipped.
Requires :manage authorization on Invoice.



224
225
226
227
228
229
230
# File 'app/controllers/admin/admin_controller.rb', line 224

def invoice_shipped_deliveries
  authorize! :manage, Invoice
  Delivery.invoice_shipped_deliveries
  flash[:info] =
    'Shipped deliveries have been queued for invoicing, process may take a few minutes to complete.'
  redirect_to action: :index
end

#process_shipped_deliveriesvoid

This method returns an undefined value.

Processes all shipped deliveries ready for invoicing.

Invokes the delivery invoicing workflow for any deliveries marked as shipped.
Requires :manage authorization on Invoice.



131
132
133
134
135
136
137
# File 'app/controllers/admin/admin_controller.rb', line 131

def process_shipped_deliveries
  authorize! :manage, Invoice

  Delivery.invoice_shipped_deliveries
  flash[:info] = 'Any shipped deliveries are now being processed'
  redirect_to action: :index
end

#reconcile_committed_itemsvoid

This method returns an undefined value.

Reconciles committed inventory counts.

Consolidates inventory commitments across all store items.
Requires :manage authorization on StoreItem.



145
146
147
148
149
150
# File 'app/controllers/admin/admin_controller.rb', line 145

def reconcile_committed_items
  authorize! :manage, StoreItem
  Item::InventoryCommitter.consolidate_commit_counts
  flash[:info] = 'Item reconciliation complete'
  redirect_to action: :index
end

#refresh_all_specsvoid

This method returns an undefined value.

Queues product specification updates for all items.

Enqueues async jobs to refresh rendered product specifications.
Requires :manage authorization on Item.



253
254
255
256
257
258
# File 'app/controllers/admin/admin_controller.rb', line 253

def refresh_all_specs
  authorize! :manage, Item
  count = Item.async_update_all_items_product_specifications
  flash[:info] = "Specs queued for #{count} items"
  redirect_to action: :index
end

#refresh_cache_blog_postsvoid

This method returns an undefined value.

Refreshes cache for all blog posts.

Touches all Post records to trigger cache invalidation and refresh.
Requires :manage authorization on Post.



282
283
284
285
286
287
288
289
# File 'app/controllers/admin/admin_controller.rb', line 282

def refresh_cache_blog_posts
  authorize! :manage, Post
  Post.find_each(&:touch)
  flash[:info] = 'Cache has been refreshed'
  redirect_to action: :index
rescue StandardError => e
  flash[:error] = "Could not refresh cache: #{e}"
end

#refresh_cache_product_linesvoid

This method returns an undefined value.

Refreshes cache for all product lines and items.

Touches all ProductLine and Item records to trigger cache refresh.
Requires :manage authorization on Item.



266
267
268
269
270
271
272
273
274
# File 'app/controllers/admin/admin_controller.rb', line 266

def refresh_cache_product_lines
  authorize! :manage, Item
  ProductLine.touch_all
  Item.touch_all
  flash[:info] = 'Cache has been refreshed'
  redirect_to action: :index
rescue StandardError => e
  flash[:error] = "Could not refresh cache: #{e}"
end

#refresh_cache_showcasesvoid

This method returns an undefined value.

Refreshes cache for all showcases.

Touches all Showcase records to trigger cache invalidation and refresh.
Requires :manage authorization on Showcase.



238
239
240
241
242
243
244
245
# File 'app/controllers/admin/admin_controller.rb', line 238

def refresh_cache_showcases
  authorize! :manage, Showcase
  Showcase.find_each(&:touch)
  flash[:info] = 'Cache has been refreshed'
  redirect_to action: :index
rescue StandardError => e
  flash[:error] = "Could not refresh cache: #{e}"
end

#search_testObject

Tests the full-text search against the Party database.

Compares lookup results against known good party IDs to verify search accuracy.
Requires admin authorization.



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
# File 'app/controllers/admin/admin_controller.rb', line 30

def search_test
  authorize! :search_test, Employee
  # A full database is required to test a solid text search methodology.  But
  # in automated testing this is not possible
  # So a simple web portal will display the result against various test cases

  names = { 'We Floors' => 156_336,
            "Don's Floor Covering" => 119_642,
            'DirectBuy Cincinnati' => 122_491,
            'directbuy cin*' => 122_491,
            'dir* cin*' => 122_491,
            'DirectBuy Gaithersburg' => 123_584,
            'directbuy gaith*' => 123_584,
            'Prosource of Monroeville' => 133_439,
            'Amy Bronzonie' => 180_273,
            'Amy Bronz*' => 180_273,
            'M A K Interiors' => 44_068,
            'MAK Interiors' => 44_068,
            'Design Kitchen and Bath' => 49_508 }

  @results = []
  names.each do |n, pid|
    res = Party.lookup(n).limit(5)
    @results << { original: n, results: res.map do |p|
                                          "#{p.full_name} [#{p.id}]"
                                        end, success: res.any? do |p|
                                                        p.id == pid
                                                      end }
  end
  render layout: false
end

#sendfile_testvoid

This method returns an undefined value.

Renders the X-Sendfile acceleration diagnostics page.

Displays configured X-Sendfile header and storage path for file acceleration testing.
Requires :manage authorization on Employee.



310
311
312
313
314
315
# File 'app/controllers/admin/admin_controller.rb', line 310

def sendfile_test
  authorize! :manage, Employee
  @storage_path = Rails.application.config.x.temp_storage_path
  @sendfile_header = Rails.application.config.action_dispatch.x_sendfile_header
  @acceleration_enabled = @sendfile_header.present? && @storage_path.present?
end

#sendfile_test_downloadvoid

This method returns an undefined value.

Generates and serves a test file via X-Sendfile acceleration.

Creates a temporary test file and serves it using send_file_accelerated to verify
the full end-to-end X-Sendfile chain works correctly.
Requires :manage authorization on Employee.



324
325
326
327
328
329
330
331
332
333
334
335
336
# File 'app/controllers/admin/admin_controller.rb', line 324

def sendfile_test_download
  authorize! :manage, Employee
  # Write a stable file into the X-Sendfile scratch dir, mirroring how real
  # callers (e.g. publication PDFs) place their file there. send_file_accelerated
  # serves it in place; a container recycle / cleanup sweep removes it later.
  #
  # The filename is namespaced by PID so concurrent writers (Puma workers in
  # prod, or parallel :processes test workers sharing tmp/storage) never collide
  # on, or clean up, each other's in-flight files.
  path = Rails.application.config.x.temp_storage_path.join("sendfile_test_#{Process.pid}_#{SecureRandom.hex(8)}.txt")
  File.write(path, "X-Sendfile test — generated at #{Time.current}\nServer: #{request.host}\nEnvironment: #{Rails.env}\n")
  send_file_accelerated(path.to_s, download: true, mime_type: 'text/plain', file_name: 'sendfile_test.txt')
end

#simple_formObject

Renders a simple form test page with model validation errors.



10
11
12
13
14
# File 'app/controllers/admin/admin_controller.rb', line 10

def simple_form
  # Create a model with error
  @customer = Customer.new
  @customer.save
end

#simple_form_verticalObject

Renders a simple form test page with vertical layout.



17
18
19
20
21
# File 'app/controllers/admin/admin_controller.rb', line 17

def simple_form_vertical
  # Create a model with error
  @customer = Customer.new
  @customer.save
end

#statusObject

Renders the system status diagnostics page.



109
# File 'app/controllers/admin/admin_controller.rb', line 109

def status; end

#stimulus_formObject

Renders a stimulus JavaScript integration test page.



24
# File 'app/controllers/admin/admin_controller.rb', line 24

def stimulus_form; end

#testObject

Renders the admin test page.



292
# File 'app/controllers/admin/admin_controller.rb', line 292

def test; end

#youtubeObject

Renders the YouTube integration test page.



63
# File 'app/controllers/admin/admin_controller.rb', line 63

def youtube; end

This method returns an undefined value.

Displays available YouTube videos ready for linking to posts.

Fetches the list of discoverable videos from the YouTube API and caches
the results in the view.

Raises:



73
74
75
76
77
78
79
# File 'app/controllers/admin/admin_controller.rb', line 73

def youtube_auto_link
  service = YouTube::AutoLinkService.new
  @matches = service.discover_matches
rescue YouTube::OauthService::TokenRefreshError, YouTube::ApiClient::ApiError => e
  @matches = []
  flash.now[:alert] = "YouTube API error: #{e.message}"
end

This method returns an undefined value.

Links selected YouTube videos to posts.

Processes the user's video selection from the discovery list and invokes
the linking service for each selection. Redirects back with confirmation
count.



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'app/controllers/admin/admin_controller.rb', line 88

def youtube_link_selected
  links = params[:links]&.select { |_yt_id, video_id| video_id.present? } || {}

  if links.empty?
    redirect_to admin_youtube_auto_link_path, alert: 'No videos selected.'
    return
  end

  service = YouTube::AutoLinkService.new
  linked = 0
  links.each do |youtube_id, video_id|
    service.link!(video_id.to_i, youtube_id)
    linked += 1
  rescue StandardError => e
    Rails.logger.error("[YouTubeAutoLink] Failed to link video #{video_id} to #{youtube_id}: #{e.message}")
  end

  redirect_to admin_youtube_path, notice: "Linked #{linked} video(s) to YouTube. Metadata sync queued."
end