class Admin::AdminController < ApplicationController
|
|
|
|
layout 'admin'
|
|
|
|
# The admin has two roles: Admin, who gets everything, and Guest (the `user`
|
|
# role), who gets a read-only slice -- the analytics dashboard and the
|
|
# published leaderboard. Listed by controller name.
|
|
GUEST_SECTIONS = %w[analytics leaderboard].freeze
|
|
|
|
# The nav sections in the order they appear in the sidebar.
|
|
ADMIN_SECTIONS = %i[analytics leaderboard nodes assets].freeze
|
|
|
|
before_action :authenticate_user!
|
|
before_action :only_permitted_section!
|
|
before_action :set_locale_to_default
|
|
|
|
helper_method :current_user
|
|
helper_method :user_signed_in?
|
|
helper_method :form_locale, :available_locales
|
|
helper_method :admin?, :permitted_admin_sections
|
|
|
|
# DELETE admin/cache/clear
|
|
def clear_cache
|
|
Rails.cache.clear
|
|
|
|
respond_to do |format|
|
|
format.turbo_stream { flash.now[:notice] = t(:cache_cleared, scope: 'utils') }
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
|
|
def default_url_options
|
|
{ locale: I18n.locale }
|
|
end
|
|
|
|
|
|
def set_locale_to_default
|
|
I18n.locale = I18n.default_locale
|
|
end
|
|
|
|
|
|
def form_locale
|
|
(params['form_locale'] || I18n.locale).to_s
|
|
end
|
|
|
|
|
|
def available_locales
|
|
@available_locales ||= I18n.available_locales.map(&:to_s).map(&:downcase).map{|v| v.sub('-', '_')}
|
|
end
|
|
|
|
|
|
def authenticate_user!
|
|
unless user_signed_in?
|
|
store_location
|
|
redirect_to admin_sessions_path
|
|
end
|
|
end
|
|
|
|
|
|
def admin?
|
|
current_user&.admin_role?
|
|
end
|
|
|
|
|
|
# What a Guest is allowed to open. Anything else bounces them to analytics
|
|
# rather than out of the admin entirely, so every link in the nav they see
|
|
# actually works and a stray URL doesn't log them out.
|
|
def only_permitted_section!
|
|
return if admin?
|
|
return if GUEST_SECTIONS.include?(controller_name)
|
|
|
|
bounce_guest!
|
|
end
|
|
|
|
|
|
# For the handful of actions inside a Guest section that still change
|
|
# something -- clearing a cache, say. Guests may look, not touch, so this
|
|
# cannot lean on the section check: the section itself is permitted.
|
|
def only_admin!
|
|
return if admin?
|
|
|
|
bounce_guest!
|
|
end
|
|
|
|
|
|
def bounce_guest!
|
|
redirect_to admin_analytics_path(locale: params[:locale] || I18n.default_locale)
|
|
end
|
|
|
|
|
|
def permitted_admin_sections
|
|
return ADMIN_SECTIONS if admin?
|
|
|
|
ADMIN_SECTIONS.select { |section| GUEST_SECTIONS.include?(section.to_s) }
|
|
end
|
|
|
|
|
|
def current_user
|
|
Current.user ||= authenticate_user_from_session
|
|
end
|
|
|
|
|
|
def authenticate_user_from_session
|
|
User.enabled.find_by(id: session[:user_id])
|
|
end
|
|
|
|
|
|
def user_signed_in?
|
|
current_user.present?
|
|
end
|
|
|
|
|
|
def login(user)
|
|
Current.user = user
|
|
reset_session
|
|
user.touch(:last_logon_at)
|
|
session[:user_id] = user.id
|
|
end
|
|
|
|
|
|
def logout(user)
|
|
Current.user = nil
|
|
reset_session
|
|
end
|
|
|
|
|
|
def redirect_back_or_default(default)
|
|
redirect_to(session[:return_to] || default)
|
|
session[:return_to] = nil
|
|
end
|
|
|
|
|
|
def store_location
|
|
session[:return_to] = request.fullpath if request.get?
|
|
end
|
|
|
|
|
|
end
|