diff --git a/ee/app/services/ee/groups/group_links/destroy_service.rb b/ee/app/services/ee/groups/group_links/destroy_service.rb index edff33b18e3f2415a819fa59ef140949c00f13f1..9317e3ebc82c2489f4baf2b617292fc5f556540e 100644 --- a/ee/app/services/ee/groups/group_links/destroy_service.rb +++ b/ee/app/services/ee/groups/group_links/destroy_service.rb @@ -9,17 +9,18 @@ module DestroyService override :execute def execute(one_or_more_links, skip_authorization: false) super.tap do |links| - log_audit_events(links) + next unless links.is_a?(Array) + + perform_after_destroy_actions(links) end end private - def log_audit_events(links) - return unless links.is_a?(Array) - + def perform_after_destroy_actions(links) links.each do |link| log_audit_event(link.shared_group, link.shared_with_group) + enqueue_refresh_add_on_assignments_worker(link) end end @@ -36,6 +37,13 @@ def log_audit_event(group, shared_with_group) ::Gitlab::Audit::Auditor.audit(audit_context) end + + def enqueue_refresh_add_on_assignments_worker(link) + return unless ::Feature.enabled?(:hamilton_seat_management) + + GitlabSubscriptions::AddOnPurchases::RefreshUserAssignmentsWorker + .perform_async(link.shared_group.root_ancestor.id) + end end end end diff --git a/ee/app/services/ee/projects/group_links/destroy_service.rb b/ee/app/services/ee/projects/group_links/destroy_service.rb index 6fbea796ba364f1bf64c2e73ce3ad6ed65728343..c0f5219c40068daf7a3803bfdbd6dcb46dd7846f 100644 --- a/ee/app/services/ee/projects/group_links/destroy_service.rb +++ b/ee/app/services/ee/projects/group_links/destroy_service.rb @@ -9,7 +9,11 @@ module DestroyService override :execute def execute(group_link) super.tap do |link| - send_audit_event(link) if link && !link&.persisted? + if link && !link&.persisted? + send_audit_event(link) + + enqueue_refresh_add_on_assignments_woker(link) + end end end @@ -32,6 +36,13 @@ def send_audit_event(group_link) ::Gitlab::Audit::Auditor.audit(audit_context) end + + def enqueue_refresh_add_on_assignments_woker(link) + return unless ::Feature.enabled?(:hamilton_seat_management) + + GitlabSubscriptions::AddOnPurchases::RefreshUserAssignmentsWorker + .perform_async(link.project.root_ancestor.id) + end end end end diff --git a/ee/spec/services/ee/groups/group_links/destroy_service_spec.rb b/ee/spec/services/ee/groups/group_links/destroy_service_spec.rb index fed513392ce6c72301e6469852fb94b8061900f1..e66b3d52f716ac1284ea41b3caf580bdd2a823c5 100644 --- a/ee/spec/services/ee/groups/group_links/destroy_service_spec.rb +++ b/ee/spec/services/ee/groups/group_links/destroy_service_spec.rb @@ -32,6 +32,30 @@ subject.execute(link) end + + context 'for refresh user addon assignments' do + let(:sub_group_shared) { create(:group, :private, parent: shared_group) } + let!(:link) { create(:group_group_link, shared_group: sub_group_shared, shared_with_group: group) } + let(:worker) { GitlabSubscriptions::AddOnPurchases::RefreshUserAssignmentsWorker } + + it 'enqueues RefreshUserAssignmentsWorker with correct arguments' do + expect(worker).to receive(:perform_async).with(sub_group_shared.root_ancestor.id).and_call_original + + subject.execute(link) + end + + context 'when the feature flag is not enabled' do + before do + stub_feature_flags(hamilton_seat_management: false) + end + + it 'does not enqueue CleanupUserAddOnAssignmentWorker' do + expect(worker).not_to receive(:perform_async) + + subject.execute(link) + end + end + end end context 'with multiple links' do @@ -54,5 +78,14 @@ subject.execute(links) end + + it 'enqueues multiple CleanupUserAddOnAssignmentWorker' do + expect(GitlabSubscriptions::AddOnPurchases::RefreshUserAssignmentsWorker).to receive(:perform_async) + .exactly(links.size).times do |arg| + expect(arg).to eq(shared_group.id).or eq(another_shared_group.id) + end.and_call_original + + subject.execute(links) + end end end diff --git a/ee/spec/services/projects/group_links/destroy_service_spec.rb b/ee/spec/services/projects/group_links/destroy_service_spec.rb index 4591a3912c28a28b709cb48cf9cf18a93ff2e1aa..0613051ed8292db3824c8c543ad5686fbbe7a0f3 100644 --- a/ee/spec/services/projects/group_links/destroy_service_spec.rb +++ b/ee/spec/services/projects/group_links/destroy_service_spec.rb @@ -53,4 +53,26 @@ subject.execute(group_link) end end + + context 'for refresh user addon assignments' do + let(:worker) { GitlabSubscriptions::AddOnPurchases::RefreshUserAssignmentsWorker } + + it 'enqueues RefreshUserAssignmentsWorker with correct arguments' do + expect(worker).to receive(:perform_async).with(project.root_ancestor.id).and_call_original + + subject.execute(group_link) + end + + context 'when the feature flag is not enabled' do + before do + stub_feature_flags(hamilton_seat_management: false) + end + + it 'does not enqueue CleanupUserAddOnAssignmentWorker' do + expect(worker).not_to receive(:perform_async) + + subject.execute(group_link) + end + end + end end