From 88780fee1e5416764bb2e0979c5d223c3f7072a6 Mon Sep 17 00:00:00 2001 From: Angela Yu Date: Thu, 5 Feb 2026 10:50:03 -0500 Subject: [PATCH 1/5] 694: Added Gwc for Hunter for Discord Migration --- .github/scripts/copy-prod-db/index.ts | 11 ++++- .../V0072__Add_gwc_hunter_to_discord_club.SQL | 46 +++++++++++++++++++ js/src/lib/api/utils/metadata/tag/index.ts | 3 +- .../common/db/models/usertag/Tag.java | 2 +- .../options/LeaderboardFilterGenerator.java | 3 +- .../LeaderboardFilterGeneratorTest.java | 3 +- 6 files changed, 63 insertions(+), 5 deletions(-) create mode 100644 db/migration/V0072__Add_gwc_hunter_to_discord_club.SQL diff --git a/.github/scripts/copy-prod-db/index.ts b/.github/scripts/copy-prod-db/index.ts index fca8a3537..c9aaa74d9 100644 --- a/.github/scripts/copy-prod-db/index.ts +++ b/.github/scripts/copy-prod-db/index.ts @@ -111,12 +111,21 @@ async function main() { -- Update DiscordClubMetadata for 'MHC++' UPDATE \"DiscordClubMetadata\" m - SET + SET \"guildId\" = '1389762654452580373', \"leaderboardChannelId\" = '1401739528057655436' FROM \"DiscordClub\" c WHERE c.\"id\" = m.\"discordClubId\" AND c.\"name\" = 'MHC++'; + + -- Update DiscordClubMetadata for 'GWC-Hunter' + UPDATE \"DiscordClubMetadata\" m + SET + \"guildId\" = '1389762654452580373', + \"leaderboardChannelId\" = '1463703700697518113' + FROM \"DiscordClub\" c + WHERE c.\"id\" = m.\"discordClubId\" + AND c.\"name\" = 'GWC-Hunter'; "`; await sendMessage(prId, `Database copy command completed successfully!`); diff --git a/db/migration/V0072__Add_gwc_hunter_to_discord_club.SQL b/db/migration/V0072__Add_gwc_hunter_to_discord_club.SQL new file mode 100644 index 000000000..203d97331 --- /dev/null +++ b/db/migration/V0072__Add_gwc_hunter_to_discord_club.SQL @@ -0,0 +1,46 @@ +INSERT INTO "DiscordClub" + (id, name, description, tag) +VALUES + (gen_random_uuid(), 'GWC-Hunter', NULL, 'Gwc'); + + +DO $$ +BEGIN + CASE current_database() + WHEN 'codebloom-prod' THEN + WITH CLUB AS ( + SELECT + * + FROM + "DiscordClub" + WHERE + name = 'GWC-Hunter' + ) + INSERT INTO "DiscordClubMetadata" + (id, "guildId", "leaderboardChannelId", "discordClubId") + SELECT + gen_random_uuid(), + '1066177903345278986', + '1468417251274129452', + CLUB.id + FROM CLUB; + + ELSE + WITH CLUB AS ( + SELECT + * + FROM + "DiscordClub" + WHERE + name = 'GWC-Hunter' + ) + INSERT INTO "DiscordClubMetadata" + (id, "guildId", "leaderboardChannelId", "discordClubId") + SELECT + gen_random_uuid(), + '1389762654452580373', + '1463703700697518113', + CLUB.id + FROM CLUB; + END CASE; +END $$; diff --git a/js/src/lib/api/utils/metadata/tag/index.ts b/js/src/lib/api/utils/metadata/tag/index.ts index 5789642cf..8eaca6378 100644 --- a/js/src/lib/api/utils/metadata/tag/index.ts +++ b/js/src/lib/api/utils/metadata/tag/index.ts @@ -91,9 +91,10 @@ export const TAG_METADATA_LIST: Record = { }, } as const; -export const UNUSED_TAGS: Tag[] = [Tag.Gwc, Tag.MHCPlusPlus]; +export const UNUSED_TAGS: Tag[] = [Tag.MHCPlusPlus, Tag.Gwc]; export const NON_SCHOOL_TAGS: Tag[] = [ ...UNUSED_TAGS, Tag.Patina, Tag.MHCPlusPlus, + Tag.Gwc, ]; diff --git a/src/main/java/org/patinanetwork/codebloom/common/db/models/usertag/Tag.java b/src/main/java/org/patinanetwork/codebloom/common/db/models/usertag/Tag.java index 1f7333ce7..dfe1c95cb 100644 --- a/src/main/java/org/patinanetwork/codebloom/common/db/models/usertag/Tag.java +++ b/src/main/java/org/patinanetwork/codebloom/common/db/models/usertag/Tag.java @@ -14,7 +14,7 @@ public enum Tag { Nyu("New York University"), Baruch("Baruch College"), Rpi("Rensselaer Polytechnic Institute"), - Gwc(null), + Gwc("GWC-Hunter"), Sbu("Stony Brook University"), Ccny("City College of New York"), Columbia("Columbia University"), diff --git a/src/main/java/org/patinanetwork/codebloom/common/db/repos/leaderboard/options/LeaderboardFilterGenerator.java b/src/main/java/org/patinanetwork/codebloom/common/db/repos/leaderboard/options/LeaderboardFilterGenerator.java index 172a1453e..89d83f890 100644 --- a/src/main/java/org/patinanetwork/codebloom/common/db/repos/leaderboard/options/LeaderboardFilterGenerator.java +++ b/src/main/java/org/patinanetwork/codebloom/common/db/repos/leaderboard/options/LeaderboardFilterGenerator.java @@ -22,7 +22,8 @@ public static List> generateAllSupportedTagT list.add(Pair.of(withOnlyTrue(opt -> opt.columbia(true)), Tag.Columbia)); list.add(Pair.of(withOnlyTrue(opt -> opt.cornell(true)), Tag.Cornell)); list.add(Pair.of(withOnlyTrue(opt -> opt.bmcc(true)), Tag.Bmcc)); - list.add(Pair.of(withOnlyTrue(opt -> opt.bmcc(true)), Tag.MHCPlusPlus)); + list.add(Pair.of(withOnlyTrue(opt -> opt.mhcplusplus(true)), Tag.MHCPlusPlus)); + list.add(Pair.of(withOnlyTrue(opt -> opt.gwc(true)), Tag.Gwc)); return list; } diff --git a/src/test/java/org/patinanetwork/codebloom/common/db/repos/leaderboard/options/LeaderboardFilterGeneratorTest.java b/src/test/java/org/patinanetwork/codebloom/common/db/repos/leaderboard/options/LeaderboardFilterGeneratorTest.java index d68e901ed..c360a3c2d 100644 --- a/src/test/java/org/patinanetwork/codebloom/common/db/repos/leaderboard/options/LeaderboardFilterGeneratorTest.java +++ b/src/test/java/org/patinanetwork/codebloom/common/db/repos/leaderboard/options/LeaderboardFilterGeneratorTest.java @@ -22,7 +22,8 @@ public class LeaderboardFilterGeneratorTest { Tag.Hunter, Tag.Nyu, Tag.Rpi, - Tag.MHCPlusPlus); + Tag.MHCPlusPlus, + Tag.Gwc); public static final Set ALL_LEADERBOARD_TAGS = Set.of( Tag.Patina, From 211c6880261217ab44faad6fbafce64066b2c186 Mon Sep 17 00:00:00 2001 From: Angela Yu Date: Thu, 5 Feb 2026 11:23:57 -0500 Subject: [PATCH 2/5] 694: Backend Errors + Fix Discord Channel ID 693: Bug Fix Error fixes fix test changes Test Changes --- js/src/lib/api/utils/metadata/tag/index.ts | 2 +- .../common/components/LeaderboardManager.java | 8 +- .../components/LeaderboardManagerTest.java | 202 +++++++++++++++++- 3 files changed, 206 insertions(+), 6 deletions(-) diff --git a/js/src/lib/api/utils/metadata/tag/index.ts b/js/src/lib/api/utils/metadata/tag/index.ts index 8eaca6378..b89605d51 100644 --- a/js/src/lib/api/utils/metadata/tag/index.ts +++ b/js/src/lib/api/utils/metadata/tag/index.ts @@ -91,7 +91,7 @@ export const TAG_METADATA_LIST: Record = { }, } as const; -export const UNUSED_TAGS: Tag[] = [Tag.MHCPlusPlus, Tag.Gwc]; +export const UNUSED_TAGS: Tag[] = [Tag.Gwc, Tag.MHCPlusPlus]; export const NON_SCHOOL_TAGS: Tag[] = [ ...UNUSED_TAGS, Tag.Patina, diff --git a/src/main/java/org/patinanetwork/codebloom/common/components/LeaderboardManager.java b/src/main/java/org/patinanetwork/codebloom/common/components/LeaderboardManager.java index 675828e17..e615ddcbb 100644 --- a/src/main/java/org/patinanetwork/codebloom/common/components/LeaderboardManager.java +++ b/src/main/java/org/patinanetwork/codebloom/common/components/LeaderboardManager.java @@ -67,10 +67,16 @@ public void generateAchievementsForAllWinners() { List winners = usersWithPoints.subList(0, maxWinners(usersWithPoints.size())); for (int i = 0; i < winners.size(); i++) { + UserWithScore user = winners.get(i); + boolean hasTag = user.getTags() != null + && user.getTags().stream() + .anyMatch(userTag -> pair.getRight().equals(userTag.getTag())); + if (!hasTag) { + continue; + } int place = i + 1; log.info("on leaderboard for {} for winner #{}", pair.getRight().getResolvedName(), place); String placeString = calculatePlaceString(place); - UserWithScore user = winners.get(i); Achievement achievement = Achievement.builder() .userId(user.getId()) .place(AchievementPlaceEnum.fromInteger(place)) diff --git a/src/test/java/org/patinanetwork/codebloom/common/components/LeaderboardManagerTest.java b/src/test/java/org/patinanetwork/codebloom/common/components/LeaderboardManagerTest.java index 2f50b4d4a..a83ec3871 100644 --- a/src/test/java/org/patinanetwork/codebloom/common/components/LeaderboardManagerTest.java +++ b/src/test/java/org/patinanetwork/codebloom/common/components/LeaderboardManagerTest.java @@ -365,11 +365,8 @@ void testWithAvailableLeaderboardAndTwoWinnersGlobalWithOneValidOneInvalidTag() leaderboardManager.generateAchievementsForAllWinners(); - verify(achievementRepository, times(0)) - .createAchievement(argThat(achievement -> achievement.getLeaderboard() == Tag.Gwc)); - ArgumentCaptor captor = ArgumentCaptor.forClass(Achievement.class); - verify(achievementRepository, times(winners.size() * 2)).createAchievement(captor.capture()); + verify(achievementRepository, times(winners.size() * 3)).createAchievement(captor.capture()); verify(leaderboardRepository, times(validLeaderboardTags)).getRankedIndexedLeaderboardUsersById(any(), any()); verify(leaderboardRepository, times(1)).getGlobalRankedIndexedLeaderboardUsersById(any(), any()); @@ -388,6 +385,82 @@ void testWithAvailableLeaderboardAndTwoWinnersGlobalWithOneValidOneInvalidTag() Tag.Sbu, AchievementPlaceEnum.TWO, winners.get(1).getItem().getId()); + var userOneGwcAchievement = achievements.get(2); + var userTwoGwcAchievement = achievements.get(3); + assertAchievement( + userOneGwcAchievement, + Tag.Gwc, + AchievementPlaceEnum.ONE, + winners.get(0).getItem().getId()); + assertAchievement( + userTwoGwcAchievement, + Tag.Gwc, + AchievementPlaceEnum.TWO, + winners.get(1).getItem().getId()); + var userOneGlobalAchievement = achievements.get(4); + var userTwoGlobalAchievement = achievements.get(5); + assertAchievement( + userOneGlobalAchievement, + null, + AchievementPlaceEnum.ONE, + winners.get(0).getItem().getId()); + assertAchievement( + userTwoGlobalAchievement, + null, + AchievementPlaceEnum.TWO, + winners.get(1).getItem().getId()); + } + + @Test + void testWithAvailableLeaderboardAndTwoWinnersWithOnlyGwcTag() { + var latestLeaderboard = Leaderboard.builder() + .id(UUID.randomUUID().toString()) + .name("Test Leaderboard") + .createdAt(StandardizedLocalDateTime.now()) + .build(); + + var winners = Indexed.ofDefaultList(List.of( + randomPartialUserWithScore().totalScore(150_000).build(), + randomPartialUserWithScore().totalScore(70_000).build())); + + winners.forEach(winner -> { + var user = winner.getItem(); + user.setTags(List.of(UserTag.builder() + .id(UUID.randomUUID().toString()) + .tag(Tag.Gwc) + .userId(user.getId()) + .build())); + }); + + when(leaderboardRepository.getRecentLeaderboardMetadata()).thenReturn(latestLeaderboard); + when(leaderboardRepository.getGlobalRankedIndexedLeaderboardUsersById(eq(latestLeaderboard.getId()), any())) + .thenReturn(winners); + + when(leaderboardRepository.getRankedIndexedLeaderboardUsersById( + eq(latestLeaderboard.getId()), argThat(opt -> opt.isGwc()))) + .thenReturn(winners); + + leaderboardManager.generateAchievementsForAllWinners(); + + ArgumentCaptor captor = ArgumentCaptor.forClass(Achievement.class); + verify(achievementRepository, times(winners.size() * 2)).createAchievement(captor.capture()); + + verify(leaderboardRepository, times(validLeaderboardTags)).getRankedIndexedLeaderboardUsersById(any(), any()); + verify(leaderboardRepository, times(1)).getGlobalRankedIndexedLeaderboardUsersById(any(), any()); + + var achievements = captor.getAllValues(); + var userOneGwcAchievement = achievements.get(0); + var userTwoGwcAchievement = achievements.get(1); + assertAchievement( + userOneGwcAchievement, + Tag.Gwc, + AchievementPlaceEnum.ONE, + winners.get(0).getItem().getId()); + assertAchievement( + userTwoGwcAchievement, + Tag.Gwc, + AchievementPlaceEnum.TWO, + winners.get(1).getItem().getId()); var userOneGlobalAchievement = achievements.get(2); var userTwoGlobalAchievement = achievements.get(3); assertAchievement( @@ -402,6 +475,127 @@ void testWithAvailableLeaderboardAndTwoWinnersGlobalWithOneValidOneInvalidTag() winners.get(1).getItem().getId()); } + @Test + void testWithAvailableLeaderboardAndTwoWinnersWithGwcAndMhcPlusPlusTags() { + var latestLeaderboard = Leaderboard.builder() + .id(UUID.randomUUID().toString()) + .name("Test Leaderboard") + .createdAt(StandardizedLocalDateTime.now()) + .build(); + + var winners = Indexed.ofDefaultList(List.of( + randomPartialUserWithScore().totalScore(150_000).build(), + randomPartialUserWithScore().totalScore(70_000).build())); + + winners.forEach(winner -> { + var user = winner.getItem(); + user.setTags(List.of( + UserTag.builder() + .id(UUID.randomUUID().toString()) + .tag(Tag.Gwc) + .userId(user.getId()) + .build(), + UserTag.builder() + .id(UUID.randomUUID().toString()) + .tag(Tag.MHCPlusPlus) + .userId(user.getId()) + .build())); + }); + + when(leaderboardRepository.getRecentLeaderboardMetadata()).thenReturn(latestLeaderboard); + when(leaderboardRepository.getGlobalRankedIndexedLeaderboardUsersById(eq(latestLeaderboard.getId()), any())) + .thenReturn(winners); + + when(leaderboardRepository.getRankedIndexedLeaderboardUsersById( + eq(latestLeaderboard.getId()), argThat(opt -> opt.isGwc()))) + .thenReturn(winners); + + when(leaderboardRepository.getRankedIndexedLeaderboardUsersById( + eq(latestLeaderboard.getId()), argThat(opt -> opt.isMhcplusplus()))) + .thenReturn(winners); + + leaderboardManager.generateAchievementsForAllWinners(); + + ArgumentCaptor captor = ArgumentCaptor.forClass(Achievement.class); + verify(achievementRepository, times(winners.size() * 3)).createAchievement(captor.capture()); + + verify(leaderboardRepository, times(validLeaderboardTags)).getRankedIndexedLeaderboardUsersById(any(), any()); + verify(leaderboardRepository, times(1)).getGlobalRankedIndexedLeaderboardUsersById(any(), any()); + + /** keep in mind the order of how we check filters is ordered. check LeaderboardFilterGenerator for order. */ + var achievements = captor.getAllValues(); + var userOneMhcPlusPlusAchievement = achievements.get(0); + var userTwoMhcPlusPlusAchievement = achievements.get(1); + assertAchievement( + userOneMhcPlusPlusAchievement, + Tag.MHCPlusPlus, + AchievementPlaceEnum.ONE, + winners.get(0).getItem().getId()); + assertAchievement( + userTwoMhcPlusPlusAchievement, + Tag.MHCPlusPlus, + AchievementPlaceEnum.TWO, + winners.get(1).getItem().getId()); + var userOneGwcAchievement = achievements.get(2); + var userTwoGwcAchievement = achievements.get(3); + assertAchievement( + userOneGwcAchievement, + Tag.Gwc, + AchievementPlaceEnum.ONE, + winners.get(0).getItem().getId()); + assertAchievement( + userTwoGwcAchievement, + Tag.Gwc, + AchievementPlaceEnum.TWO, + winners.get(1).getItem().getId()); + var userOneGlobalAchievement = achievements.get(4); + var userTwoGlobalAchievement = achievements.get(5); + assertAchievement( + userOneGlobalAchievement, + null, + AchievementPlaceEnum.ONE, + winners.get(0).getItem().getId()); + assertAchievement( + userTwoGlobalAchievement, + null, + AchievementPlaceEnum.TWO, + winners.get(1).getItem().getId()); + } + + @Test + void testGwcUsersWithZeroPointsAreExcludedFromTagAchievements() { + var latestLeaderboard = Leaderboard.builder() + .id(UUID.randomUUID().toString()) + .name("Test Leaderboard") + .createdAt(StandardizedLocalDateTime.now()) + .build(); + + var users = Indexed.ofDefaultList(List.of( + randomPartialUserWithScore().totalScore(0).build(), + randomPartialUserWithScore().totalScore(0).build())); + + users.forEach(winner -> { + var user = winner.getItem(); + user.setTags(List.of(UserTag.builder() + .id(UUID.randomUUID().toString()) + .tag(Tag.Gwc) + .userId(user.getId()) + .build())); + }); + + when(leaderboardRepository.getRecentLeaderboardMetadata()).thenReturn(latestLeaderboard); + when(leaderboardRepository.getGlobalRankedIndexedLeaderboardUsersById(eq(latestLeaderboard.getId()), any())) + .thenReturn(users); + + when(leaderboardRepository.getRankedIndexedLeaderboardUsersById( + eq(latestLeaderboard.getId()), argThat(opt -> opt.isGwc()))) + .thenReturn(users); + + leaderboardManager.generateAchievementsForAllWinners(); + + verify(achievementRepository, times(0)).createAchievement(any()); + } + @Test void testWithAvailableLeaderboardAndThreeWinnersGlobalButFourUsers() { var latestLeaderboard = Leaderboard.builder() From ea20003b21c8e4add9a22d626b13ea92156857b7 Mon Sep 17 00:00:00 2001 From: Angela Yu Date: Fri, 6 Feb 2026 10:37:08 -0500 Subject: [PATCH 3/5] 694: Fix where staging goes Tests --- .../V0072__Add_gwc_hunter_to_discord_club.SQL | 2 +- .../components/LeaderboardManagerTest.java | 96 +++++++++++++++++++ 2 files changed, 97 insertions(+), 1 deletion(-) diff --git a/db/migration/V0072__Add_gwc_hunter_to_discord_club.SQL b/db/migration/V0072__Add_gwc_hunter_to_discord_club.SQL index 203d97331..69ac0e3ac 100644 --- a/db/migration/V0072__Add_gwc_hunter_to_discord_club.SQL +++ b/db/migration/V0072__Add_gwc_hunter_to_discord_club.SQL @@ -39,7 +39,7 @@ BEGIN SELECT gen_random_uuid(), '1389762654452580373', - '1463703700697518113', + '1417161536014778388', CLUB.id FROM CLUB; END CASE; diff --git a/src/test/java/org/patinanetwork/codebloom/common/components/LeaderboardManagerTest.java b/src/test/java/org/patinanetwork/codebloom/common/components/LeaderboardManagerTest.java index a83ec3871..dcfae25f5 100644 --- a/src/test/java/org/patinanetwork/codebloom/common/components/LeaderboardManagerTest.java +++ b/src/test/java/org/patinanetwork/codebloom/common/components/LeaderboardManagerTest.java @@ -703,6 +703,102 @@ void testUsersWithZeroPointsAreExcludedFromTagAchievements() { verify(achievementRepository, times(0)).createAchievement(any()); } + @Test + void testWinnersWithNullTagsAreSkippedInTagLeaderboards() { + var latestLeaderboard = Leaderboard.builder() + .id(UUID.randomUUID().toString()) + .name("Test Leaderboard") + .createdAt(StandardizedLocalDateTime.now()) + .build(); + + var winners = Indexed.ofDefaultList(List.of( + randomPartialUserWithScore().totalScore(150_000).build(), + randomPartialUserWithScore().totalScore(70_000).build())); + + when(leaderboardRepository.getRecentLeaderboardMetadata()).thenReturn(latestLeaderboard); + when(leaderboardRepository.getGlobalRankedIndexedLeaderboardUsersById(eq(latestLeaderboard.getId()), any())) + .thenReturn(winners); + + when(leaderboardRepository.getRankedIndexedLeaderboardUsersById( + eq(latestLeaderboard.getId()), argThat(opt -> opt.isSbu()))) + .thenReturn(winners); + + leaderboardManager.generateAchievementsForAllWinners(); + + ArgumentCaptor captor = ArgumentCaptor.forClass(Achievement.class); + verify(achievementRepository, times(winners.size())).createAchievement(captor.capture()); + + var achievements = captor.getAllValues(); + for (var achievement : achievements) { + assertNull(achievement.getLeaderboard()); + } + } + + @Test + void testWinnersWithNonMatchingTagsAreSkippedInTagLeaderboards() { + var latestLeaderboard = Leaderboard.builder() + .id(UUID.randomUUID().toString()) + .name("Test Leaderboard") + .createdAt(StandardizedLocalDateTime.now()) + .build(); + + var winners = Indexed.ofDefaultList(List.of( + randomPartialUserWithScore().totalScore(150_000).build(), + randomPartialUserWithScore().totalScore(70_000).build())); + + winners.forEach(winner -> { + var user = winner.getItem(); + user.setTags(List.of(UserTag.builder() + .id(UUID.randomUUID().toString()) + .tag(Tag.Patina) + .userId(user.getId()) + .build())); + }); + + when(leaderboardRepository.getRecentLeaderboardMetadata()).thenReturn(latestLeaderboard); + when(leaderboardRepository.getGlobalRankedIndexedLeaderboardUsersById(eq(latestLeaderboard.getId()), any())) + .thenReturn(winners); + + when(leaderboardRepository.getRankedIndexedLeaderboardUsersById( + eq(latestLeaderboard.getId()), argThat(opt -> opt.isSbu()))) + .thenReturn(winners); + + when(leaderboardRepository.getRankedIndexedLeaderboardUsersById( + eq(latestLeaderboard.getId()), argThat(opt -> opt.isPatina()))) + .thenReturn(winners); + + leaderboardManager.generateAchievementsForAllWinners(); + + ArgumentCaptor captor = ArgumentCaptor.forClass(Achievement.class); + verify(achievementRepository, times(winners.size() * 2)).createAchievement(captor.capture()); + + var achievements = captor.getAllValues(); + var userOnePatinaAchievement = achievements.get(0); + var userTwoPatinaAchievement = achievements.get(1); + assertAchievement( + userOnePatinaAchievement, + Tag.Patina, + AchievementPlaceEnum.ONE, + winners.get(0).getItem().getId()); + assertAchievement( + userTwoPatinaAchievement, + Tag.Patina, + AchievementPlaceEnum.TWO, + winners.get(1).getItem().getId()); + var userOneGlobalAchievement = achievements.get(2); + var userTwoGlobalAchievement = achievements.get(3); + assertAchievement( + userOneGlobalAchievement, + null, + AchievementPlaceEnum.ONE, + winners.get(0).getItem().getId()); + assertAchievement( + userTwoGlobalAchievement, + null, + AchievementPlaceEnum.TWO, + winners.get(1).getItem().getId()); + } + @Test void testGetLeaderboardMetadata() { String testId = UUID.randomUUID().toString(); From cb0ccb602ae1646c6b0a83bf36b40dd7af7be965 Mon Sep 17 00:00:00 2001 From: Angela Yu Date: Fri, 6 Feb 2026 12:05:48 -0500 Subject: [PATCH 4/5] 694: Renaming GWC - Hunter changes --- .github/scripts/copy-prod-db/index.ts | 4 ++-- db/migration/V0072__Add_gwc_hunter_to_discord_club.SQL | 6 +++--- js/src/lib/api/utils/metadata/tag/index.ts | 4 ++-- .../codebloom/common/db/models/usertag/Tag.java | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/scripts/copy-prod-db/index.ts b/.github/scripts/copy-prod-db/index.ts index c9aaa74d9..db0ccf502 100644 --- a/.github/scripts/copy-prod-db/index.ts +++ b/.github/scripts/copy-prod-db/index.ts @@ -118,14 +118,14 @@ async function main() { WHERE c.\"id\" = m.\"discordClubId\" AND c.\"name\" = 'MHC++'; - -- Update DiscordClubMetadata for 'GWC-Hunter' + -- Update DiscordClubMetadata for 'GWC - Hunter College' UPDATE \"DiscordClubMetadata\" m SET \"guildId\" = '1389762654452580373', \"leaderboardChannelId\" = '1463703700697518113' FROM \"DiscordClub\" c WHERE c.\"id\" = m.\"discordClubId\" - AND c.\"name\" = 'GWC-Hunter'; + AND c.\"name\" = 'GWC - Hunter College'; "`; await sendMessage(prId, `Database copy command completed successfully!`); diff --git a/db/migration/V0072__Add_gwc_hunter_to_discord_club.SQL b/db/migration/V0072__Add_gwc_hunter_to_discord_club.SQL index 69ac0e3ac..3419ee7ac 100644 --- a/db/migration/V0072__Add_gwc_hunter_to_discord_club.SQL +++ b/db/migration/V0072__Add_gwc_hunter_to_discord_club.SQL @@ -1,7 +1,7 @@ INSERT INTO "DiscordClub" (id, name, description, tag) VALUES - (gen_random_uuid(), 'GWC-Hunter', NULL, 'Gwc'); + (gen_random_uuid(), 'GWC - Hunter College', NULL, 'Gwc'); DO $$ @@ -14,7 +14,7 @@ BEGIN FROM "DiscordClub" WHERE - name = 'GWC-Hunter' + name = 'GWC - Hunter College' ) INSERT INTO "DiscordClubMetadata" (id, "guildId", "leaderboardChannelId", "discordClubId") @@ -32,7 +32,7 @@ BEGIN FROM "DiscordClub" WHERE - name = 'GWC-Hunter' + name = 'GWC - Hunter College' ) INSERT INTO "DiscordClubMetadata" (id, "guildId", "leaderboardChannelId", "discordClubId") diff --git a/js/src/lib/api/utils/metadata/tag/index.ts b/js/src/lib/api/utils/metadata/tag/index.ts index b89605d51..722f7fc95 100644 --- a/js/src/lib/api/utils/metadata/tag/index.ts +++ b/js/src/lib/api/utils/metadata/tag/index.ts @@ -41,8 +41,8 @@ export const TAG_METADATA_LIST: Record = { alt: "Patina Logo", }, Gwc: { - shortName: "GWC @ Hunter", - name: "Hunter College - GWC", + shortName: "GWC - Hunter College", + name: "GWC - Hunter College", apiKey: "gwc", icon: "/brands/Gwc_Logo.png", alt: "GWC Logo", diff --git a/src/main/java/org/patinanetwork/codebloom/common/db/models/usertag/Tag.java b/src/main/java/org/patinanetwork/codebloom/common/db/models/usertag/Tag.java index dfe1c95cb..c0f387914 100644 --- a/src/main/java/org/patinanetwork/codebloom/common/db/models/usertag/Tag.java +++ b/src/main/java/org/patinanetwork/codebloom/common/db/models/usertag/Tag.java @@ -14,7 +14,7 @@ public enum Tag { Nyu("New York University"), Baruch("Baruch College"), Rpi("Rensselaer Polytechnic Institute"), - Gwc("GWC-Hunter"), + Gwc("GWC - Hunter College"), Sbu("Stony Brook University"), Ccny("City College of New York"), Columbia("Columbia University"), From aed34ffd7e599f6f59d0822a7626842a56aa3351 Mon Sep 17 00:00:00 2001 From: Angela Yu Date: Fri, 6 Feb 2026 12:26:52 -0500 Subject: [PATCH 5/5] 694: pr changes fixes syntax error Pr changes --- .github/scripts/copy-prod-db/index.ts | 2 +- db/migration/V0072__Add_gwc_hunter_to_discord_club.SQL | 2 +- .../codebloom/common/components/LeaderboardManager.java | 6 ------ .../common/components/LeaderboardManagerTest.java | 8 -------- 4 files changed, 2 insertions(+), 16 deletions(-) diff --git a/.github/scripts/copy-prod-db/index.ts b/.github/scripts/copy-prod-db/index.ts index db0ccf502..d481f65d8 100644 --- a/.github/scripts/copy-prod-db/index.ts +++ b/.github/scripts/copy-prod-db/index.ts @@ -122,7 +122,7 @@ async function main() { UPDATE \"DiscordClubMetadata\" m SET \"guildId\" = '1389762654452580373', - \"leaderboardChannelId\" = '1463703700697518113' + \"leaderboardChannelId\" = '1401739528057655436' FROM \"DiscordClub\" c WHERE c.\"id\" = m.\"discordClubId\" AND c.\"name\" = 'GWC - Hunter College'; diff --git a/db/migration/V0072__Add_gwc_hunter_to_discord_club.SQL b/db/migration/V0072__Add_gwc_hunter_to_discord_club.SQL index 3419ee7ac..0b1fc9d56 100644 --- a/db/migration/V0072__Add_gwc_hunter_to_discord_club.SQL +++ b/db/migration/V0072__Add_gwc_hunter_to_discord_club.SQL @@ -39,7 +39,7 @@ BEGIN SELECT gen_random_uuid(), '1389762654452580373', - '1417161536014778388', + '1463703700697518113', CLUB.id FROM CLUB; END CASE; diff --git a/src/main/java/org/patinanetwork/codebloom/common/components/LeaderboardManager.java b/src/main/java/org/patinanetwork/codebloom/common/components/LeaderboardManager.java index e615ddcbb..72ffa154d 100644 --- a/src/main/java/org/patinanetwork/codebloom/common/components/LeaderboardManager.java +++ b/src/main/java/org/patinanetwork/codebloom/common/components/LeaderboardManager.java @@ -68,12 +68,6 @@ public void generateAchievementsForAllWinners() { for (int i = 0; i < winners.size(); i++) { UserWithScore user = winners.get(i); - boolean hasTag = user.getTags() != null - && user.getTags().stream() - .anyMatch(userTag -> pair.getRight().equals(userTag.getTag())); - if (!hasTag) { - continue; - } int place = i + 1; log.info("on leaderboard for {} for winner #{}", pair.getRight().getResolvedName(), place); String placeString = calculatePlaceString(place); diff --git a/src/test/java/org/patinanetwork/codebloom/common/components/LeaderboardManagerTest.java b/src/test/java/org/patinanetwork/codebloom/common/components/LeaderboardManagerTest.java index dcfae25f5..e5fd649a2 100644 --- a/src/test/java/org/patinanetwork/codebloom/common/components/LeaderboardManagerTest.java +++ b/src/test/java/org/patinanetwork/codebloom/common/components/LeaderboardManagerTest.java @@ -719,10 +719,6 @@ void testWinnersWithNullTagsAreSkippedInTagLeaderboards() { when(leaderboardRepository.getGlobalRankedIndexedLeaderboardUsersById(eq(latestLeaderboard.getId()), any())) .thenReturn(winners); - when(leaderboardRepository.getRankedIndexedLeaderboardUsersById( - eq(latestLeaderboard.getId()), argThat(opt -> opt.isSbu()))) - .thenReturn(winners); - leaderboardManager.generateAchievementsForAllWinners(); ArgumentCaptor captor = ArgumentCaptor.forClass(Achievement.class); @@ -759,10 +755,6 @@ void testWinnersWithNonMatchingTagsAreSkippedInTagLeaderboards() { when(leaderboardRepository.getGlobalRankedIndexedLeaderboardUsersById(eq(latestLeaderboard.getId()), any())) .thenReturn(winners); - when(leaderboardRepository.getRankedIndexedLeaderboardUsersById( - eq(latestLeaderboard.getId()), argThat(opt -> opt.isSbu()))) - .thenReturn(winners); - when(leaderboardRepository.getRankedIndexedLeaderboardUsersById( eq(latestLeaderboard.getId()), argThat(opt -> opt.isPatina()))) .thenReturn(winners);