From f0e065600ef1479d5e39efd446dc3b154f91babd Mon Sep 17 00:00:00 2001 From: Marcus Fihlon Date: Wed, 29 Apr 2026 12:24:19 +0200 Subject: [PATCH] fix(analytics): flush achievement deletes before rebuild inserts Avoid unique-constraint violations during achievement rebuilds by forcing the old rows to be deleted in the database before inserting rebuilt achievements. Signed-off-by: Marcus Fihlon --- .../java/net/javahippie/fitpub/service/AchievementService.java | 2 ++ .../net/javahippie/fitpub/service/AchievementServiceTest.java | 1 + 2 files changed, 3 insertions(+) diff --git a/src/main/java/net/javahippie/fitpub/service/AchievementService.java b/src/main/java/net/javahippie/fitpub/service/AchievementService.java index 0c21c5e..cf86e32 100644 --- a/src/main/java/net/javahippie/fitpub/service/AchievementService.java +++ b/src/main/java/net/javahippie/fitpub/service/AchievementService.java @@ -109,10 +109,12 @@ public class AchievementService { List activityHistory = activityRepository.findByUserIdOrderByStartedAtAsc(userId); if (activityHistory.isEmpty()) { achievementRepository.deleteByUserId(userId); + achievementRepository.flush(); return List.of(); } achievementRepository.deleteByUserId(userId); + achievementRepository.flush(); Set existing = EnumSet.noneOf(Achievement.AchievementType.class); List rebuiltAchievements = new ArrayList<>(); diff --git a/src/test/java/net/javahippie/fitpub/service/AchievementServiceTest.java b/src/test/java/net/javahippie/fitpub/service/AchievementServiceTest.java index f6f5665..45ab5e2 100644 --- a/src/test/java/net/javahippie/fitpub/service/AchievementServiceTest.java +++ b/src/test/java/net/javahippie/fitpub/service/AchievementServiceTest.java @@ -411,6 +411,7 @@ class AchievementServiceTest { InOrder inOrder = inOrder(achievementRepository); inOrder.verify(achievementRepository).deleteByUserId(userId); + inOrder.verify(achievementRepository).flush(); inOrder.verify(achievementRepository, atLeastOnce()).save(any(Achievement.class)); }