From 83749779cc3e2ec89c693c273cf2a24853e32924 Mon Sep 17 00:00:00 2001 From: Vikhyat Korrapati Date: Sat, 28 Jun 2014 00:57:26 +0530 Subject: [PATCH] Add consistency check to revoke duplicate badges. --- app/jobs/scheduled/ensure_db_consistency.rb | 1 + app/models/user_badge.rb | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/app/jobs/scheduled/ensure_db_consistency.rb b/app/jobs/scheduled/ensure_db_consistency.rb index ca3104522a4..e12c404cb3a 100644 --- a/app/jobs/scheduled/ensure_db_consistency.rb +++ b/app/jobs/scheduled/ensure_db_consistency.rb @@ -9,6 +9,7 @@ module Jobs Group.refresh_automatic_groups! Notification.ensure_consistency! UserAction.ensure_consistency! + UserBadge.ensure_consistency! end end end diff --git a/app/models/user_badge.rb b/app/models/user_badge.rb index f9bee5acde6..9802f9e6d5b 100644 --- a/app/models/user_badge.rb +++ b/app/models/user_badge.rb @@ -17,6 +17,17 @@ class UserBadge < ActiveRecord::Base after_destroy do Badge.decrement_counter 'grant_count', self.badge_id end + + # Make sure we don't have duplicate badges. + def self.ensure_consistency! + dup_ids = [] + # Single grant badges shouldn't have duplicates at all. + dup_ids += exec_sql("SELECT u1.id FROM user_badges u1, user_badges u2, badges WHERE u1.badge_id = badges.id AND u1.user_id = u2.user_id AND u1.badge_id = u2.badge_id AND (NOT badges.multiple_grant) AND u1.granted_at > u2.granted_at").to_a + # Multiple grant badges can have duplicates but not with the same post_ids. + dup_ids += exec_sql("SELECT u1.id FROM user_badges u1, user_badges u2, badges WHERE u1.badge_id = badges.id AND u1.user_id = u2.user_id AND u1.badge_id = u2.badge_id AND badges.multiple_grant AND u1.post_id = u2.post_id AND u1.granted_at > u2.granted_at").to_a + dup_ids = dup_ids.map {|x| x["id"].to_i } + UserBadge.where(id: dup_ids).destroy_all + end end # == Schema Information