From 8a2ad1b63941af40bad1279fb8c07f9b9005c881 Mon Sep 17 00:00:00 2001
From: Tobias Bruns <tobias.bruns@mgm-tp.com>
Date: Tue, 14 Jan 2025 08:42:43 +0100
Subject: [PATCH] OZG-6988 fix loading via configserver endpoint without role

---
 .../de/ozgcloud/admin/common/DtoService.java  |  7 +++++
 .../admin/reporting/AggregationMapping.java   |  4 ++-
 ...ngAggregationManagerSettingDtoService.java |  6 ++--
 .../admin/setting/SettingRepository.java      | 14 ++++++++--
 .../AggregationMappingTestFactory.java        |  2 +-
 ...gregationManagerSettingDtoServiceTest.java |  9 +++---
 .../setting/SettingRepositoryITCase.java      | 28 +++++++++++++------
 .../admin/setting/SettingTestFactory.java     |  4 ++-
 8 files changed, 54 insertions(+), 20 deletions(-)

diff --git a/src/main/java/de/ozgcloud/admin/common/DtoService.java b/src/main/java/de/ozgcloud/admin/common/DtoService.java
index 7feaa873..6e260a3f 100644
--- a/src/main/java/de/ozgcloud/admin/common/DtoService.java
+++ b/src/main/java/de/ozgcloud/admin/common/DtoService.java
@@ -23,9 +23,16 @@
  */
 package de.ozgcloud.admin.common;
 
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
 import org.springframework.stereotype.Service;
 
 @Service
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
 public @interface DtoService {
 
 	String[] value();
diff --git a/src/main/java/de/ozgcloud/admin/reporting/AggregationMapping.java b/src/main/java/de/ozgcloud/admin/reporting/AggregationMapping.java
index dba1cf9f..d923d2c0 100644
--- a/src/main/java/de/ozgcloud/admin/reporting/AggregationMapping.java
+++ b/src/main/java/de/ozgcloud/admin/reporting/AggregationMapping.java
@@ -42,13 +42,15 @@ import lombok.ToString;
 import lombok.extern.jackson.Jacksonized;
 
 @Document("settings")
-@TypeAlias("AggregationMapping")
+@TypeAlias(AggregationMapping.TYPE_ALIAS)
 @Jacksonized
 @Builder
 @Getter
 @ToString
 public class AggregationMapping {
 
+	public static final String TYPE_ALIAS = "AggregationMapping";
+
 	@Id
 	@JsonIgnore
 	private String id;
diff --git a/src/main/java/de/ozgcloud/admin/reporting/ReportingAggregationManagerSettingDtoService.java b/src/main/java/de/ozgcloud/admin/reporting/ReportingAggregationManagerSettingDtoService.java
index 62a6ab9b..acb46bf4 100644
--- a/src/main/java/de/ozgcloud/admin/reporting/ReportingAggregationManagerSettingDtoService.java
+++ b/src/main/java/de/ozgcloud/admin/reporting/ReportingAggregationManagerSettingDtoService.java
@@ -28,18 +28,20 @@ import java.util.stream.Stream;
 import de.ozgcloud.admin.common.DtoService;
 import de.ozgcloud.admin.common.SettingDtoService;
 import de.ozgcloud.admin.setting.SettingConstants;
+import de.ozgcloud.admin.setting.SettingRepository;
 import lombok.RequiredArgsConstructor;
 
 @RequiredArgsConstructor
 @DtoService(SettingConstants.AGGREGATION_MANAGER)
 class ReportingAggregationManagerSettingDtoService implements SettingDtoService {
 
-	private final AggregationMappingRepository repository;
 	private final AggregationMappingMapper mapper;
 
+	private final SettingRepository repository;
+
 	@Override
 	public ReportingAggregationManagerSettingDto getDataTransferObject() {
-		return mapToDto(repository.findAll().stream());
+		return mapToDto(repository.findByType("AggregationMapping", AggregationMapping.class));
 	}
 
 	ReportingAggregationManagerSettingDto mapToDto(Stream<AggregationMapping> settings) {
diff --git a/src/main/java/de/ozgcloud/admin/setting/SettingRepository.java b/src/main/java/de/ozgcloud/admin/setting/SettingRepository.java
index 1cfb2957..ddeeae9f 100644
--- a/src/main/java/de/ozgcloud/admin/setting/SettingRepository.java
+++ b/src/main/java/de/ozgcloud/admin/setting/SettingRepository.java
@@ -23,15 +23,25 @@
  */
 package de.ozgcloud.admin.setting;
 
+import java.util.List;
 import java.util.Optional;
+import java.util.stream.Stream;
 
 import org.springframework.data.mongodb.repository.MongoRepository;
+import org.springframework.data.mongodb.repository.Query;
 import org.springframework.data.rest.core.annotation.RepositoryRestResource;
 import org.springframework.security.access.annotation.Secured;
 
-@Secured("ROLE_ADMIN_ADMIN")
 @RepositoryRestResource(collectionResourceRel = SettingConstants.REL, path = SettingConstants.PATH)
-interface SettingRepository extends MongoRepository<Setting, String> {
+public interface SettingRepository extends MongoRepository<Setting, String> {
+
+	@Secured("ROLE_ADMIN_ADMIN")
+	@Override
+	@Query("{'_class': 'Setting'}")
+	List<Setting> findAll();
 
 	Optional<Setting> findOneByName(String name);
+
+	@Query("{'_class': ?0}")
+	<T> Stream<T> findByType(String typeName, Class<T> clazz);
 }
diff --git a/src/test/java/de/ozgcloud/admin/reporting/AggregationMappingTestFactory.java b/src/test/java/de/ozgcloud/admin/reporting/AggregationMappingTestFactory.java
index 4bdc2082..5d41bec2 100644
--- a/src/test/java/de/ozgcloud/admin/reporting/AggregationMappingTestFactory.java
+++ b/src/test/java/de/ozgcloud/admin/reporting/AggregationMappingTestFactory.java
@@ -28,7 +28,7 @@ import java.util.UUID;
 import de.ozgcloud.admin.reporting.AggregationMapping.FieldMapping;
 import de.ozgcloud.admin.reporting.AggregationMapping.FormIdentifier;
 
-class AggregationMappingTestFactory {
+public class AggregationMappingTestFactory {
 
 	public static final String ID = UUID.randomUUID().toString();
 	public static final String FORM_ENGINE_NAME = "A12";
diff --git a/src/test/java/de/ozgcloud/admin/reporting/ReportingAggregationManagerSettingDtoServiceTest.java b/src/test/java/de/ozgcloud/admin/reporting/ReportingAggregationManagerSettingDtoServiceTest.java
index dc5c554d..38b5d5e3 100644
--- a/src/test/java/de/ozgcloud/admin/reporting/ReportingAggregationManagerSettingDtoServiceTest.java
+++ b/src/test/java/de/ozgcloud/admin/reporting/ReportingAggregationManagerSettingDtoServiceTest.java
@@ -27,7 +27,6 @@ import static org.assertj.core.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
-import java.util.List;
 import java.util.stream.Stream;
 
 import org.junit.jupiter.api.BeforeEach;
@@ -39,6 +38,8 @@ import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.Spy;
 
+import de.ozgcloud.admin.setting.SettingRepository;
+
 class ReportingAggregationManagerSettingDtoServiceTest {
 
 	@Spy
@@ -48,7 +49,7 @@ class ReportingAggregationManagerSettingDtoServiceTest {
 	@Mock
 	private AggregationMappingMapper mapper;
 	@Mock
-	private AggregationMappingRepository repository;
+	private SettingRepository repository;
 
 	@Nested
 	class TestMapToDto {
@@ -89,13 +90,13 @@ class ReportingAggregationManagerSettingDtoServiceTest {
 		void shouldCallRepository() {
 			service.getDataTransferObject();
 
-			verify(repository).findAll();
+			verify(repository).findByType(AggregationMapping.TYPE_ALIAS, AggregationMapping.class);
 		}
 
 		@Test
 		void shouldCallMapToDto() {
 			AggregationMapping mapping = AggregationMappingTestFactory.create();
-			when(repository.findAll()).thenReturn(List.of(mapping));
+			when(repository.findByType(any(), any())).thenReturn(Stream.of(mapping));
 
 			service.getDataTransferObject();
 
diff --git a/src/test/java/de/ozgcloud/admin/setting/SettingRepositoryITCase.java b/src/test/java/de/ozgcloud/admin/setting/SettingRepositoryITCase.java
index 649efee5..4f7dc9e6 100644
--- a/src/test/java/de/ozgcloud/admin/setting/SettingRepositoryITCase.java
+++ b/src/test/java/de/ozgcloud/admin/setting/SettingRepositoryITCase.java
@@ -32,33 +32,43 @@ import org.springframework.data.mongodb.core.MongoOperations;
 import org.springframework.security.test.context.support.WithMockUser;
 
 import de.ozgcloud.admin.common.user.UserRole;
+import de.ozgcloud.admin.reporting.AggregationMappingTestFactory;
 import de.ozgcloud.common.test.DataITCase;
 
 @DataITCase
 @WithMockUser(roles = UserRole.ADMIN_ADMIN)
 class SettingRepositoryITCase {
 
-	private static final String SETTING_NAME = "Name";
-
 	@Autowired
 	private MongoOperations mongoOperations;
 	@Autowired
 	private SettingRepository repository;
 
-	private Setting setting = SettingTestFactory.createBuilder()
-			.name(SETTING_NAME)
-			.build();
-
 	@Nested
 	class TestFindOneByName {
 		@Test
 		void shouldGetSavedData() {
 			mongoOperations.dropCollection(Setting.COLLECTION_NAME);
-			mongoOperations.save(setting);
+			mongoOperations.save(SettingTestFactory.create());
+
+			var settingFromDb = repository.findOneByName(SettingTestFactory.SETTING_NAME).get();
+
+			assertThat(settingFromDb).usingRecursiveComparison().ignoringFields("id").isEqualTo(SettingTestFactory.create());
+		}
+	}
+
+	@Nested
+	class TestFindByType {
+
+		@Test
+		void shouldReturnOnlySetting() {
+			mongoOperations.dropCollection(Setting.COLLECTION_NAME);
+			mongoOperations.save(SettingTestFactory.create());
+			mongoOperations.save(AggregationMappingTestFactory.create());
 
-			var settingFromDb = repository.findOneByName(SETTING_NAME).get();
+			var loaded = repository.findByType("Setting", Setting.class);
 
-			assertThat(settingFromDb).usingRecursiveComparison().isEqualTo(setting);
+			assertThat(loaded).hasSize(1).first().isInstanceOf(Setting.class);
 		}
 	}
 }
diff --git a/src/test/java/de/ozgcloud/admin/setting/SettingTestFactory.java b/src/test/java/de/ozgcloud/admin/setting/SettingTestFactory.java
index 07e9533f..54c4ae3b 100644
--- a/src/test/java/de/ozgcloud/admin/setting/SettingTestFactory.java
+++ b/src/test/java/de/ozgcloud/admin/setting/SettingTestFactory.java
@@ -27,12 +27,14 @@ import de.ozgcloud.common.test.TestUtils;
 
 public class SettingTestFactory {
 
+	static final String SETTING_NAME = "Name";
+
 	public static Setting create() {
 		return createBuilder().build();
 	}
 
 	public static Setting.SettingBuilder createBuilder() {
-		return Setting.builder();
+		return Setting.builder().name(SETTING_NAME);
 	}
 
 	public static String buildSettingJson(Setting setting, String settingBodyString) {
-- 
GitLab