diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb index 811d323b2..146a0aecb 100644 --- a/app/controllers/admin/users_controller.rb +++ b/app/controllers/admin/users_controller.rb @@ -33,7 +33,7 @@ module Admin def update @user = User.find(params[:id]) - manage_credits + Credits::Manage.call(@user, user_params) add_note if user_params[:new_note] redirect_to "/admin/users/#{params[:id]}" end @@ -119,13 +119,6 @@ module Admin private - def manage_credits - add_credits if user_params[:add_credits] - add_org_credits if user_params[:add_org_credits] - remove_org_credits if user_params[:remove_org_credits] - remove_credits if user_params[:remove_credits] - end - def add_note Note.create( author_id: current_user.id, @@ -136,28 +129,6 @@ module Admin ) end - def add_credits - amount = user_params[:add_credits].to_i - Credit.add_to(@user, amount) - end - - def remove_credits - amount = user_params[:remove_credits].to_i - Credit.remove_from(@user, amount) - end - - def add_org_credits - org = Organization.find(user_params[:organization_id]) - amount = user_params[:add_org_credits].to_i - Credit.add_to(org, amount) - end - - def remove_org_credits - org = Organization.find(user_params[:organization_id]) - amount = user_params[:remove_org_credits].to_i - Credit.remove_from(org, amount) - end - def set_feedback_messages @related_reports = FeedbackMessage.where(id: @user.reporter_feedback_messages.ids) .or(FeedbackMessage.where(id: @user.affected_feedback_messages.ids)) diff --git a/app/services/credits/manage.rb b/app/services/credits/manage.rb new file mode 100644 index 000000000..edfb88c59 --- /dev/null +++ b/app/services/credits/manage.rb @@ -0,0 +1,60 @@ +module Credits + class Manage + def self.call(user, user_params) + new( + user, + user_params.slice(:add_credits, :remove_credits), + user_params.slice(:organization_id, :add_org_credits, :remove_org_credits), + ).call + end + + def initialize(user, user_params, org_params) + @user = user + @user_params = user_params + @org_params = org_params + end + + def call + add_user_credits + remove_user_credits + add_org_credits + remove_org_credits + end + + private + + attr_reader :user, :user_params, :org_params + + def add_user_credits + return unless user_params[:add_credits] + + amount = user_params[:add_credits].to_i + Credit.add_to(user, amount) + end + + def remove_user_credits + return unless user_params[:remove_credits] + + amount = user_params[:remove_credits].to_i + Credit.remove_from(user, amount) + end + + def add_org_credits + return unless org_params[:add_org_credits] + + amount = org_params[:add_org_credits].to_i + Credit.add_to(organization, amount) + end + + def remove_org_credits + return unless org_params[:remove_org_credits] + + amount = org_params[:remove_org_credits].to_i + Credit.remove_from(organization, amount) + end + + def organization + @organization ||= Organization.find(org_params[:organization_id]) + end + end +end diff --git a/spec/services/credits/manage_spec.rb b/spec/services/credits/manage_spec.rb new file mode 100644 index 000000000..8347e96f2 --- /dev/null +++ b/spec/services/credits/manage_spec.rb @@ -0,0 +1,71 @@ +require "rails_helper" + +RSpec.describe Credits::Manage, type: :service do + describe "When the the service is called" do + subject(:invoke_service) { described_class.call(user, user_params) } + + let(:user) { create(:user) } + let(:organization) { create(:organization) } + + context "when user add an amount of credits" do + let(:user_params) do + { add_credits: "4" } + end + + it "adds user credits" do + expect do + invoke_service + end.to change { user.reload.credits_count }.by(user_params[:add_credits].to_i) + end + end + + context "when user removes the proper amount of credits" do + let(:user_params) do + { remove_credits: "4" } + end + + before do + Credit.add_to(user, 10) + end + + it "removes user credits" do + expect do + invoke_service + end.to change { user.reload.credits_count }.by(user_params[:remove_credits].to_i * -1) + end + end + + context "when remove the proper amount of credits for organizations" do + let(:user_params) do + { remove_org_credits: "6", organization_id: organization.id } + end + + before do + create(:organization_membership, user: user, organization: organization, type_of_user: "admin") + Credit.add_to(organization, 10) + end + + it "removes org credits" do + expect do + invoke_service + end.to change { organization.reload.credits_count }.by(user_params[:remove_org_credits].to_i * -1) + end + end + + context "when adds an amount of credits for organizations" do + let(:user_params) do + { add_org_credits: "7", organization_id: organization.id } + end + + before do + create(:organization_membership, user: user, organization: organization, type_of_user: "admin") + end + + it "adds org credits" do + expect do + invoke_service + end.to change { organization.reload.credits_count }.by(user_params[:add_org_credits].to_i) + end + end + end +end