From dd6e0547abe5281a275165b9a01519192d731fce Mon Sep 17 00:00:00 2001 From: Tahmid Ahmed Date: Thu, 8 Oct 2026 10:07:33 -0400 Subject: [PATCH 1/5] TAN-1085: Add repo @Timed --- .../common/db/repos/achievements/AchievementSqlRepository.java | 2 ++ .../common/db/repos/announcement/AnnouncementSqlRepository.java | 2 ++ .../codebloom/common/db/repos/api/ApiKeySqlRepository.java | 2 ++ .../common/db/repos/api/access/ApiKeyAccessSqlRepository.java | 2 ++ .../codebloom/common/db/repos/auth/AuthSqlRepository.java | 2 ++ .../codebloom/common/db/repos/club/ClubSqlRepository.java | 2 ++ .../common/db/repos/discord/club/DiscordClubSqlRepository.java | 2 ++ .../discord/club/metadata/DiscordClubMetadataSqlRepository.java | 2 ++ .../common/db/repos/feedback/FeedbackSqlRepository.java | 2 ++ .../codebloom/common/db/repos/job/JobSqlRepository.java | 2 ++ .../common/db/repos/leaderboard/LeaderboardSqlRepository.java | 2 ++ .../common/db/repos/lobby/LobbyQuestionSqlRepository.java | 2 ++ .../codebloom/common/db/repos/lobby/LobbySqlRepository.java | 2 ++ .../common/db/repos/lobby/player/LobbyPlayerSqlRepository.java | 2 ++ .../lobby/player/question/LobbyPlayerQuestionSqlRepository.java | 2 ++ .../codebloom/common/db/repos/potd/POTDSqlRepository.java | 2 ++ .../common/db/repos/question/QuestionSqlRepository.java | 2 ++ .../repos/question/questionbank/QuestionBankSqlRepository.java | 2 ++ .../db/repos/question/topic/QuestionTopicSqlRepository.java | 2 ++ .../codebloom/common/db/repos/session/SessionSqlRepository.java | 2 ++ .../common/db/repos/task/BackgroundTaskSqlRepository.java | 2 ++ .../common/db/repos/user/UserMetricsSqlRepository.java | 2 ++ .../codebloom/common/db/repos/user/UserSqlRepository.java | 2 ++ .../codebloom/common/db/repos/usertag/UserTagSqlRepository.java | 2 ++ .../common/db/repos/weekly/WeeklyMessageSqlRepository.java | 2 ++ 25 files changed, 50 insertions(+) diff --git a/src/main/java/org/patinanetwork/codebloom/common/db/repos/achievements/AchievementSqlRepository.java b/src/main/java/org/patinanetwork/codebloom/common/db/repos/achievements/AchievementSqlRepository.java index 554b8fd04..e9f9868e2 100644 --- a/src/main/java/org/patinanetwork/codebloom/common/db/repos/achievements/AchievementSqlRepository.java +++ b/src/main/java/org/patinanetwork/codebloom/common/db/repos/achievements/AchievementSqlRepository.java @@ -1,5 +1,6 @@ package org.patinanetwork.codebloom.common.db.repos.achievements; +import io.micrometer.core.annotation.Timed; import java.sql.Types; import java.time.OffsetDateTime; import java.util.List; @@ -14,6 +15,7 @@ import org.springframework.stereotype.Component; @Component +@Timed(value = "repository.execution") public class AchievementSqlRepository implements AchievementRepository { private static final RowMapper ACHIEVEMENT_ROW_MAPPER = (rs, rowNum) -> { diff --git a/src/main/java/org/patinanetwork/codebloom/common/db/repos/announcement/AnnouncementSqlRepository.java b/src/main/java/org/patinanetwork/codebloom/common/db/repos/announcement/AnnouncementSqlRepository.java index 21938185f..5410de948 100644 --- a/src/main/java/org/patinanetwork/codebloom/common/db/repos/announcement/AnnouncementSqlRepository.java +++ b/src/main/java/org/patinanetwork/codebloom/common/db/repos/announcement/AnnouncementSqlRepository.java @@ -1,5 +1,6 @@ package org.patinanetwork.codebloom.common.db.repos.announcement; +import io.micrometer.core.annotation.Timed; import java.time.OffsetDateTime; import java.util.List; import java.util.UUID; @@ -9,6 +10,7 @@ import org.springframework.stereotype.Component; @Component +@Timed(value = "repository.execution") public class AnnouncementSqlRepository implements AnnouncementRepository { private static final RowMapper ANNOUNCEMENT_ROW_MAPPER = (rs, rowNum) -> Announcement.builder() diff --git a/src/main/java/org/patinanetwork/codebloom/common/db/repos/api/ApiKeySqlRepository.java b/src/main/java/org/patinanetwork/codebloom/common/db/repos/api/ApiKeySqlRepository.java index dad48369a..46e8b8e6b 100644 --- a/src/main/java/org/patinanetwork/codebloom/common/db/repos/api/ApiKeySqlRepository.java +++ b/src/main/java/org/patinanetwork/codebloom/common/db/repos/api/ApiKeySqlRepository.java @@ -1,5 +1,6 @@ package org.patinanetwork.codebloom.common.db.repos.api; +import io.micrometer.core.annotation.Timed; import java.sql.Timestamp; import java.util.List; import java.util.Optional; @@ -11,6 +12,7 @@ import org.springframework.stereotype.Component; @Component +@Timed(value = "repository.execution") public class ApiKeySqlRepository implements ApiKeyRepository { private static final RowMapper API_KEY_ROW_MAPPER = (rs, rowNum) -> ApiKey.builder() diff --git a/src/main/java/org/patinanetwork/codebloom/common/db/repos/api/access/ApiKeyAccessSqlRepository.java b/src/main/java/org/patinanetwork/codebloom/common/db/repos/api/access/ApiKeyAccessSqlRepository.java index cf35083ed..6570be77d 100644 --- a/src/main/java/org/patinanetwork/codebloom/common/db/repos/api/access/ApiKeyAccessSqlRepository.java +++ b/src/main/java/org/patinanetwork/codebloom/common/db/repos/api/access/ApiKeyAccessSqlRepository.java @@ -1,5 +1,6 @@ package org.patinanetwork.codebloom.common.db.repos.api.access; +import io.micrometer.core.annotation.Timed; import java.sql.Types; import java.util.ArrayList; import java.util.UUID; @@ -10,6 +11,7 @@ import org.springframework.stereotype.Component; @Component +@Timed(value = "repository.execution") public class ApiKeyAccessSqlRepository implements ApiKeyAccessRepository { private static final RowMapper API_KEY_ACCESS_ROW_MAPPER = (rs, rowNum) -> ApiKeyAccess.builder() diff --git a/src/main/java/org/patinanetwork/codebloom/common/db/repos/auth/AuthSqlRepository.java b/src/main/java/org/patinanetwork/codebloom/common/db/repos/auth/AuthSqlRepository.java index 3c5446ec2..319fd1e05 100644 --- a/src/main/java/org/patinanetwork/codebloom/common/db/repos/auth/AuthSqlRepository.java +++ b/src/main/java/org/patinanetwork/codebloom/common/db/repos/auth/AuthSqlRepository.java @@ -1,5 +1,6 @@ package org.patinanetwork.codebloom.common.db.repos.auth; +import io.micrometer.core.annotation.Timed; import java.time.OffsetDateTime; import java.util.UUID; import org.patinanetwork.codebloom.common.db.models.auth.Auth; @@ -9,6 +10,7 @@ import org.springframework.stereotype.Component; @Component +@Timed(value = "repository.execution") public class AuthSqlRepository implements AuthRepository { private static final RowMapper AUTH_ROW_MAPPER = (rs, rowNum) -> Auth.builder() diff --git a/src/main/java/org/patinanetwork/codebloom/common/db/repos/club/ClubSqlRepository.java b/src/main/java/org/patinanetwork/codebloom/common/db/repos/club/ClubSqlRepository.java index 37213b6ec..8441d7ea7 100644 --- a/src/main/java/org/patinanetwork/codebloom/common/db/repos/club/ClubSqlRepository.java +++ b/src/main/java/org/patinanetwork/codebloom/common/db/repos/club/ClubSqlRepository.java @@ -1,5 +1,6 @@ package org.patinanetwork.codebloom.common.db.repos.club; +import io.micrometer.core.annotation.Timed; import java.sql.Types; import java.util.UUID; import org.patinanetwork.codebloom.common.db.models.club.Club; @@ -9,6 +10,7 @@ import org.springframework.stereotype.Component; @Component +@Timed(value = "repository.execution") public class ClubSqlRepository implements ClubRepository { private static final RowMapper CLUB_ROW_MAPPER = (rs, rowNum) -> { diff --git a/src/main/java/org/patinanetwork/codebloom/common/db/repos/discord/club/DiscordClubSqlRepository.java b/src/main/java/org/patinanetwork/codebloom/common/db/repos/discord/club/DiscordClubSqlRepository.java index 1afd08acb..23f64b019 100644 --- a/src/main/java/org/patinanetwork/codebloom/common/db/repos/discord/club/DiscordClubSqlRepository.java +++ b/src/main/java/org/patinanetwork/codebloom/common/db/repos/discord/club/DiscordClubSqlRepository.java @@ -1,5 +1,6 @@ package org.patinanetwork.codebloom.common.db.repos.discord.club; +import io.micrometer.core.annotation.Timed; import java.sql.Types; import java.time.OffsetDateTime; import java.util.List; @@ -14,6 +15,7 @@ import org.springframework.stereotype.Component; @Component +@Timed(value = "repository.execution") public class DiscordClubSqlRepository implements DiscordClubRepository { private final DiscordClubMetadataSqlRepository discordClubMetadataSqlRepository; diff --git a/src/main/java/org/patinanetwork/codebloom/common/db/repos/discord/club/metadata/DiscordClubMetadataSqlRepository.java b/src/main/java/org/patinanetwork/codebloom/common/db/repos/discord/club/metadata/DiscordClubMetadataSqlRepository.java index b42ccb731..feef6ca8e 100644 --- a/src/main/java/org/patinanetwork/codebloom/common/db/repos/discord/club/metadata/DiscordClubMetadataSqlRepository.java +++ b/src/main/java/org/patinanetwork/codebloom/common/db/repos/discord/club/metadata/DiscordClubMetadataSqlRepository.java @@ -1,5 +1,6 @@ package org.patinanetwork.codebloom.common.db.repos.discord.club.metadata; +import io.micrometer.core.annotation.Timed; import java.util.Optional; import java.util.UUID; import org.patinanetwork.codebloom.common.db.models.discord.DiscordClubMetadata; @@ -8,6 +9,7 @@ import org.springframework.stereotype.Component; @Component +@Timed(value = "repository.execution") public class DiscordClubMetadataSqlRepository implements DiscordClubMetadataRepository { private static final RowMapper DISCORD_CLUB_METADATA_ROW_MAPPER = (rs, rowNum) -> { diff --git a/src/main/java/org/patinanetwork/codebloom/common/db/repos/feedback/FeedbackSqlRepository.java b/src/main/java/org/patinanetwork/codebloom/common/db/repos/feedback/FeedbackSqlRepository.java index 86ae55bb4..d7d86986a 100644 --- a/src/main/java/org/patinanetwork/codebloom/common/db/repos/feedback/FeedbackSqlRepository.java +++ b/src/main/java/org/patinanetwork/codebloom/common/db/repos/feedback/FeedbackSqlRepository.java @@ -1,5 +1,6 @@ package org.patinanetwork.codebloom.common.db.repos.feedback; +import io.micrometer.core.annotation.Timed; import java.time.OffsetDateTime; import java.util.Optional; import java.util.UUID; @@ -9,6 +10,7 @@ import org.springframework.stereotype.Component; @Component +@Timed(value = "repository.execution") public class FeedbackSqlRepository implements FeedbackRepository { private static final RowMapper FEEDBACK_ROW_MAPPER = (rs, rowNum) -> Feedback.builder() diff --git a/src/main/java/org/patinanetwork/codebloom/common/db/repos/job/JobSqlRepository.java b/src/main/java/org/patinanetwork/codebloom/common/db/repos/job/JobSqlRepository.java index 730748402..4256b8759 100644 --- a/src/main/java/org/patinanetwork/codebloom/common/db/repos/job/JobSqlRepository.java +++ b/src/main/java/org/patinanetwork/codebloom/common/db/repos/job/JobSqlRepository.java @@ -1,5 +1,6 @@ package org.patinanetwork.codebloom.common.db.repos.job; +import io.micrometer.core.annotation.Timed; import java.sql.Types; import java.time.OffsetDateTime; import java.util.List; @@ -11,6 +12,7 @@ import org.springframework.stereotype.Component; @Component +@Timed(value = "repository.execution") public class JobSqlRepository implements JobRepository { private static final RowMapper JOB_ROW_MAPPER = (rs, rowNum) -> Job.builder() diff --git a/src/main/java/org/patinanetwork/codebloom/common/db/repos/leaderboard/LeaderboardSqlRepository.java b/src/main/java/org/patinanetwork/codebloom/common/db/repos/leaderboard/LeaderboardSqlRepository.java index dc4add930..cddb0d674 100644 --- a/src/main/java/org/patinanetwork/codebloom/common/db/repos/leaderboard/LeaderboardSqlRepository.java +++ b/src/main/java/org/patinanetwork/codebloom/common/db/repos/leaderboard/LeaderboardSqlRepository.java @@ -1,5 +1,6 @@ package org.patinanetwork.codebloom.common.db.repos.leaderboard; +import io.micrometer.core.annotation.Timed; import java.sql.Array; import java.sql.Connection; import java.sql.SQLException; @@ -27,6 +28,7 @@ import org.springframework.stereotype.Component; @Component +@Timed(value = "repository.execution") public class LeaderboardSqlRepository implements LeaderboardRepository { private static final String SHOULD_EXPIRE_BY = "shouldExpireBy"; diff --git a/src/main/java/org/patinanetwork/codebloom/common/db/repos/lobby/LobbyQuestionSqlRepository.java b/src/main/java/org/patinanetwork/codebloom/common/db/repos/lobby/LobbyQuestionSqlRepository.java index 41d7dcd98..452b2e02d 100644 --- a/src/main/java/org/patinanetwork/codebloom/common/db/repos/lobby/LobbyQuestionSqlRepository.java +++ b/src/main/java/org/patinanetwork/codebloom/common/db/repos/lobby/LobbyQuestionSqlRepository.java @@ -1,5 +1,6 @@ package org.patinanetwork.codebloom.common.db.repos.lobby; +import io.micrometer.core.annotation.Timed; import java.time.OffsetDateTime; import java.util.List; import java.util.Optional; @@ -10,6 +11,7 @@ import org.springframework.stereotype.Component; @Component +@Timed(value = "repository.execution") public class LobbyQuestionSqlRepository implements LobbyQuestionRepository { private static final RowMapper LOBBY_QUESTION_ROW_MAPPER = (rs, rowNum) -> LobbyQuestion.builder() diff --git a/src/main/java/org/patinanetwork/codebloom/common/db/repos/lobby/LobbySqlRepository.java b/src/main/java/org/patinanetwork/codebloom/common/db/repos/lobby/LobbySqlRepository.java index 5adb1b869..d24058dfc 100644 --- a/src/main/java/org/patinanetwork/codebloom/common/db/repos/lobby/LobbySqlRepository.java +++ b/src/main/java/org/patinanetwork/codebloom/common/db/repos/lobby/LobbySqlRepository.java @@ -1,5 +1,6 @@ package org.patinanetwork.codebloom.common.db.repos.lobby; +import io.micrometer.core.annotation.Timed; import java.sql.Types; import java.time.OffsetDateTime; import java.util.List; @@ -13,6 +14,7 @@ import org.springframework.stereotype.Component; @Component +@Timed(value = "repository.execution") public class LobbySqlRepository implements LobbyRepository { private static final RowMapper LOBBY_ROW_MAPPER = (rs, rowNum) -> Lobby.builder() diff --git a/src/main/java/org/patinanetwork/codebloom/common/db/repos/lobby/player/LobbyPlayerSqlRepository.java b/src/main/java/org/patinanetwork/codebloom/common/db/repos/lobby/player/LobbyPlayerSqlRepository.java index b9c27a292..8da6c9b22 100644 --- a/src/main/java/org/patinanetwork/codebloom/common/db/repos/lobby/player/LobbyPlayerSqlRepository.java +++ b/src/main/java/org/patinanetwork/codebloom/common/db/repos/lobby/player/LobbyPlayerSqlRepository.java @@ -1,5 +1,6 @@ package org.patinanetwork.codebloom.common.db.repos.lobby.player; +import io.micrometer.core.annotation.Timed; import java.util.List; import java.util.Optional; import java.util.UUID; @@ -9,6 +10,7 @@ import org.springframework.stereotype.Component; @Component +@Timed(value = "repository.execution") public class LobbyPlayerSqlRepository implements LobbyPlayerRepository { private static final RowMapper LOBBY_PLAYER_ROW_MAPPER = (rs, rowNum) -> LobbyPlayer.builder() diff --git a/src/main/java/org/patinanetwork/codebloom/common/db/repos/lobby/player/question/LobbyPlayerQuestionSqlRepository.java b/src/main/java/org/patinanetwork/codebloom/common/db/repos/lobby/player/question/LobbyPlayerQuestionSqlRepository.java index b2d8a6b98..8a5bf3ad2 100644 --- a/src/main/java/org/patinanetwork/codebloom/common/db/repos/lobby/player/question/LobbyPlayerQuestionSqlRepository.java +++ b/src/main/java/org/patinanetwork/codebloom/common/db/repos/lobby/player/question/LobbyPlayerQuestionSqlRepository.java @@ -1,5 +1,6 @@ package org.patinanetwork.codebloom.common.db.repos.lobby.player.question; +import io.micrometer.core.annotation.Timed; import java.sql.Types; import java.util.List; import java.util.Optional; @@ -10,6 +11,7 @@ import org.springframework.stereotype.Component; @Component +@Timed(value = "repository.execution") public class LobbyPlayerQuestionSqlRepository implements LobbyPlayerQuestionRepository { private static final RowMapper LOBBY_PLAYER_QUESTION_ROW_MAPPER = diff --git a/src/main/java/org/patinanetwork/codebloom/common/db/repos/potd/POTDSqlRepository.java b/src/main/java/org/patinanetwork/codebloom/common/db/repos/potd/POTDSqlRepository.java index 43f369c27..4b08fc817 100644 --- a/src/main/java/org/patinanetwork/codebloom/common/db/repos/potd/POTDSqlRepository.java +++ b/src/main/java/org/patinanetwork/codebloom/common/db/repos/potd/POTDSqlRepository.java @@ -1,5 +1,6 @@ package org.patinanetwork.codebloom.common.db.repos.potd; +import io.micrometer.core.annotation.Timed; import java.util.ArrayList; import java.util.Optional; import java.util.UUID; @@ -9,6 +10,7 @@ import org.springframework.stereotype.Component; @Component +@Timed(value = "repository.execution") public class POTDSqlRepository implements POTDRepository { private static final RowMapper POTD_ROW_MAPPER = (rs, rowNum) -> POTD.builder() diff --git a/src/main/java/org/patinanetwork/codebloom/common/db/repos/question/QuestionSqlRepository.java b/src/main/java/org/patinanetwork/codebloom/common/db/repos/question/QuestionSqlRepository.java index 3c3a7e494..316b262b4 100644 --- a/src/main/java/org/patinanetwork/codebloom/common/db/repos/question/QuestionSqlRepository.java +++ b/src/main/java/org/patinanetwork/codebloom/common/db/repos/question/QuestionSqlRepository.java @@ -1,5 +1,6 @@ package org.patinanetwork.codebloom.common.db.repos.question; +import io.micrometer.core.annotation.Timed; import java.sql.Array; import java.sql.Connection; import java.sql.ResultSet; @@ -24,6 +25,7 @@ import org.springframework.stereotype.Component; @Component +@Timed(value = "repository.execution") public class QuestionSqlRepository implements QuestionRepository { private final DataSource ds; diff --git a/src/main/java/org/patinanetwork/codebloom/common/db/repos/question/questionbank/QuestionBankSqlRepository.java b/src/main/java/org/patinanetwork/codebloom/common/db/repos/question/questionbank/QuestionBankSqlRepository.java index 0e0a7076a..f3f82f97b 100644 --- a/src/main/java/org/patinanetwork/codebloom/common/db/repos/question/questionbank/QuestionBankSqlRepository.java +++ b/src/main/java/org/patinanetwork/codebloom/common/db/repos/question/questionbank/QuestionBankSqlRepository.java @@ -1,5 +1,6 @@ package org.patinanetwork.codebloom.common.db.repos.question.questionbank; +import io.micrometer.core.annotation.Timed; import java.sql.Types; import java.time.OffsetDateTime; import java.util.List; @@ -17,6 +18,7 @@ import org.springframework.transaction.annotation.Transactional; @Component +@Timed(value = "repository.execution") public class QuestionBankSqlRepository implements QuestionBankRepository { private final JdbcClient jdbcClient; diff --git a/src/main/java/org/patinanetwork/codebloom/common/db/repos/question/topic/QuestionTopicSqlRepository.java b/src/main/java/org/patinanetwork/codebloom/common/db/repos/question/topic/QuestionTopicSqlRepository.java index 60c77db30..9e01496a3 100644 --- a/src/main/java/org/patinanetwork/codebloom/common/db/repos/question/topic/QuestionTopicSqlRepository.java +++ b/src/main/java/org/patinanetwork/codebloom/common/db/repos/question/topic/QuestionTopicSqlRepository.java @@ -1,5 +1,6 @@ package org.patinanetwork.codebloom.common.db.repos.question.topic; +import io.micrometer.core.annotation.Timed; import java.sql.Types; import java.time.LocalDateTime; import java.util.List; @@ -12,6 +13,7 @@ import org.springframework.stereotype.Component; @Component +@Timed(value = "repository.execution") public class QuestionTopicSqlRepository implements QuestionTopicRepository { private static final RowMapper QUESTION_TOPIC_ROW_MAPPER = (rs, rowNum) -> QuestionTopic.builder() diff --git a/src/main/java/org/patinanetwork/codebloom/common/db/repos/session/SessionSqlRepository.java b/src/main/java/org/patinanetwork/codebloom/common/db/repos/session/SessionSqlRepository.java index 724101be1..0cd22fc21 100644 --- a/src/main/java/org/patinanetwork/codebloom/common/db/repos/session/SessionSqlRepository.java +++ b/src/main/java/org/patinanetwork/codebloom/common/db/repos/session/SessionSqlRepository.java @@ -1,5 +1,6 @@ package org.patinanetwork.codebloom.common.db.repos.session; +import io.micrometer.core.annotation.Timed; import java.time.OffsetDateTime; import java.util.ArrayList; import java.util.Map; @@ -12,6 +13,7 @@ import org.springframework.stereotype.Component; @Component +@Timed(value = "repository.execution") public class SessionSqlRepository implements SessionRepository { private static final RowMapper SESSION_ROW_MAPPER = (rs, rowNum) -> Session.builder() diff --git a/src/main/java/org/patinanetwork/codebloom/common/db/repos/task/BackgroundTaskSqlRepository.java b/src/main/java/org/patinanetwork/codebloom/common/db/repos/task/BackgroundTaskSqlRepository.java index 6e97a0b3c..dda15de31 100644 --- a/src/main/java/org/patinanetwork/codebloom/common/db/repos/task/BackgroundTaskSqlRepository.java +++ b/src/main/java/org/patinanetwork/codebloom/common/db/repos/task/BackgroundTaskSqlRepository.java @@ -1,5 +1,6 @@ package org.patinanetwork.codebloom.common.db.repos.task; +import io.micrometer.core.annotation.Timed; import java.sql.Types; import java.time.OffsetDateTime; import java.util.List; @@ -13,6 +14,7 @@ import org.springframework.stereotype.Component; @Component +@Timed(value = "repository.execution") public class BackgroundTaskSqlRepository implements BackgroundTaskRepository { private static final RowMapper BACKGROUND_TASK_ROW_MAPPER = (rs, rowNum) -> BackgroundTask.builder() diff --git a/src/main/java/org/patinanetwork/codebloom/common/db/repos/user/UserMetricsSqlRepository.java b/src/main/java/org/patinanetwork/codebloom/common/db/repos/user/UserMetricsSqlRepository.java index 591f7246a..baf1d7568 100644 --- a/src/main/java/org/patinanetwork/codebloom/common/db/repos/user/UserMetricsSqlRepository.java +++ b/src/main/java/org/patinanetwork/codebloom/common/db/repos/user/UserMetricsSqlRepository.java @@ -1,5 +1,6 @@ package org.patinanetwork.codebloom.common.db.repos.user; +import io.micrometer.core.annotation.Timed; import java.sql.Types; import java.time.OffsetDateTime; import java.util.List; @@ -12,6 +13,7 @@ import org.springframework.stereotype.Component; @Component +@Timed(value = "repository.execution") public class UserMetricsSqlRepository implements UserMetricsRepository { private static final RowMapper USER_METRICS_ROW_MAPPER = (rs, rowNum) -> UserMetrics.builder() diff --git a/src/main/java/org/patinanetwork/codebloom/common/db/repos/user/UserSqlRepository.java b/src/main/java/org/patinanetwork/codebloom/common/db/repos/user/UserSqlRepository.java index 49569447b..9ab38cb93 100644 --- a/src/main/java/org/patinanetwork/codebloom/common/db/repos/user/UserSqlRepository.java +++ b/src/main/java/org/patinanetwork/codebloom/common/db/repos/user/UserSqlRepository.java @@ -1,5 +1,6 @@ package org.patinanetwork.codebloom.common.db.repos.user; +import io.micrometer.core.annotation.Timed; import java.time.OffsetDateTime; import java.util.ArrayList; import java.util.Map; @@ -15,6 +16,7 @@ import org.springframework.stereotype.Component; @Component +@Timed(value = "repository.execution") public class UserSqlRepository implements UserRepository { private final JdbcClient jdbcClient; diff --git a/src/main/java/org/patinanetwork/codebloom/common/db/repos/usertag/UserTagSqlRepository.java b/src/main/java/org/patinanetwork/codebloom/common/db/repos/usertag/UserTagSqlRepository.java index 6a647751d..3f70f5d34 100644 --- a/src/main/java/org/patinanetwork/codebloom/common/db/repos/usertag/UserTagSqlRepository.java +++ b/src/main/java/org/patinanetwork/codebloom/common/db/repos/usertag/UserTagSqlRepository.java @@ -1,5 +1,6 @@ package org.patinanetwork.codebloom.common.db.repos.usertag; +import io.micrometer.core.annotation.Timed; import java.sql.Types; import java.util.ArrayList; import java.util.Optional; @@ -12,6 +13,7 @@ import org.springframework.stereotype.Component; @Component +@Timed(value = "repository.execution") public class UserTagSqlRepository implements UserTagRepository { private static final RowMapper USER_TAG_ROW_MAPPER = (rs, rowNum) -> { diff --git a/src/main/java/org/patinanetwork/codebloom/common/db/repos/weekly/WeeklyMessageSqlRepository.java b/src/main/java/org/patinanetwork/codebloom/common/db/repos/weekly/WeeklyMessageSqlRepository.java index f6072cf02..b3cd5b6d5 100644 --- a/src/main/java/org/patinanetwork/codebloom/common/db/repos/weekly/WeeklyMessageSqlRepository.java +++ b/src/main/java/org/patinanetwork/codebloom/common/db/repos/weekly/WeeklyMessageSqlRepository.java @@ -1,5 +1,6 @@ package org.patinanetwork.codebloom.common.db.repos.weekly; +import io.micrometer.core.annotation.Timed; import java.util.Optional; import java.util.UUID; import org.patinanetwork.codebloom.common.db.models.weekly.WeeklyMessage; @@ -8,6 +9,7 @@ import org.springframework.stereotype.Component; @Component +@Timed(value = "repository.execution") public class WeeklyMessageSqlRepository implements WeeklyMessageRepository { private static final RowMapper WEEKLY_MESSAGE_ROW_MAPPER = (rs, rowNum) -> WeeklyMessage.builder() From 2ccd4d6c9b5e8fd3cc471c515b72154e7595c349 Mon Sep 17 00:00:00 2001 From: Tahmid Ahmed Date: Thu, 8 Oct 2026 10:07:52 -0400 Subject: [PATCH 2/5] TAN-1085: correctly set log type in FetchAllLeetcodeQuestions --- .../codebloom/scheduled/leetcode/FetchAllLeetcodeQuestions.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/patinanetwork/codebloom/scheduled/leetcode/FetchAllLeetcodeQuestions.java b/src/main/java/org/patinanetwork/codebloom/scheduled/leetcode/FetchAllLeetcodeQuestions.java index 4ed1969db..4c016d096 100644 --- a/src/main/java/org/patinanetwork/codebloom/scheduled/leetcode/FetchAllLeetcodeQuestions.java +++ b/src/main/java/org/patinanetwork/codebloom/scheduled/leetcode/FetchAllLeetcodeQuestions.java @@ -67,7 +67,7 @@ public void updateQuestionBank() { if (recentLeetcodeTask.isPresent()) { if (StandardizedOffsetDateTime.now() .isBefore(recentLeetcodeTask.get().getCompletedAt().plusHours(16))) { - log.error("Not time yet to resync question bank"); + log.info("Not time yet to resync question bank"); return; } } From 4b06e16af872f635d7b1e5e069959046434ad8c3 Mon Sep 17 00:00:00 2001 From: Tahmid Ahmed Date: Thu, 8 Oct 2026 10:08:10 -0400 Subject: [PATCH 3/5] TAN-1085: handle NoResourceFoundException correctly --- Justfile | 2 +- .../exception/ControllerExceptionHandler.java | 9 ++++++++ .../ControllerExceptionHandlerTest.java | 21 +++++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/Justfile b/Justfile index 00b783c88..b20acf4fe 100644 --- a/Justfile +++ b/Justfile @@ -77,7 +77,7 @@ email-gen *args: # Run the dev servers (backend & frontend) dev *args: - cp internal/pre-commit .git/hooks/pre-commit && chmod +x .git/hooks/pre-commit && npx concurrently "just backend-dev" "just frontend-dev" {{args}} + npx concurrently "just backend-dev" "just frontend-dev" {{args}} # Run the dev servers (backend & frontend) but the backend will launch a debugger server. devd *args: diff --git a/src/main/java/org/patinanetwork/codebloom/utilities/exception/ControllerExceptionHandler.java b/src/main/java/org/patinanetwork/codebloom/utilities/exception/ControllerExceptionHandler.java index a04801a9f..8931d8db3 100644 --- a/src/main/java/org/patinanetwork/codebloom/utilities/exception/ControllerExceptionHandler.java +++ b/src/main/java/org/patinanetwork/codebloom/utilities/exception/ControllerExceptionHandler.java @@ -12,6 +12,7 @@ import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.server.ResponseStatusException; +import org.springframework.web.servlet.resource.NoResourceFoundException; @ControllerAdvice @Slf4j @@ -42,6 +43,14 @@ public ResponseEntity> handleMethodArgumentNotValid(final Valida return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ApiResponder.failure(ex.getMessage())); } + @ExceptionHandler(NoResourceFoundException.class) + public ResponseEntity handleNoResourceFound(final NoResourceFoundException ex) { + if (log.isDebugEnabled()) { + log.debug(ex.getMessage()); + } + return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); + } + @ExceptionHandler(Throwable.class) public ResponseEntity> handleThrowable(final Throwable rx) { log.error(rx.getMessage(), rx); diff --git a/src/test/java/org/patinanetwork/codebloom/utilities/exception/ControllerExceptionHandlerTest.java b/src/test/java/org/patinanetwork/codebloom/utilities/exception/ControllerExceptionHandlerTest.java index b1d82b03a..b74cb11d9 100644 --- a/src/test/java/org/patinanetwork/codebloom/utilities/exception/ControllerExceptionHandlerTest.java +++ b/src/test/java/org/patinanetwork/codebloom/utilities/exception/ControllerExceptionHandlerTest.java @@ -13,6 +13,9 @@ import org.patinanetwork.codebloom.common.env.Env; import org.patinanetwork.codebloom.common.reporter.Reporter; import org.slf4j.LoggerFactory; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.web.servlet.resource.NoResourceFoundException; public class ControllerExceptionHandlerTest { private final Reporter errorReporter = mock(Reporter.class); @@ -46,4 +49,22 @@ void testHandleExceptionLogsError() { .anyMatch(log -> log.getLevel().equals(Level.ERROR) && log.getFormattedMessage().contains("Expected error!"))); } + + @Test + void testHandleExceptionReturns500AndReports() { + var response = controllerExceptionHandler.handleThrowable(new Exception("Expected error!")); + + assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode()); + verify(errorReporter).error(eq("handleThrowable"), any()); + } + + @Test + void testNoResourceFoundReturns404WithoutReportingOrErrorLog() { + var response = + controllerExceptionHandler.handleNoResourceFound(new NoResourceFoundException(HttpMethod.GET, ".env")); + + assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); + verifyNoInteractions(errorReporter); + assertTrue(logWatcher.list.stream().noneMatch(log -> log.getLevel().equals(Level.ERROR))); + } } From e7944499f970484d61af3bf95b0f48c10cf7a356 Mon Sep 17 00:00:00 2001 From: Tahmid Ahmed Date: Thu, 8 Oct 2026 10:22:51 -0400 Subject: [PATCH 4/5] TAN-1085: reduce CI log output, fix test --- .github/scripts/copy-prod-db/index.ts | 4 +++- .github/scripts/redeploy/db/util.ts | 2 +- .github/scripts/test/run-backend-compile-tests.ts | 4 ++-- .github/scripts/test/run-backend-tests.ts | 4 ++-- .github/scripts/utils/run-backend-instance.ts | 8 +++++++- .github/scripts/utils/run-local-db.ts | 4 +++- .github/scripts/validate-db/index.ts | 2 +- infra/Dockerfile | 6 +++--- .../leaderboard/LeaderboardRepositoryTest.java | 15 ++++++++------- 9 files changed, 30 insertions(+), 19 deletions(-) diff --git a/.github/scripts/copy-prod-db/index.ts b/.github/scripts/copy-prod-db/index.ts index 7d28bbae4..9b3f3ade8 100644 --- a/.github/scripts/copy-prod-db/index.ts +++ b/.github/scripts/copy-prod-db/index.ts @@ -67,7 +67,9 @@ async function main() { }; console.log("Cleaning staging database..."); - await $.env(flywayEnv)`./mvnw flyway:clean -Dflyway.cleanDisabled=false`; + await $.env( + flywayEnv, + )`./mvnw -B -ntp flyway:clean -Dflyway.cleanDisabled=false`; console.log("Copying production database to staging..."); // extensions are provisioned by `platform-infra`, diff --git a/.github/scripts/redeploy/db/util.ts b/.github/scripts/redeploy/db/util.ts index fcdec8273..e278b810c 100644 --- a/.github/scripts/redeploy/db/util.ts +++ b/.github/scripts/redeploy/db/util.ts @@ -29,6 +29,6 @@ export async function _migrateDb({ await $.env({ ...migratorEnv, DATABASE_NAME, - })`./mvnw flyway:migrate -Dflyway.locations=filesystem:./db/migration`; + })`./mvnw -B -ntp flyway:migrate -Dflyway.locations=filesystem:./db/migration`; return "success"; } diff --git a/.github/scripts/test/run-backend-compile-tests.ts b/.github/scripts/test/run-backend-compile-tests.ts index a2aad8a60..39ee578cc 100644 --- a/.github/scripts/test/run-backend-compile-tests.ts +++ b/.github/scripts/test/run-backend-compile-tests.ts @@ -2,10 +2,10 @@ import { $ } from "bun"; async function main() { // fmt - await $`./mvnw spotless:check`; + await $`./mvnw -B -ntp spotless:check`; // lint - await $`./mvnw checkstyle:check`; + await $`./mvnw -B -ntp checkstyle:check`; // compile await $`./mvnw -B verify -Dmaven.test.skip=true --no-transfer-progress`; diff --git a/.github/scripts/test/run-backend-tests.ts b/.github/scripts/test/run-backend-tests.ts index d620d879d..7991b4299 100644 --- a/.github/scripts/test/run-backend-tests.ts +++ b/.github/scripts/test/run-backend-tests.ts @@ -37,11 +37,11 @@ async function main() { await $`./mvnw -B install -D skipTests --no-transfer-progress`; - await $`./mvnw -B exec:java -e -D exec.mainClass=com.microsoft.playwright.CLI -D exec.args="install --with-deps"`; + await $`./mvnw -B -ntp exec:java -e -D exec.mainClass=com.microsoft.playwright.CLI -D exec.args="install --with-deps"`; await $`cd email && pnpm i --frozen-lockfile && ./email.sh && cd ..`; - await $$`./mvnw clean verify -Dspring.profiles.active=ci`; + await $$`./mvnw -B -ntp clean verify -Dspring.profiles.active=ci`; if (shouldUploadCoverage) { const { sonarToken } = parseCiEnv(process.env); diff --git a/.github/scripts/utils/run-backend-instance.ts b/.github/scripts/utils/run-backend-instance.ts index 41cda8a13..c71fc2bfd 100644 --- a/.github/scripts/utils/run-backend-instance.ts +++ b/.github/scripts/utils/run-backend-instance.ts @@ -14,7 +14,13 @@ async function start(env: Record) { const logFile = Bun.file("backend.log"); be = Bun.spawn( - ["./mvnw", "-Dspring-boot.run.profiles=ci", "spring-boot:run"], + [ + "./mvnw", + "-B", + "-ntp", + "-Dspring-boot.run.profiles=ci", + "spring-boot:run", + ], { env: { ...process.env, ...env }, stdout: logFile, diff --git a/.github/scripts/utils/run-local-db.ts b/.github/scripts/utils/run-local-db.ts index 833da972e..5bd056b6f 100644 --- a/.github/scripts/utils/run-local-db.ts +++ b/.github/scripts/utils/run-local-db.ts @@ -52,7 +52,9 @@ async function start() { console.log("postres started, running migrations..."); - await $.env(env)`./mvnw flyway:migrate -Dflyway.locations=filesystem:./db`; + await $.env( + env, + )`./mvnw -B -ntp flyway:migrate -Dflyway.locations=filesystem:./db`; console.log("postgres ready"); diff --git a/.github/scripts/validate-db/index.ts b/.github/scripts/validate-db/index.ts index 107dbe4bd..1fe98e1c0 100644 --- a/.github/scripts/validate-db/index.ts +++ b/.github/scripts/validate-db/index.ts @@ -54,7 +54,7 @@ export async function main() { await $.env({ ...process.env, ...appEnv, - })`bash -c "./mvnw flyway:validate -Dflyway.locations=filesystem:./db/migration -Dflyway.ignoreMigrationPatterns='*:pending'"`; + })`bash -c "./mvnw -B -ntp flyway:validate -Dflyway.locations=filesystem:./db/migration -Dflyway.ignoreMigrationPatterns='*:pending'"`; } main() diff --git a/infra/Dockerfile b/infra/Dockerfile index 88f324bf1..8824c748f 100644 --- a/infra/Dockerfile +++ b/infra/Dockerfile @@ -36,7 +36,7 @@ WORKDIR /app COPY mvnw pom.xml ./ COPY .mvn/ .mvn/ -RUN ./mvnw dependency:resolve -B +RUN ./mvnw -B -ntp dependency:resolve COPY src ./src COPY --from=frontend-build /js/dist/ src/main/resources/static/ @@ -44,7 +44,7 @@ RUN mkdir -p src/main/resources/static/email && rm -f src/main/resources/static/ COPY --from=email-build /email/out/*.html src/main/resources/static/email/ ARG COMMIT_SHA -RUN ./mvnw package -DskipTests -Dcommit.sha="${COMMIT_SHA}" +RUN ./mvnw -B -ntp package -DskipTests -Dcommit.sha="${COMMIT_SHA}" FROM mirror.gcr.io/library/eclipse-temurin:25-jre-jammy @@ -52,7 +52,7 @@ WORKDIR /app COPY mvnw pom.xml ./ COPY .mvn/ .mvn/ -RUN ./mvnw -B exec:java -e -D exec.mainClass=com.microsoft.playwright.CLI -D exec.args="install --with-deps" +RUN ./mvnw -B -ntp exec:java -e -D exec.mainClass=com.microsoft.playwright.CLI -D exec.args="install --with-deps" COPY --from=backend-build /app/target/*.jar app.jar ARG SERVER_PROFILES=prod diff --git a/src/test/java/org/patinanetwork/codebloom/common/db/repos/leaderboard/LeaderboardRepositoryTest.java b/src/test/java/org/patinanetwork/codebloom/common/db/repos/leaderboard/LeaderboardRepositoryTest.java index 4eaed13cd..3545d6aae 100644 --- a/src/test/java/org/patinanetwork/codebloom/common/db/repos/leaderboard/LeaderboardRepositoryTest.java +++ b/src/test/java/org/patinanetwork/codebloom/common/db/repos/leaderboard/LeaderboardRepositoryTest.java @@ -27,6 +27,7 @@ import org.patinanetwork.codebloom.common.db.repos.user.options.UserFilterOptions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.util.AopTestUtils; @SpringBootTest @TestInstance(TestInstance.Lifecycle.PER_CLASS) @@ -65,21 +66,21 @@ void createMockLeaderboard() { @AfterAll void deleteMockLeaderboard() throws Exception { - Method deleteLeaderboardMethod = - leaderboardRepository.getClass().getDeclaredMethod("deleteLeaderboardById", String.class); - Method enableLeaderboardMethod = - leaderboardRepository.getClass().getDeclaredMethod("enableLeaderboardById", String.class); + // repository is proxied (e.g. @Timed), so private methods only exist on the target + LeaderboardRepository target = AopTestUtils.getTargetObject(leaderboardRepository); + + Method deleteLeaderboardMethod = target.getClass().getDeclaredMethod("deleteLeaderboardById", String.class); + Method enableLeaderboardMethod = target.getClass().getDeclaredMethod("enableLeaderboardById", String.class); deleteLeaderboardMethod.setAccessible(true); enableLeaderboardMethod.setAccessible(true); - boolean deleteLeaderboardSuccessful = - (Boolean) deleteLeaderboardMethod.invoke(leaderboardRepository, mockLeaderboard.getId()); + boolean deleteLeaderboardSuccessful = (Boolean) deleteLeaderboardMethod.invoke(target, mockLeaderboard.getId()); assertTrue(deleteLeaderboardSuccessful, "failed to delete mock leaderboard"); boolean enableLeaderboardSuccessful = - (Boolean) enableLeaderboardMethod.invoke(leaderboardRepository, previousLeaderboard.getId()); + (Boolean) enableLeaderboardMethod.invoke(target, previousLeaderboard.getId()); assertTrue(enableLeaderboardSuccessful, "failed to restore previous leaderboard"); } From cd1e7e2bfe84932ef134ab0f9553ebf8adebce21 Mon Sep 17 00:00:00 2001 From: Tahmid Ahmed Date: Thu, 8 Oct 2026 13:03:14 -0400 Subject: [PATCH 5/5] TAN-1085: add leetcode question test to cover skip resync (will trigger debug log & let me merge). remove the isDebugEnabled on controller exception (not really needed, e.getMessage() is pretty cheap) --- .../exception/ControllerExceptionHandler.java | 4 +--- .../leetcode/FetchAllLeetcodeQuestionsTest.java | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/patinanetwork/codebloom/utilities/exception/ControllerExceptionHandler.java b/src/main/java/org/patinanetwork/codebloom/utilities/exception/ControllerExceptionHandler.java index 8931d8db3..1254f1f1b 100644 --- a/src/main/java/org/patinanetwork/codebloom/utilities/exception/ControllerExceptionHandler.java +++ b/src/main/java/org/patinanetwork/codebloom/utilities/exception/ControllerExceptionHandler.java @@ -45,9 +45,7 @@ public ResponseEntity> handleMethodArgumentNotValid(final Valida @ExceptionHandler(NoResourceFoundException.class) public ResponseEntity handleNoResourceFound(final NoResourceFoundException ex) { - if (log.isDebugEnabled()) { - log.debug(ex.getMessage()); - } + log.debug(ex.getMessage()); return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); } diff --git a/src/test/java/org/patinanetwork/codebloom/scheduled/leetcode/FetchAllLeetcodeQuestionsTest.java b/src/test/java/org/patinanetwork/codebloom/scheduled/leetcode/FetchAllLeetcodeQuestionsTest.java index c98902685..0edec4f01 100644 --- a/src/test/java/org/patinanetwork/codebloom/scheduled/leetcode/FetchAllLeetcodeQuestionsTest.java +++ b/src/test/java/org/patinanetwork/codebloom/scheduled/leetcode/FetchAllLeetcodeQuestionsTest.java @@ -6,6 +6,7 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoInteractions; import static org.mockito.Mockito.when; import java.time.OffsetDateTime; @@ -159,4 +160,19 @@ void preservesPremiumMetadataMissingFromFreeProblemList() { job.updateQuestionBank(); verify(questionBankRepository, org.mockito.Mockito.never()).deleteQuestionById("premium-id"); } + + @Test + void skipsResyncWhenLastSyncWasWithin16Hours() { + BackgroundTask recentSync = BackgroundTask.builder() + .task(BackgroundTaskEnum.LEETCODE_QUESTION_BANK) + .completedAt(OffsetDateTime.now().minusHours(1)) + .build(); + when(backgroundTaskRepository.getMostRecentlyCompletedBackgroundTaskByTaskEnum( + BackgroundTaskEnum.LEETCODE_QUESTION_BANK)) + .thenReturn(Optional.of(recentSync)); + + job.updateQuestionBank(); + + verifyNoInteractions(leetcodeClient, questionBankRepository); + } }