From ec2921b2e69a371a12d0ee1bbb61dcd4b878869f Mon Sep 17 00:00:00 2001
From: Michael Breu <Michael.Breu@arctis.at>
Date: Tue, 27 Aug 2024 17:58:15 +0200
Subject: [PATCH] Fixing sporadic duplicate exercises (and sonar)

---
 .../search/ElasticSearchRepository.java          | 16 ++++++++++++----
 .../gitsearch/service/StatisticsService.java     |  7 ++++++-
 .../gitsearch/service/AuditEventServiceIT.java   |  4 ++--
 .../gitsearch/service/ReminderServiceIT.java     |  4 +---
 4 files changed, 21 insertions(+), 10 deletions(-)

diff --git a/src/main/java/at/ac/uibk/gitsearch/repository/search/ElasticSearchRepository.java b/src/main/java/at/ac/uibk/gitsearch/repository/search/ElasticSearchRepository.java
index 0fbd62e69..45b564543 100644
--- a/src/main/java/at/ac/uibk/gitsearch/repository/search/ElasticSearchRepository.java
+++ b/src/main/java/at/ac/uibk/gitsearch/repository/search/ElasticSearchRepository.java
@@ -78,10 +78,14 @@ public class ElasticSearchRepository {
         return i.index(index).id(exerciseId).document(document);
       });
     final String exerciseId2 = document.getExerciseId();
-    try {
-      ExerciseId.fromString(exerciseId2);
-    } catch (ParseException e) {
-      LOGGER.error("Somehow we got an corrupt exerciseId {}", exerciseId2, e);
+    if (exerciseId2 == null) {
+      LOGGER.error("Somehow we got an empty exerciseId in {}", document);
+    } else {
+      try {
+        ExerciseId.fromString(exerciseId2);
+      } catch (ParseException e) {
+        LOGGER.error("Somehow we got an corrupt exerciseId {}", exerciseId2, e);
+      }
     }
     return exerciseId2;
   }
@@ -158,9 +162,13 @@ public class ElasticSearchRepository {
    * @throws ElasticsearchException
    * @throws IOException
    */
+  @SuppressWarnings("null")
   public SearchResultDTO get(final String docId) throws IOException {
     final GetResponse<SearchResultDTO> searchResultDTOResponse =
       this.elasticsearchAPIClient.get(r -> r.index(SearchRepositoryConstants.INDEX_METADATA).id(docId), SearchResultDTO.class);
+    if (searchResultDTOResponse.source() != null) {
+      searchResultDTOResponse.source().setExerciseId(docId);
+    }
     return searchResultDTOResponse.source();
   }
 
diff --git a/src/main/java/at/ac/uibk/gitsearch/service/StatisticsService.java b/src/main/java/at/ac/uibk/gitsearch/service/StatisticsService.java
index 98c444e9f..3ca27991a 100644
--- a/src/main/java/at/ac/uibk/gitsearch/service/StatisticsService.java
+++ b/src/main/java/at/ac/uibk/gitsearch/service/StatisticsService.java
@@ -4,6 +4,7 @@ import at.ac.uibk.gitsearch.domain.Statistics;
 import at.ac.uibk.gitsearch.repository.jpa.StatisticsRepository;
 import at.ac.uibk.gitsearch.repository.search.ElasticSearchRepository;
 import at.ac.uibk.gitsearch.service.dto.StatisticsDTO;
+import at.ac.uibk.gitsearch.service.mapper.StatisticsMapper;
 import java.io.IOException;
 import java.util.List;
 import java.util.Map;
@@ -35,6 +36,9 @@ public class StatisticsService {
   @Autowired
   private ElasticSearchRepository elasticSearchRepository;
 
+  @Autowired
+  private StatisticsMapper statisticsMapper;
+
   /**
    * Save a statistics.
    *
@@ -231,7 +235,8 @@ public class StatisticsService {
       entry = statistics.get(statistics.size() - 1); // last one
     }
     updater.update(entry);
-    statisticsRepository.save(entry);
+    entry = statisticsRepository.save(entry);
+    updateSearchResult(statisticsMapper.toDto(entry));
   }
 
   public void removeBadgeForStatisticsByExerciseID(String exerciseID) {
diff --git a/src/test/java/at/ac/uibk/gitsearch/service/AuditEventServiceIT.java b/src/test/java/at/ac/uibk/gitsearch/service/AuditEventServiceIT.java
index b13dc5f1b..abc8530ad 100644
--- a/src/test/java/at/ac/uibk/gitsearch/service/AuditEventServiceIT.java
+++ b/src/test/java/at/ac/uibk/gitsearch/service/AuditEventServiceIT.java
@@ -103,7 +103,7 @@ public class AuditEventServiceIT {
   @Test
   @Timeout(value = 5, unit = TimeUnit.MINUTES)
   @DirtiesContext
-  public void verifyOldAuditEventsAreDeleted() {
+  void verifyOldAuditEventsAreDeleted() {
     assertThat(persistenceAuditEventRepository.findAll().size()).isEqualTo(currentAuditLogs + auditEventsOld.size() + 2);
 
     log.info("Removing outdated AuditEvents");
@@ -124,7 +124,7 @@ public class AuditEventServiceIT {
   @Test
   @Timeout(value = 5, unit = TimeUnit.MINUTES)
   @DirtiesContext
-  public void verifyOldAuditEventsAreDeleted2() {
+  void verifyOldAuditEventsAreDeleted2() {
     assertThat(persistenceAuditEventRepository.findAll().size()).isEqualTo(currentAuditLogs + auditEventsOld.size() + 2);
 
     int deleted = this.auditEventService.removeOutdatedAuditEvents2();
diff --git a/src/test/java/at/ac/uibk/gitsearch/service/ReminderServiceIT.java b/src/test/java/at/ac/uibk/gitsearch/service/ReminderServiceIT.java
index 9ab54cae5..47da511d0 100644
--- a/src/test/java/at/ac/uibk/gitsearch/service/ReminderServiceIT.java
+++ b/src/test/java/at/ac/uibk/gitsearch/service/ReminderServiceIT.java
@@ -225,9 +225,7 @@ public class ReminderServiceIT {
     verify(mailService).sendEmail(toCaptor.capture(), subjectCaptor.capture(), messageCaptor.capture(), anyBoolean(), anyBoolean());
     assertThat(toCaptor.getValue()).contains(user.getEmail());
     final String content = messageCaptor.getValue();
-    assertThat(content).isNotEmpty();
-
-    assertThat(content).contains("Simple IO Test").contains("testDaily");
+    assertThat(content).isNotEmpty().contains("Simple IO Test").contains("testDaily");
 
     // last sending update?
     // for daily watch list
-- 
GitLab