Class: Admin::AdminController

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

Overview

Controller: admin.

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

Constants included from Www::SeoHelper

Www::SeoHelper::AWARDS, Www::SeoHelper::CA_ADDRESS, Www::SeoHelper::CA_BUSINESS_HOURS, Www::SeoHelper::CA_CONTACT_POINT, Www::SeoHelper::CA_CURRENCIES, Www::SeoHelper::CA_DESCRIPTION, Www::SeoHelper::CA_FOUNDING_DATE, Www::SeoHelper::CA_GLOBAL_LOCATION_NUMBER, Www::SeoHelper::CA_LEGAL_NAME, Www::SeoHelper::CA_LOCAL_BUSINESS, Www::SeoHelper::CA_ONLINE_STORE, Www::SeoHelper::CA_RETURN_POLICY, Www::SeoHelper::CA_SALES_DEPARTMENT, Www::SeoHelper::CA_SERVICE_AREA, Www::SeoHelper::CA_URL, Www::SeoHelper::CA_VAT_ID, Www::SeoHelper::CA_WAREHOUSE_DEPARTMENT, Www::SeoHelper::CA_WAREHOUSE_HOURS, Www::SeoHelper::COMPANY_EMAIL, Www::SeoHelper::COMPANY_LOGO, Www::SeoHelper::COMPANY_NAME, Www::SeoHelper::COMPANY_SLOGAN, Www::SeoHelper::EXPERTISE, Www::SeoHelper::FAX_NUMBER, Www::SeoHelper::GS1_COMPANY_PREFIX, Www::SeoHelper::ISO6523_CODE, Www::SeoHelper::PAYMENT_METHODS, Www::SeoHelper::PHONE_NUMBER, Www::SeoHelper::PRIMARY_NAICS, Www::SeoHelper::REFUND_TYPE, Www::SeoHelper::RETURN_FEES, Www::SeoHelper::RETURN_METHOD, Www::SeoHelper::RETURN_POLICY_CATEGORY, Www::SeoHelper::SECONDARY_NAICS, Www::SeoHelper::SOCIAL_PROFILES, Www::SeoHelper::US_ADDRESS, Www::SeoHelper::US_BUSINESS_HOURS, Www::SeoHelper::US_CONTACT_POINT, Www::SeoHelper::US_CURRENCIES, Www::SeoHelper::US_DESCRIPTION, Www::SeoHelper::US_FOUNDING_DATE, Www::SeoHelper::US_GLOBAL_LOCATION_NUMBER, Www::SeoHelper::US_IMAGE, Www::SeoHelper::US_LEGAL_NAME, Www::SeoHelper::US_LOCAL_BUSINESS, Www::SeoHelper::US_ONLINE_STORE, Www::SeoHelper::US_RETURN_POLICY, Www::SeoHelper::US_SALES_DEPARTMENT, Www::SeoHelper::US_SERVICE_AREA, Www::SeoHelper::US_TAX_ID, Www::SeoHelper::US_URL, Www::SeoHelper::US_WAREHOUSE_DEPARTMENT, Www::SeoHelper::US_WAREHOUSE_HOURS

Constants included from IconHelper

IconHelper::CUSTOM_ICON_MAP, IconHelper::CUSTOM_SVG_DIR, IconHelper::DEFAULT_FAMILY

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

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?, #stamp_impersonation_context, #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, #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 ApplicationHelper

#better_number_to_currency, #check_force_logout, #check_or_cross, #check_or_times, #embedded_tab_frame_id, #error_messages, #general_disclaimer_on_product_installation_and_local_codes, #gridjs_from_html_table, #gridjs_table, #is_wy_ip, #line_break, #parent_layout, #pass_or_fail, #render_error_messages_list, #render_video_card, #resolved_auth_form_turbo_frame, #return_path_or, #safe_css_color, #set_return_path_if_present, #set_section_if_present, #tab_frame_id, #to_underscore, #track_page?, #turbo_section_wrapper, #turbo_tabs_request?, #url_on_same_domain_as_request, #widget_index_daily_focus_index_path, #working_hours?, #yes_or_no, #yes_or_no_highlighted, #yes_or_no_with_check_or_cross, #youtube_video

Methods included from UppyUploaderHelper

#file_uploader, #image_uploader, #large_file_uploader_s3, #lead_sketch_uploader, #rma_image_uploader, #rma_image_uploader_s3, #uppy_uploader, #video_uploader

Methods included from Www::ImagesHelper

#image_asset_tag, #image_asset_url

Methods included from Www::SeoHelper

#add_page_schema, #add_webpage_schema, #canada?, #company_social_links, #ensure_context_json, #json_ld_script_tag, #local_business_schema, #online_store_id, #online_store_schema, #page_main_entity, #page_main_entity_json, #render_auto_collection_page_schema, #render_collection_page_schema, #render_local_business_schema, #render_online_store_schema, #render_page_schemas, #render_page_video_schemas, #render_webpage_schema, #render_webpage_schema_with_collections, #usa?

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?

Methods included from IconHelper

#account_nav_icon, #fa_icon, #star_rating_html

Instance Method Details

#auto_ship_confirm_deliveriesObject



138
139
140
141
142
143
# File 'app/controllers/admin/admin_controller.rb', line 138

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_statusObject



83
84
85
86
# File 'app/controllers/admin/admin_controller.rb', line 83

def cache_status
  @cache_info = gather_cache_status
  @redis_connections = gather_redis_connections
end

#check_for_receiptsObject



105
106
107
108
109
# File 'app/controllers/admin/admin_controller.rb', line 105

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_testObject

Exception testing page for verifying AppSignal error reporting
GET /admin/exception_test



192
193
194
# File 'app/controllers/admin/admin_controller.rb', line 192

def exception_test
  authorize! :manage, Employee
end

#flush_cacheObject



125
126
127
128
129
130
131
132
133
134
135
136
# File 'app/controllers/admin/admin_controller.rb', line 125

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_ratesObject



118
119
120
121
122
123
# File 'app/controllers/admin/admin_controller.rb', line 118

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_todayObject



111
112
113
114
115
116
# File 'app/controllers/admin/admin_controller.rb', line 111

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



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

def index; end

#invoice_shipped_deliveriesObject



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

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_deliveriesObject



90
91
92
93
94
95
96
# File 'app/controllers/admin/admin_controller.rb', line 90

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_itemsObject



98
99
100
101
102
103
# File 'app/controllers/admin/admin_controller.rb', line 98

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

#refresh_all_specsObject



162
163
164
165
166
167
# File 'app/controllers/admin/admin_controller.rb', line 162

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_postsObject



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

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_linesObject



169
170
171
172
173
174
175
176
177
# File 'app/controllers/admin/admin_controller.rb', line 169

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_showcasesObject



153
154
155
156
157
158
159
160
# File 'app/controllers/admin/admin_controller.rb', line 153

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



19
20
21
22
23
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
49
# File 'app/controllers/admin/admin_controller.rb', line 19

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_testObject

X-Sendfile diagnostics page
GET /admin/sendfile_test



198
199
200
201
202
203
# File 'app/controllers/admin/admin_controller.rb', line 198

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_downloadObject

Serves a small generated text file via send_file_accelerated to verify the
full Thruster X-Sendfile chain end-to-end.
GET /admin/sendfile_test/download



208
209
210
211
212
213
214
215
216
217
218
219
220
# File 'app/controllers/admin/admin_controller.rb', line 208

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



5
6
7
8
9
# File 'app/controllers/admin/admin_controller.rb', line 5

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

#simple_form_verticalObject



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

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

#statusObject



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

def status; end

#stimulus_formObject



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

def stimulus_form; end

#testObject



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

def test; end

#youtubeObject



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

def youtube; end


53
54
55
56
57
58
59
# File 'app/controllers/admin/admin_controller.rb', line 53

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


61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'app/controllers/admin/admin_controller.rb', line 61

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