From ea33a150c03bc27120bff8d4a289dc7a89061f59 Mon Sep 17 00:00:00 2001 From: Blake Erickson Date: Mon, 9 Sep 2024 16:03:20 -0600 Subject: [PATCH] FIX: If a group is deleted also remove assignments This fix addresses an issue if a group is deleted topics will remain assigned to all group members with no way to un-assign those users from the original group assignment. Now if a group is deleted any group assignments are also deleted. --- plugin.rb | 9 +++++++++ spec/plugin_spec.rb | 28 ++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/plugin.rb b/plugin.rb index c71d4495..ba8c9e1e 100644 --- a/plugin.rb +++ b/plugin.rb @@ -872,6 +872,15 @@ module ::DiscourseAssign end end + on(:group_destroyed) do |group, user_ids| + user_ids.each do |user_id| + user = User.find(user_id) + user.notifications.for_assignment(group.assignments.select(:id)).destroy_all if user + end + + Assignment.active_for_group(group).destroy_all + end + register_search_advanced_filter(/in:assigned/) do |posts| posts.where(<<~SQL) if @guardian.can_assign? topics.id IN ( diff --git a/spec/plugin_spec.rb b/spec/plugin_spec.rb index fd69debb..01d40b4b 100644 --- a/spec/plugin_spec.rb +++ b/spec/plugin_spec.rb @@ -146,5 +146,33 @@ expect_job_enqueued(job: Jobs::AssignNotification, args: { assignment_id: assignment.id }) end end + + describe "on 'group_destroyed'" do + let(:group) { Fabricate(:group) } + let(:user) { Fabricate(:user) } + let(:first_assignment) { Fabricate(:topic_assignment, assigned_to: group) } + let(:second_assignment) { Fabricate(:post_assignment, assigned_to: group) } + + before do + group.users << user + Fabricate( + :notification, + notification_type: Notification.types[:assigned], + user: user, + data: { assignment_id: first_assignment.id }.to_json, + ) + Fabricate( + :notification, + notification_type: Notification.types[:assigned], + user: user, + data: { assignment_id: second_assignment.id }.to_json, + ) + end + + it "removes user's notifications related to group assignments" do + + expect { group.destroy }.to change { user.notifications.assigned.count }.by(-2) + end + end end end