Slide 77
Slide 77 text
module Badges
class AwardStreak
def call
badge_slug = "#{weeks}-week-streak"
return 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