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



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
63
64
65
66
# File 'app/jobs/regular/notify_reviewable.rb', line 8

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?

        if SiteSetting.enable_category_group_moderation? && r.category.present?
          r
            .category
            .moderating_groups
            .pluck(:id)
            .each { |group_id| all_updates[group_id][r.id] = payload }
        end
      end
  end

  DistributedMutex.synchronize("notify_reviewable_job", validity: 120) do
    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? && reviewable.category.present?
      users =
        User
          .includes(:group_users)
          .joins(:group_users)
          .joins(
            "INNER JOIN category_moderation_groups ON category_moderation_groups.group_id = group_users.group_id",
          )
          .where("category_moderation_groups.category_id": reviewable.category.id)
          .where("users.id NOT IN (?)", @contacted)
          .distinct

      users.find_each do |user|
        updates = {}
        user.group_users.each { |gu| updates.merge!(all_updates[gu.group_id]) }

        notify_user(user, updates)
      end

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