Class: Admin::AdminController
- Inherits:
-
CrmController
- Object
- ActionController::Base
- ApplicationController
- CrmController
- Admin::AdminController
- 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
-
#auto_ship_confirm_deliveries ⇒ void
Auto-confirms deliveries pending ship confirmation.
-
#cache_status ⇒ void
Renders the cache and Redis connection diagnostics page.
-
#check_for_receipts ⇒ void
Checks for pending receipts against unsettled orders.
-
#exception_test ⇒ void
Renders the exception testing page for AppSignal diagnostics.
-
#flush_cache ⇒ void
Clears the Rails cache (Redis).
-
#get_all_exchange_rates ⇒ void
Fetches all missing historical exchange rates.
-
#get_exchange_rates_for_today ⇒ void
Fetches and updates exchange rates for today.
-
#index ⇒ Object
Renders the admin dashboard home page.
-
#invoice_shipped_deliveries ⇒ void
Queues shipped deliveries for invoicing.
-
#process_shipped_deliveries ⇒ void
Processes all shipped deliveries ready for invoicing.
-
#reconcile_committed_items ⇒ void
Reconciles committed inventory counts.
-
#refresh_all_specs ⇒ void
Queues product specification updates for all items.
-
#refresh_cache_blog_posts ⇒ void
Refreshes cache for all blog posts.
-
#refresh_cache_product_lines ⇒ void
Refreshes cache for all product lines and items.
-
#refresh_cache_showcases ⇒ void
Refreshes cache for all showcases.
-
#search_test ⇒ Object
Tests the full-text search against the Party database.
-
#sendfile_test ⇒ void
Renders the X-Sendfile acceleration diagnostics page.
-
#sendfile_test_download ⇒ void
Generates and serves a test file via X-Sendfile acceleration.
-
#simple_form ⇒ Object
Renders a simple form test page with model validation errors.
-
#simple_form_vertical ⇒ Object
Renders a simple form test page with vertical layout.
-
#status ⇒ Object
Renders the system status diagnostics page.
-
#stimulus_form ⇒ Object
Renders a stimulus JavaScript integration test page.
-
#test ⇒ Object
Renders the admin test page.
-
#youtube ⇒ Object
Renders the YouTube integration test page.
-
#youtube_auto_link ⇒ void
Displays available YouTube videos ready for linking to posts.
-
#youtube_link_selected ⇒ void
Links selected YouTube videos to posts.
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
Methods included from Controllers::SubdomainDetection
#is_crm_request?, #is_www_request?, #json_request?
Methods included from Controllers::TurboSafeRedirect
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_deliveries ⇒ void
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 :manage, Delivery Delivery.auto_ship_confirm flash[:info] = 'Any deliveries pending ship confirm are now being processed.' redirect_to action: :index end |
#cache_status ⇒ void
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_receipts ⇒ void
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_test ⇒ void
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 :manage, Employee end |
#flush_cache ⇒ void
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 current_account.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_rates ⇒ void
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 :manage, ExchangeRate ExchangeRate.get_all_exchange_rates flash[:info] = 'Missing exchange rates have been downloaded' redirect_to action: :index end |
#get_exchange_rates_for_today ⇒ void
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 :manage, ExchangeRate ExchangeRate.get_exchange_rates_for_today flash[:info] = 'Exchange rate has been downloaded' redirect_to action: :index end |
#index ⇒ Object
Renders the admin dashboard home page.
123 |
# File 'app/controllers/admin/admin_controller.rb', line 123 def index; end |
#invoice_shipped_deliveries ⇒ void
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 :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_deliveries ⇒ void
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 :manage, Invoice Delivery.invoice_shipped_deliveries flash[:info] = 'Any shipped deliveries are now being processed' redirect_to action: :index end |
#reconcile_committed_items ⇒ void
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 :manage, StoreItem Item::InventoryCommitter.consolidate_commit_counts flash[:info] = 'Item reconciliation complete' redirect_to action: :index end |
#refresh_all_specs ⇒ void
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 :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_posts ⇒ void
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 :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_lines ⇒ void
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 :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_showcases ⇒ void
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 :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_test ⇒ Object
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 :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_test ⇒ void
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 :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_download ⇒ void
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 :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_form ⇒ Object
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_vertical ⇒ Object
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 |
#status ⇒ Object
Renders the system status diagnostics page.
109 |
# File 'app/controllers/admin/admin_controller.rb', line 109 def status; end |
#stimulus_form ⇒ Object
Renders a stimulus JavaScript integration test page.
24 |
# File 'app/controllers/admin/admin_controller.rb', line 24 def stimulus_form; end |
#test ⇒ Object
Renders the admin test page.
292 |
# File 'app/controllers/admin/admin_controller.rb', line 292 def test; end |
#youtube ⇒ Object
Renders the YouTube integration test page.
63 |
# File 'app/controllers/admin/admin_controller.rb', line 63 def youtube; end |
#youtube_auto_link ⇒ void
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.
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.}" end |
#youtube_link_selected ⇒ void
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.}") end redirect_to admin_youtube_path, notice: "Linked #{linked} video(s) to YouTube. Metadata sync queued." end |