refactor(profile): generalize profile from referrer or for user

This commit is contained in:
Colin Darie 2024-09-11 12:09:21 +02:00
parent 8a54650f93
commit 0309e0f6b2
No known key found for this signature in database
GPG key ID: 4FB865FDBCA4BCC4
5 changed files with 47 additions and 17 deletions

View file

@ -2,6 +2,7 @@
class ApplicationController < ActionController::Base class ApplicationController < ActionController::Base
include TrustedDeviceConcern include TrustedDeviceConcern
include NavBarProfileConcern
include Pundit::Authorization include Pundit::Authorization
include Devise::StoreLocationExtension include Devise::StoreLocationExtension
include ApplicationController::LongLivedAuthenticityToken include ApplicationController::LongLivedAuthenticityToken
@ -422,17 +423,6 @@ class ApplicationController < ActionController::Base
prepend_view_path "app/custom_views" prepend_view_path "app/custom_views"
end end
def try_nav_bar_profile_from_referrer
# detect context from referer, simple (no detection when refreshing the page)
params = Rails.application.routes.recognize_path(request&.referer)
controller_class = "#{params[:controller].camelize}Controller".safe_constantize
return if controller_class.nil?
controller_instance = controller_class.new
controller_instance.try(:nav_bar_profile)
end
def cast_bool(value) def cast_bool(value)
ActiveRecord::Type::Boolean.new.deserialize(value) ActiveRecord::Type::Boolean.new.deserialize(value)
end end

View file

@ -0,0 +1,44 @@
# frozen_string_literal: true
module NavBarProfileConcern
extend ActiveSupport::Concern
included do
# Override this method on controller basis for more precise context or custom logic
def nav_bar_profile
end
def fallback_nav_bar_profile
return :guest if current_user.blank?
nav_bar_profile_from_referrer || default_nav_bar_profile_for_user
end
private
# Shared controllers (search, errors, release notes…) don't have specific context
# Simple attempt to try to re-use the profile from the previous page
# so user does'not feel lost.
def nav_bar_profile_from_referrer
# detect context from referer, simple (no detection when refreshing the page)
params = Rails.application.routes.recognize_path(request&.referer)
controller_class = "#{params[:controller].camelize}Controller".safe_constantize
return if controller_class.nil?
controller_instance = controller_class.new
controller_instance.try(:nav_bar_profile)
end
# Fallback for shared controllers from user account
# to the more relevant profile.
def default_nav_bar_profile_for_user
return :gestionnaire if current_user.gestionnaire?
return :administrateur if current_user.administrateur?
return :instructeur if current_user.instructeur?
return :expert if current_user.expert?
:user
end
end
end

View file

@ -1,8 +1,6 @@
# frozen_string_literal: true # frozen_string_literal: true
class ErrorsController < ApplicationController class ErrorsController < ApplicationController
def nav_bar_profile = try_nav_bar_profile_from_referrer
rescue_from Exception do rescue_from Exception do
# catch any error, except errors triggered by middlewares outside controller (like warden middleware) # catch any error, except errors triggered by middlewares outside controller (like warden middleware)
render file: Rails.public_path.join('500.html'), layout: false, status: :internal_server_error render file: Rails.public_path.join('500.html'), layout: false, status: :internal_server_error

View file

@ -23,8 +23,6 @@ class ReleaseNotesController < ApplicationController
render "scrollable_list" if params[:page].present? render "scrollable_list" if params[:page].present?
end end
def nav_bar_profile = try_nav_bar_profile_from_referrer
private private
def touch_default_categories_seen_at def touch_default_categories_seen_at

View file

@ -1,5 +1,5 @@
-# We can't use &. because the controller may not implement #nav_bar_profile -# We can't use &. or as helper methods because the controllers from view specs does not implement these methods
- nav_bar_profile = controller.try(:nav_bar_profile) || :guest - nav_bar_profile = controller.try(:nav_bar_profile) || controller.try(:fallback_nav_bar_profile) || :guest
- dossier = controller.try(:dossier_for_help) - dossier = controller.try(:dossier_for_help)
- procedure = controller.try(:procedure_for_help) - procedure = controller.try(:procedure_for_help)
- is_instructeur_context = nav_bar_profile == :instructeur && instructeur_signed_in? - is_instructeur_context = nav_bar_profile == :instructeur && instructeur_signed_in?