unless (badge_id = Badge.id_for_slug(badge_slug)) users = User.where(id: article_user_ids).where("articles_count >= ?", weeks) users.find_each do |user| count = weeks.times.count { |i| published_x_weeks_ago?(user, i + 1) } next unless count >= weeks user.badge_achievements.create( badge_id: badge_id, rewarding_context_message_markdown: generate_message, ) end end end end module Badges class AwardBelovedComment BADGE_SLUG = "beloved-comment".freeze def call return unless (badge_id = Badge.id_for_slug(BADGE_SLUG)) Comment.includes(:user).where(public_reactions_count: comment_count..).find_each do |comment| achievement = BadgeAchievement.create( user_id: comment.user_id, badge_id: badge_id, rewarding_context_message_markdown: generate_message(comment), ) comment.user.touch if achievement.valid? end end end end module Badges class AwardFabFive BADGE_SLUG = "fab-5".freeze def self.call(usernames, message_markdown = default_message_markdown) ::Badges::Award.call( User.where(username: usernames), BADGE_SLUG, message_markdown, ) end end class Award def self.call(user_relation, slug, message_markdown, include_default_description: true) return unless (badge_id = Badge.id_for_slug(slug)) user_relation.find_each do |user| achievement = user.badge_achievements.create( badge_id: badge_id, rewarding_context_message_markdown: message_markdown, include_default_description:, ) user.touch if achievement.persisted? end end end end class BadgeAwardWorker include Sidekiq::Job def perform(usernames, badge_slug, message, include_default_description = true) if (award_class = "Badges::#{badge_slug.classify}".safe_constantize) award_class.call else Badges::Award.call(User.where(username: usernames), badge_slug, message, include_default_description: ...) end end end 1 2 3