discourse/app/jobs/onceoff/fix_retro_anniversary.rb
Sam Saffron 30990006a9 DEV: enable frozen string literal on all files
This reduces chances of errors where consumers of strings mutate inputs
and reduces memory usage of the app.

Test suite passes now, but there may be some stuff left, so we will run
a few sites on a branch prior to merging
2019-05-13 09:31:32 +08:00

37 lines
952 B
Ruby

# frozen_string_literal: true
require_dependency 'jobs/scheduled/grant_anniversary_badges'
module Jobs
class FixRetroAnniversary < Jobs::Onceoff
def execute_onceoff(args)
return unless SiteSetting.enable_badges
users = DB.query <<~SQL
SELECT ub.user_id, MIN(granted_at) AS first_granted_at, COUNT(*) count
FROM user_badges AS ub
WHERE ub.badge_id = #{Badge::Anniversary}
GROUP BY ub.user_id
HAVING COUNT(ub.id) > 1
SQL
users.each do |u|
first = u.first_granted_at
badges = UserBadge.where(
"badge_id = ? AND user_id = ? AND granted_at > ?",
Badge::Anniversary,
u.user_id,
first
).order('granted_at')
badges.each_with_index do |b, idx|
award_date = (first + (idx + 1).years)
UserBadge.where(id: b.id).update_all(["granted_at = ?", award_date])
end
end
end
end
end