discourse/app/jobs/scheduled/pending_users_reminder.rb
Roman Rizzi 2c918a3161
FEATURE: Staff can receive pending user reminders more frequently. (#13422)
* FEATURE: Staff can receive pending user reminders more frequently.

We now express the "pending_users_reminder_delay"  in minutes instead of hours so staff can have finer control over the delay.

We need to keep in mind that the reminders could still take up to 20 minutes, even when using a lower value. We send them from a scheduled job.

* Migrate to a new site setting for the reminders delay
2021-06-24 10:02:56 -03:00

67 lines
2.2 KiB
Ruby

# frozen_string_literal: true
module Jobs
class PendingUsersReminder < ::Jobs::Scheduled
every 5.minutes
def execute(args)
if SiteSetting.must_approve_users && SiteSetting.pending_users_reminder_delay_minutes >= 0
query = AdminUserIndexQuery.new(query: 'pending', stats: false).find_users_query # default order is: users.created_at DESC
if SiteSetting.pending_users_reminder_delay_minutes > 0
query = query.where('users.created_at < ?', SiteSetting.pending_users_reminder_delay_minutes.minutes.ago)
end
newest_username = query.limit(1).select(:username).first&.username
return true if newest_username == previous_newest_username # already notified
count = query.count
if count > 0
target_usernames = Group[:moderators].users.map do |user|
next if user.bot?
unseen_count = user.notifications.joins(:topic)
.where("notifications.id > ?", user.seen_notification_id)
.where("notifications.read = false")
.where("topics.subtype = ?", TopicSubtype.pending_users_reminder)
.count
unseen_count == 0 ? user.username : nil
end.compact
unless target_usernames.empty?
PostCreator.create(
Discourse.system_user,
target_usernames: target_usernames,
archetype: Archetype.private_message,
subtype: TopicSubtype.pending_users_reminder,
title: I18n.t("system_messages.pending_users_reminder.subject_template", count: count),
raw: I18n.t("system_messages.pending_users_reminder.text_body_template", count: count, base_url: Discourse.base_url)
)
self.previous_newest_username = newest_username
end
end
end
true
end
def previous_newest_username
Discourse.redis.get previous_newest_username_cache_key
end
def previous_newest_username=(username)
Discourse.redis.setex previous_newest_username_cache_key, 7.days, username
end
def previous_newest_username_cache_key
"pending-users-reminder:newest-username"
end
end
end