57 lines
1.9 KiB
Ruby
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
|