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 <marcus@fihlon.swiss>
This commit is contained in:
Marcus Fihlon 2026-04-29 12:24:19 +02:00
parent 251beaae0f
commit f0e065600e
Signed by: McPringle
GPG key ID: C6B7F469EE363E1F
2 changed files with 3 additions and 0 deletions

View file

@ -109,10 +109,12 @@ public class AchievementService {
List<Activity> activityHistory = activityRepository.findByUserIdOrderByStartedAtAsc(userId);
if (activityHistory.isEmpty()) {
achievementRepository.deleteByUserId(userId);
achievementRepository.flush();
return List.of();
}
achievementRepository.deleteByUserId(userId);
achievementRepository.flush();
Set<Achievement.AchievementType> existing = EnumSet.noneOf(Achievement.AchievementType.class);
List<Achievement> rebuiltAchievements = new ArrayList<>();

View file

@ -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));
}