Class: Jobs::NotifyReviewable

Inherits:
Base
  • Object
show all
Defined in:
app/jobs/regular/notify_reviewable.rb

Instance Method Summary collapse

Methods inherited from Base

acquire_cluster_concurrency_lock!, clear_cluster_concurrency_lock!, cluster_concurrency, cluster_concurrency_redis_key, delayed_perform, #error_context, get_cluster_concurrency, #last_db_duration, #log, #perform, #perform_immediately

Instance Method Details

#execute(args) ⇒ Object



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'app/jobs/regular/notify_reviewable.rb', line 4

def execute(args)
  return unless reviewable = Reviewable.find_by(id: args[:reviewable_id])

  @contacted = Set.new

  all_updates = Hash.new { |h, k| h[k] = {} }

  if args[:updated_reviewable_ids].present?
    Reviewable
      .where(id: args[:updated_reviewable_ids])
      .each do |r|
        payload = { last_performing_username: args[:performing_username], status: r.status }

        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

  DistributedMutex.synchronize("notify_reviewable_job", validity: 120) do
    counts = Hash.new(0)
    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

    notify_users(User.real.admins, all_updates[:admins])

    if reviewable.reviewable_by_moderator?
      notify_users(
        User.real.moderators.where("id NOT IN (?)", @contacted),
        all_updates[:moderators],
      )
    end

    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

        notify_user(user, updates)
      end

      @contacted += users.pluck(:id)
    end
  end
end