DEV: Update group moderator behavior to better mimic staff (#19618)

# Context
When a topic is reviewable by a group we give those group moderators some admin abilities including the ability to delete a topic.

# Problem
There are two main problems:

1. Currently when a group moderator deletes a topic they are redirected to root (not the same for staff)
2. Viewing the categories deleted topics (`c/foo/1/?status=deleted`) does not display the deleted topic to the group moderator (not the same for staff).

# Fix
If the `deleted_by` user is part a group that matches the `reviewable_by_group` on a topic then don't redirect. This is the default interaction for staff to give them the ability to do things like restore the topic in case it was accidentally deleted.

To render the deleted topics as expected for the group moderator I am utilizing [the guardian scope of `guardian.can_see_deleted_topics?` for said category](https://github.com/discourse/discourse/pull/19618/files#diff-288e61b8bacdb29d9c2e05b42da6837b0036dcf1867332d977ca7c5e74a44297R802-R803)
This commit is contained in:
Isaac Janzen 2022-12-29 10:07:03 -06:00 committed by GitHub
parent 7e33cb3665
commit e5349e43af
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 15 additions and 4 deletions

View File

@ -467,7 +467,12 @@ const Topic = RestModel.extend({
"details.can_permanently_delete":
this.siteSettings.can_permanently_delete && deleted_by.admin,
});
if (!deleted_by.staff) {
if (
!deleted_by.staff &&
!deleted_by.groups.some(
(group) => group.name === this.category.reviewable_by_group_name
)
) {
DiscourseURL.redirectTo("/");
}
})

View File

@ -799,8 +799,8 @@ class TopicQuery
when 'unlisted'
result = result.where('NOT topics.visible')
when 'deleted'
guardian = @guardian
if guardian.is_staff?
category = Category.find_by(id: options[:category])
if @guardian.can_see_deleted_topics?(category)
result = result.where('topics.deleted_at IS NOT NULL')
require_deleted_clause = false
end

View File

@ -226,10 +226,16 @@ RSpec.describe TopicQuery do
describe 'deleted filter' do
it "filters deleted topics correctly" do
_topic = Fabricate(:topic, deleted_at: 1.year.ago)
SiteSetting.enable_category_group_moderation = true
group_moderator = Fabricate(:user)
group = Fabricate(:group)
group.add(group_moderator)
category = Fabricate(:category, reviewable_by_group: group)
topic = Fabricate(:topic, category: category, deleted_at: 1.year.ago)
expect(TopicQuery.new(admin, status: 'deleted').list_latest.topics.size).to eq(1)
expect(TopicQuery.new(moderator, status: 'deleted').list_latest.topics.size).to eq(1)
expect(TopicQuery.new(group_moderator, status: 'deleted', category: category.id).list_latest.topics.size).to eq(1)
expect(TopicQuery.new(user, status: 'deleted').list_latest.topics.size).to eq(0)
expect(TopicQuery.new(nil, status: 'deleted').list_latest.topics.size).to eq(0)
end