discourse-assign/jobs/scheduled/enqueue_reminders.rb

57 lines
1.9 KiB
Ruby

# frozen_string_literal: true
module Jobs
class EnqueueReminders < ::Jobs::Scheduled
every 1.day
def execute(_args)
return if skip_enqueue?
user_ids.each { |id| Jobs.enqueue(:remind_user, user_id: id) }
end
private
def skip_enqueue?
SiteSetting.remind_assigns_frequency.nil? || !SiteSetting.assign_enabled? || SiteSetting.assign_allowed_on_groups.blank?
end
def allowed_group_ids
Group.assign_allowed_groups.pluck(:id).join(',')
end
def user_ids
global_frequency = SiteSetting.remind_assigns_frequency
frequency = ActiveRecord::Base.sanitize_sql("COALESCE(user_frequency.value, '#{global_frequency}')::INT")
DB.query_single(<<~SQL
SELECT topic_custom_fields.value
FROM topic_custom_fields
LEFT OUTER JOIN user_custom_fields AS last_reminder
ON topic_custom_fields.value::INT = last_reminder.user_id
AND last_reminder.name = '#{PendingAssignsReminder::REMINDED_AT}'
LEFT OUTER JOIN user_custom_fields AS user_frequency
ON topic_custom_fields.value::INT = user_frequency.user_id
AND user_frequency.name = '#{PendingAssignsReminder::REMINDERS_FREQUENCY}'
INNER JOIN group_users ON topic_custom_fields.value::INT = group_users.user_id
INNER JOIN topics ON topics.id = topic_custom_fields.topic_id AND (topics.deleted_at IS NULL)
WHERE group_users.group_id IN (#{allowed_group_ids})
AND #{frequency} > 0
AND (
last_reminder.value IS NULL OR
last_reminder.value::TIMESTAMP <= CURRENT_TIMESTAMP - ('1 MINUTE'::INTERVAL * #{frequency})
)
AND topic_custom_fields.updated_at::TIMESTAMP <= CURRENT_TIMESTAMP - ('1 MINUTE'::INTERVAL * #{frequency})
AND topic_custom_fields.name = '#{TopicAssigner::ASSIGNED_TO_ID}'
GROUP BY topic_custom_fields.value
HAVING COUNT(topic_custom_fields.value) > 1
SQL
)
end
end
end