@@ -122,24 +122,26 @@ def create
122
122
def update
123
123
unauthorize_guest! if current_user . guest?
124
124
125
- @user = current_user
126
- @user = User . find_by! ( id : params [ :id ] ) unless params [ :id ] == 'current'
127
- @email_before = @user . email
128
- authorize! :update , @user
129
- set_user_fields
130
- set_extra_data
131
- update_email
132
- maybe_update_password
133
- if @user . errors . empty? && @user . save
125
+ User . transaction do
126
+ @user = current_user
127
+ @user = User . find_by! ( id : params [ :id ] ) unless params [ :id ] == 'current'
128
+ @email_before = @user . email
129
+ authorize! :update , @user
130
+ set_user_fields
131
+ set_extra_data ( true )
132
+ update_email
133
+ maybe_update_password
134
+ if !@user . errors . empty? || !@user . save
135
+ raise ActiveRecord ::Rollback
136
+ end
134
137
RecentlyChangedUserDetail . email_changed . create! ( old_value : @email_before , new_value : @user . email ) unless @email_before . casecmp ( @user . email ) . zero?
135
- render json : {
138
+ return render json : {
136
139
message : 'User details updated.'
137
140
}
138
- else
139
- render json : {
140
- errors : @user . errors
141
- } , status : :bad_request
142
141
end
142
+ render json : {
143
+ errors : @user . errors
144
+ } , status : :bad_request
143
145
end
144
146
145
147
private
@@ -206,7 +208,7 @@ def set_user_fields
206
208
changes
207
209
end
208
210
209
- def set_extra_data
211
+ def set_extra_data ( eager_save = false )
210
212
return unless params [ 'user' ]
211
213
extra_fields = params [ 'user' ] [ 'extra_fields' ]
212
214
return if extra_fields . nil?
@@ -215,6 +217,7 @@ def set_extra_data
215
217
extra_fields [ 'data' ] . each do |key , value |
216
218
datum = @user . user_app_data . find_or_initialize_by ( namespace : namespace , field_name : key )
217
219
datum . value = value
220
+ datum . save! if eager_save
218
221
end
219
222
end
220
223
end
0 commit comments