class ApplicationController < ActionController::Base include ErrorReporting before_action :set_paper_trail_whodunnit before_action :sentry_context, if: :current_user before_action :initialize_cache_counters before_action :try_rack_mini_profiler_enable before_action :track_request before_action :enforce_lockout before_action :set_cache_headers around_action :switch_time_zone, if: :current_user def switch_time_zone(&block) Time.use_zone(current_user.timezone, &block) end # Only allow modern browsers supporting webp images, web push, badges, import maps, CSS nesting, and CSS :has. # allow_browser versions: :modern helper_method :current_user, :user_signed_in?, :active_users_graph_data private def sentry_context Sentry.set_user( id: current_user.id, username: current_user.username ) Sentry.set_extras( user_agent: request.user_agent, ip_address: request.headers["CF-Connecting-IP"] || request.remote_ip ) end def track_request RequestCounter.increment end def try_rack_mini_profiler_enable if current_user && (current_user.admin_level == "admin" || current_user.admin_level == "superadmin") Rack::MiniProfiler.authorize_request end end def current_user @current_user ||= User.find_by(id: session[:user_id]) if session[:user_id] end def user_signed_in? !!current_user end def safe_return_url(url) return nil if url.blank? return nil unless url.start_with?("/") && !url.start_with?("//") url end def authenticate_user! unless user_signed_in? redirect_to root_path, alert: "Please sign in first!" end end def enforce_lockout return unless current_user&.pending_deletion? return if %w[deletion_requests sessions].include?(controller_name) redirect_to deletion_path end def set_cache_headers response.headers["Cache-Control"] = "no-store" end def initialize_cache_counters Thread.current[:cache_hits] = 0 Thread.current[:cache_misses] = 0 end def increment_cache_hits Thread.current[:cache_hits] += 1 end def increment_cache_misses Thread.current[:cache_misses] += 1 end def active_users_graph_data Cache::ActiveUsersGraphDataJob.perform_now end end