discourse/app/jobs/scheduled/check_new_features.rb

51 lines
1.8 KiB
Ruby

# frozen_string_literal: true
module Jobs
class CheckNewFeatures < ::Jobs::Scheduled
every 1.day
def execute(args)
admin_ids = User.human_users.where(admin: true).pluck(:id)
prev_most_recent = DiscourseUpdates.new_features&.first
if prev_most_recent
admin_ids.each do |admin_id|
if DiscourseUpdates.get_last_viewed_feature_date(admin_id).blank?
DiscourseUpdates.bump_last_viewed_feature_date(
admin_id,
prev_most_recent["created_at"]
)
end
end
end
# this memoization may seem pointless, but it actually avoids us hitting
# Meta repeatedly and getting rate-limited when this job is ran on a
# multisite cluster.
# in multisite, the `execute` method (of the same instance) is called for
# every site in the cluster.
@new_features_json ||= DiscourseUpdates.new_features_payload
DiscourseUpdates.update_new_features(@new_features_json)
new_most_recent = DiscourseUpdates.new_features&.first
if new_most_recent
most_recent_feature_date = Time.zone.parse(new_most_recent["created_at"])
admin_ids.each do |admin_id|
admin_last_viewed_feature_date = DiscourseUpdates.get_last_viewed_feature_date(admin_id)
if admin_last_viewed_feature_date.blank? || admin_last_viewed_feature_date < most_recent_feature_date
Notification.consolidate_or_create!(
user_id: admin_id,
notification_type: Notification.types[:new_features],
data: {}
)
DiscourseUpdates.bump_last_viewed_feature_date(
admin_id,
new_most_recent["created_at"]
)
end
end
end
end
end
end