2019-05-02 18:17:27 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2019-10-02 00:01:53 -04:00
|
|
|
class Jobs::NotifyReviewable < ::Jobs::Base
|
2019-01-03 12:03:01 -05:00
|
|
|
def execute(args)
|
2020-08-07 12:13:02 -04:00
|
|
|
return unless reviewable = Reviewable.find_by(id: args[:reviewable_id])
|
2019-01-03 12:03:01 -05:00
|
|
|
|
|
|
|
@contacted = Set.new
|
|
|
|
|
2021-05-25 19:47:35 -04:00
|
|
|
all_updates = Hash.new { |h, k| h[k] = {} }
|
|
|
|
|
|
|
|
if args[:updated_reviewable_ids].present?
|
|
|
|
Reviewable
|
|
|
|
.where(id: args[:updated_reviewable_ids])
|
|
|
|
.each do |r|
|
2021-07-16 12:57:12 -04:00
|
|
|
payload = { last_performing_username: args[:performing_username], status: r.status }
|
2023-01-09 07:20:10 -05:00
|
|
|
|
2021-05-25 19:47:35 -04:00
|
|
|
all_updates[:admins][r.id] = payload
|
|
|
|
all_updates[:moderators][r.id] = payload if r.reviewable_by_moderator?
|
|
|
|
all_updates[r.reviewable_by_group_id][r.id] = payload if r.reviewable_by_group_id
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2023-02-28 16:58:32 -05:00
|
|
|
DistributedMutex.synchronize("notify_reviewable_job", validity: 120) do
|
2023-01-25 15:19:11 -05:00
|
|
|
counts = Hash.new(0)
|
2023-02-28 16:58:32 -05:00
|
|
|
Reviewable
|
|
|
|
.default_visible
|
|
|
|
.pending
|
|
|
|
.group(:reviewable_by_moderator, :reviewable_by_group_id)
|
|
|
|
.pluck(:reviewable_by_moderator, :reviewable_by_group_id, "count(*)")
|
|
|
|
.each do |reviewable_by_moderator, reviewable_by_group_id, count|
|
|
|
|
counts[:admins] += count
|
|
|
|
counts[:moderators] += count if reviewable_by_moderator
|
|
|
|
counts[reviewable_by_group_id] += count if reviewable_by_group_id
|
|
|
|
end
|
2019-01-03 12:03:01 -05:00
|
|
|
|
2023-05-17 12:16:42 -04:00
|
|
|
notify_users(User.real.admins, all_updates[:admins])
|
2022-08-31 14:15:01 -04:00
|
|
|
|
2023-01-25 15:19:11 -05:00
|
|
|
if reviewable.reviewable_by_moderator?
|
2023-05-17 12:16:42 -04:00
|
|
|
notify_users(
|
|
|
|
User.real.moderators.where("id NOT IN (?)", @contacted),
|
|
|
|
all_updates[:moderators],
|
|
|
|
)
|
2020-08-07 12:13:02 -04:00
|
|
|
end
|
2022-08-31 14:15:01 -04:00
|
|
|
|
2023-01-25 15:19:11 -05:00
|
|
|
if SiteSetting.enable_category_group_moderation? && (group = reviewable.reviewable_by_group)
|
|
|
|
users = group.users.includes(:group_users).where("users.id NOT IN (?)", @contacted)
|
|
|
|
|
|
|
|
users.find_each do |user|
|
|
|
|
count = 0
|
|
|
|
updates = {}
|
|
|
|
user.group_users.each do |gu|
|
|
|
|
updates.merge!(all_updates[gu.group_id])
|
|
|
|
count += counts[gu.group_id]
|
|
|
|
end
|
|
|
|
|
2023-05-17 12:16:42 -04:00
|
|
|
notify_user(user, updates)
|
2023-01-25 15:19:11 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
@contacted += users.pluck(:id)
|
|
|
|
end
|
2019-01-03 12:03:01 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2020-08-07 12:13:02 -04:00
|
|
|
protected
|
2019-01-03 12:03:01 -05:00
|
|
|
|
2022-08-03 01:57:59 -04:00
|
|
|
def notify_users(users, updates)
|
|
|
|
users.find_each { |user| notify_user(user, updates) }
|
|
|
|
@contacted += users.pluck(:id)
|
|
|
|
end
|
|
|
|
|
|
|
|
def notify_user(user, updates)
|
2022-11-30 18:09:57 -05:00
|
|
|
user.publish_reviewable_counts(updates.present? ? { updates: updates } : nil)
|
2022-08-03 01:57:59 -04:00
|
|
|
end
|
2019-01-03 12:03:01 -05:00
|
|
|
end
|