Skip to content

Commit

Permalink
Merge pull request #14964 from krauselukas/align_is_moderator_method
Browse files Browse the repository at this point in the history
Align `is_moderator?` method and report pundit policies
  • Loading branch information
krauselukas committed Oct 4, 2023
2 parents 91bf816 + 86327d2 commit ffe5a31
Show file tree
Hide file tree
Showing 11 changed files with 71 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ def update
notifications: paginated_notifications,
selected_filter: selected_filter,
show_read_all_button: show_read_all_button?,
show_reports: Flipper.enabled?(:content_moderation, User.session) && User.session.is_moderator?
show_reports: ReportPolicy.new(User.session, Report).notify?
}
end
end
Expand Down
2 changes: 1 addition & 1 deletion src/api/app/jobs/send_event_emails_job.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ def send_email(subscribers, event)

def event_subscribers(event:)
if event.is_a?(Event::CreateReport)
event.subscribers.filter_map { |subscriber| subscriber if Flipper.enabled?(:content_moderation, subscriber) && subscriber.is_moderator? }
event.subscribers.filter_map { |subscriber| subscriber if ReportPolicy.new(subscriber, Report).notify? }
else
event.subscribers
end
Expand Down
5 changes: 3 additions & 2 deletions src/api/app/models/event_subscription/form.rb
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,9 @@ def find_or_initialize_subscription(eventtype, receiver_role, channel)

def show_form_for_create_report_event?(event_class:, subscriber:)
if event_class.name == 'Event::CreateReport'
return false unless subscriber.try(:is_moderator?)
return false unless Flipper.enabled?(:content_moderation, subscriber)
# There is no subscriber for the global subscription configuration
return false if subscriber.blank?
return false unless ReportPolicy.new(subscriber, Report).notify?
end

true
Expand Down
2 changes: 1 addition & 1 deletion src/api/app/models/user.rb
Original file line number Diff line number Diff line change
Expand Up @@ -409,7 +409,7 @@ def is_nobody?
end

def is_moderator?
is_admin? || is_staff?
roles.exists?(title: 'Moderator')
end

def is_active?
Expand Down
5 changes: 3 additions & 2 deletions src/api/app/policies/comment_policy.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,11 @@ def reply?
!(user.blank? || user.is_nobody? || record.user.is_nobody?)
end

# Only logged-in Admins of Staff members can moderate comments
# Only logged-in Admins/Staff members or user with moderator role can moderate comments
def moderate?
return false if record.user.is_nobody? # soft-deleted comments
return true if user.try(:is_admin?) || user.try(:is_staff?)
return false if user == record.user
return true if user.try(:is_moderator?) || user.try(:is_admin?) || user.try(:is_staff?)

false
end
Expand Down
2 changes: 1 addition & 1 deletion src/api/app/policies/decision_policy.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@ class DecisionPolicy < ApplicationPolicy
def create?
return false unless Flipper.enabled?(:content_moderation, user)

user.is_admin? || user.is_moderator?
user.is_moderator? || user.is_admin? || user.is_staff?
end
end
8 changes: 8 additions & 0 deletions src/api/app/policies/report_policy.rb
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,12 @@ def create?
!UserPolicy.new(user, record.reportable).update?
end
end

def notify?
return false unless Flipper.enabled?(:content_moderation, user)
return true if User.moderators.blank? && (user.is_admin? || user.is_staff?)
return true if user.is_moderator?

false
end
end
15 changes: 6 additions & 9 deletions src/api/app/services/notification_service/notifier.rb
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,12 @@ def create_notification?(subscriber, channel)
true
end

def create_report_notification?(event:, subscriber:)
return false if event.is_a?(Event::CreateReport) && !ReportPolicy.new(subscriber, Report).notify?

true
end

def notifiable_exists?
# We need this check because the notification is created in a delayed job.
# So the notifiable object could have been removed in the meantime.
Expand All @@ -70,14 +76,5 @@ def notifiable_exists?
notifiable_id = @event.parameters_for_notification[:notifiable_id]
notifiable_type.exists?(notifiable_id)
end

def create_report_notification?(event:, subscriber:)
if event.is_a?(Event::CreateReport)
return false unless Flipper.enabled?(:content_moderation, subscriber)
return false unless subscriber.is_moderator?
end

true
end
end
end
4 changes: 4 additions & 0 deletions src/api/spec/factories/users.rb
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,10 @@
roles { [Role.find_by_title('Staff')] }
end

factory :moderator do
roles { [Role.find_by_title('Moderator')] }
end

factory :user_with_groups do
after(:create) do |user|
create(:group, users: [user])
Expand Down
8 changes: 8 additions & 0 deletions src/api/spec/policies/comment_policy_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,14 @@
expect(subject).to permit(staff_user, comment)
end
end

context 'when the user has the moderator role assigned' do
let(:user_with_moderator_role) { create(:moderator) }

it 'can moderate comments' do
expect(subject).to permit(user_with_moderator_role, comment)
end
end
end
# rubocop:enable RSpec/RepeatedExample
end
39 changes: 35 additions & 4 deletions src/api/spec/policies/report_policy_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@

let(:user) { create(:confirmed_user) }

before do
Flipper.enable(:content_moderation)
end

permissions :show? do
context 'when the current user is the owner of the report' do
let(:report) { create(:report, user: user) }
Expand All @@ -27,10 +31,6 @@
end

permissions :create? do
before do
Flipper.enable(:content_moderation, user)
end

context 'when the current user has already reported it' do
let(:reported_comment) { create(:comment_package) }
let(:report) { build(:report, user: user, reportable: reported_comment) }
Expand Down Expand Up @@ -101,4 +101,35 @@
end
end
end

permissions :notify? do
let(:staff_user) { create(:staff_user) }
let(:admin_user) { create(:admin_user) }

context 'when there is no user with moderator role' do
it 'notifies admin users' do
expect(subject).to permit(admin_user, Report)
end

it 'notifies staff users' do
expect(subject).to permit(staff_user, Report)
end
end

context 'when there is a user with moderator role' do
let!(:moderator_user) { create(:moderator) }

it 'does not notify admin users' do
expect(subject).not_to(permit(admin_user, Report))
end

it 'does not notify staff users' do
expect(subject).not_to(permit(staff_user, Report))
end

it 'notifies the moderator' do
expect(subject).to permit(moderator_user, Report)
end
end
end
end

0 comments on commit ffe5a31

Please sign in to comment.