@@ -15,6 +15,9 @@ class UsersController < Admin::ApplicationController
1515 email
1616 ] . freeze
1717
18+ ADMIN_PROFILE_USER_PARAMS = %i[ name username ] . freeze
19+ ADMIN_PROFILE_PROFILE_PARAMS = %i[ summary location website_url ] . freeze
20+
1821 EMAIL_ALLOWED_PARAMS = %i[
1922 email_subject
2023 email_body
@@ -128,6 +131,31 @@ def update_email
128131 redirect_to admin_user_path ( @user )
129132 end
130133
134+ def update_profile
135+ @user = User . find ( params [ :id ] )
136+ previous_user_values = @user . slice ( *ADMIN_PROFILE_USER_PARAMS )
137+ previous_profile_values = ( @user . profile || @user . build_profile ) . slice ( *ADMIN_PROFILE_PROFILE_PARAMS )
138+
139+ update_result = Users ::Update . call ( @user ,
140+ user : admin_profile_user_params ,
141+ profile : admin_profile_params )
142+
143+ if update_result . success?
144+ Note . create (
145+ author_id : current_user . id ,
146+ noteable_id : @user . id ,
147+ noteable_type : "User" ,
148+ reason : "admin_profile_update" ,
149+ content : profile_update_note ( previous_user_values , previous_profile_values ) ,
150+ )
151+ flash [ :success ] = I18n . t ( "views.admin.users.edit_profile.success" )
152+ else
153+ flash [ :error ] = update_result . errors_as_sentence
154+ end
155+
156+ redirect_to admin_user_path ( @user )
157+ end
158+
131159 def max_score
132160 @user = User . find ( params [ :id ] )
133161 max_score_value = user_params [ :max_score ]
@@ -580,6 +608,42 @@ def credit_params
580608 credit_params
581609 end
582610
611+ def admin_profile_user_params
612+ params . require ( :user ) . permit ( ADMIN_PROFILE_USER_PARAMS )
613+ end
614+
615+ def admin_profile_params
616+ params . fetch ( :profile , { } ) . permit ( ADMIN_PROFILE_PROFILE_PARAMS )
617+ end
618+
619+ def profile_update_note ( previous_user_values , previous_profile_values )
620+ changes = [ ]
621+ updated_user_values = @user . slice ( *ADMIN_PROFILE_USER_PARAMS )
622+ updated_profile_values = ( @user . profile || @user . build_profile ) . slice ( *ADMIN_PROFILE_PROFILE_PARAMS )
623+
624+ append_profile_change ( changes , "name" , previous_user_values [ "name" ] , updated_user_values [ "name" ] )
625+ append_profile_change ( changes , "username" , previous_user_values [ "username" ] , updated_user_values [ "username" ] )
626+ append_profile_change ( changes , "summary" , previous_profile_values [ "summary" ] , updated_profile_values [ "summary" ] )
627+ append_profile_change ( changes , "location" , previous_profile_values [ "location" ] , updated_profile_values [ "location" ] )
628+ append_profile_change ( changes , "website_url" , previous_profile_values [ "website_url" ] , updated_profile_values [ "website_url" ] )
629+
630+ if changes . empty?
631+ "Admin #{ current_user . username } submitted a profile update with no changes detected."
632+ else
633+ "Admin #{ current_user . username } updated profile fields: #{ changes . join ( '; ' ) } "
634+ end
635+ end
636+
637+ def append_profile_change ( changes , label , previous_value , updated_value )
638+ return if previous_value == updated_value
639+
640+ changes << "#{ label } : #{ format_profile_value ( previous_value ) } -> #{ format_profile_value ( updated_value ) } "
641+ end
642+
643+ def format_profile_value ( value )
644+ value . present? ? "'#{ value } '" : "(blank)"
645+ end
646+
583647 def set_current_tab ( current_tab = "overview" )
584648 @current_tab = if current_tab . in? Constants ::UserDetails ::TAB_LIST . map ( &:underscore )
585649 current_tab
0 commit comments