Skip to content

Commit

Permalink
Extract UserUpdatePermissionBuilder
Browse files Browse the repository at this point in the history
This commit moves the identical build_user_update_params method from
each of the three controllers into a class. I think this is an
improvement as it ensures that the business logic is defined in a
single place and can't drift out of sync.

The implementation of this method is currently covered by the
controller tests but in a subsequent commit I'll introduce some unit
tests for this class to help reduce the duplication in the controller
tests.
  • Loading branch information
chrislo committed Jan 23, 2024
1 parent 907e12c commit 451b26a
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 27 deletions.
15 changes: 6 additions & 9 deletions app/controllers/account/permissions_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,12 @@ def edit
def update
authorize [:account, @application], :edit_permissions?

supported_permission_ids = build_user_update_params(current_user, @permissions.pluck(:id), update_params[:supported_permission_ids].map(&:to_i))
supported_permission_ids = UserUpdatePermissionBuilder.new(
user: current_user,
updatable_permission_ids: @permissions.pluck(:id),
selected_permission_ids: update_params[:supported_permission_ids].map(&:to_i),
).build

UserUpdate.new(current_user, { supported_permission_ids: }, current_user, user_ip_address).call

flash[:application_id] = @application.id
Expand All @@ -38,12 +43,4 @@ def set_application
def set_permissions
@permissions = @application.sorted_supported_permissions_grantable_from_ui(include_signin: false)
end

def build_user_update_params(user, updatable_permission_ids, selected_permission_ids)
permissions_user_has = user.supported_permissions.pluck(:id)
permissions_to_add = updatable_permission_ids.intersection(selected_permission_ids)
permissions_to_remove = updatable_permission_ids.difference(selected_permission_ids)

(permissions_user_has + permissions_to_add - permissions_to_remove).sort
end
end
15 changes: 6 additions & 9 deletions app/controllers/api_users/permissions_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,12 @@ def edit
def update
authorize @api_user

supported_permission_ids = build_user_update_params(@api_user, @permissions.pluck(:id), update_params[:supported_permission_ids].map(&:to_i))
supported_permission_ids = UserUpdatePermissionBuilder.new(
user: @api_user,
updatable_permission_ids: @permissions.pluck(:id),
selected_permission_ids: update_params[:supported_permission_ids].map(&:to_i),
).build

UserUpdate.new(@api_user, { supported_permission_ids: }, current_user, user_ip_address).call

flash[:application_id] = @application.id
Expand All @@ -35,12 +40,4 @@ def set_application
def set_permissions
@permissions = @application.sorted_supported_permissions_grantable_from_ui(include_signin: false)
end

def build_user_update_params(user, updatable_permission_ids, selected_permission_ids)
permissions_user_has = user.supported_permissions.pluck(:id)
permissions_to_add = updatable_permission_ids.intersection(selected_permission_ids)
permissions_to_remove = updatable_permission_ids.difference(selected_permission_ids)

(permissions_user_has + permissions_to_add - permissions_to_remove).sort
end
end
15 changes: 6 additions & 9 deletions app/controllers/users/permissions_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,12 @@ def edit
def update
authorize UserApplicationPermission.for(@user, @application)

supported_permission_ids = build_user_update_params(@user, @permissions.pluck(:id), update_params[:supported_permission_ids].map(&:to_i))
supported_permission_ids = UserUpdatePermissionBuilder.new(
user: @user,
updatable_permission_ids: @permissions.pluck(:id),
selected_permission_ids: update_params[:supported_permission_ids].map(&:to_i),
).build

UserUpdate.new(@user, { supported_permission_ids: }, current_user, user_ip_address).call

flash[:application_id] = @application.id
Expand All @@ -43,12 +48,4 @@ def set_application
def set_permissions
@permissions = @application.sorted_supported_permissions_grantable_from_ui(include_signin: false)
end

def build_user_update_params(user, updatable_permission_ids, selected_permission_ids)
permissions_user_has = user.supported_permissions.pluck(:id)
permissions_to_add = updatable_permission_ids.intersection(selected_permission_ids)
permissions_to_remove = updatable_permission_ids.difference(selected_permission_ids)

(permissions_user_has + permissions_to_add - permissions_to_remove).sort
end
end
15 changes: 15 additions & 0 deletions app/models/user_update_permission_builder.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
class UserUpdatePermissionBuilder
def initialize(user:, updatable_permission_ids:, selected_permission_ids:)
@user = user
@updatable_permission_ids = updatable_permission_ids
@selected_permission_ids = selected_permission_ids
end

def build
permissions_user_has = @user.supported_permissions.pluck(:id)
permissions_to_add = @updatable_permission_ids.intersection(@selected_permission_ids)
permissions_to_remove = @updatable_permission_ids.difference(@selected_permission_ids)

(permissions_user_has + permissions_to_add - permissions_to_remove).sort
end
end

0 comments on commit 451b26a

Please sign in to comment.