From 82a00a07957bf1ff665e50cd65db1d64894233e7 Mon Sep 17 00:00:00 2001
From: Tobias Bruns <kontakt@tobias-bruns.de>
Date: Fri, 3 Jan 2025 10:43:47 +0100
Subject: [PATCH] OZG-6988 load report settings to config server

---
 .../de/ozgcloud/admin/common/DtoService.java  | 16 ++++++++
 .../admin/common/SettingDtoService.java       |  8 ++++
 .../reporting/AggregationMappingMapper.java   | 15 +++++++
 ...ngAggregationManagerSettingDTOService.java | 32 +++++++++++++++
 .../admin/reporting/ReportingSetting.java     | 26 ++++++++++---
 .../admin/reporting/ReportingSettingDto.java  | 39 +++++++++++++++++++
 .../reporting/ReportingSettingRepository.java |  9 ++++-
 .../MapBasedApplicationSettingDto.java        | 22 +++++++++++
 .../admin/setting/SettingConstants.java       |  2 +
 .../setting/SettingEnvironmentRepository.java | 23 ++++++-----
 .../admin/setting/SettingService.java         | 36 +++++++++++++++++
 src/main/resources/application-local.yaml     |  3 ++
 src/main/resources/application.yaml           |  2 +-
 .../LinkedResourceDeserializerTest.java       |  2 -
 .../admin/common/ModelBuilderTest.java        |  3 --
 ...gregationManagerSettingDTOServiceTest.java | 30 ++++++++++++++
 .../ReportingSettingDtoTestFactory.java       | 25 ++++++++++++
 ...TCase.java => ReportingSettingITCase.java} |  7 ++--
 .../ReportingSettingRepositoryITCase.java     | 37 ++++++++++++++++++
 .../ReportingSettingTestFactory.java          | 31 +++++++++++++++
 src/test/resources/application-itcase.yaml    |  2 +
 src/test/resources/reporting/request.json     | 12 ++++++
 22 files changed, 354 insertions(+), 28 deletions(-)
 create mode 100644 src/main/java/de/ozgcloud/admin/common/DtoService.java
 create mode 100644 src/main/java/de/ozgcloud/admin/common/SettingDtoService.java
 create mode 100644 src/main/java/de/ozgcloud/admin/reporting/AggregationMappingMapper.java
 create mode 100644 src/main/java/de/ozgcloud/admin/reporting/ReportingAggregationManagerSettingDTOService.java
 create mode 100644 src/main/java/de/ozgcloud/admin/reporting/ReportingSettingDto.java
 create mode 100644 src/main/java/de/ozgcloud/admin/setting/MapBasedApplicationSettingDto.java
 create mode 100644 src/test/java/de/ozgcloud/admin/reporting/ReportingAggregationManagerSettingDTOServiceTest.java
 create mode 100644 src/test/java/de/ozgcloud/admin/reporting/ReportingSettingDtoTestFactory.java
 rename src/test/java/de/ozgcloud/admin/reporting/{ReportingSettingsITCase.java => ReportingSettingITCase.java} (92%)
 create mode 100644 src/test/java/de/ozgcloud/admin/reporting/ReportingSettingRepositoryITCase.java
 create mode 100644 src/test/java/de/ozgcloud/admin/reporting/ReportingSettingTestFactory.java
 create mode 100644 src/test/resources/reporting/request.json

diff --git a/src/main/java/de/ozgcloud/admin/common/DtoService.java b/src/main/java/de/ozgcloud/admin/common/DtoService.java
new file mode 100644
index 00000000..ca024525
--- /dev/null
+++ b/src/main/java/de/ozgcloud/admin/common/DtoService.java
@@ -0,0 +1,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/common/SettingDtoService.java b/src/main/java/de/ozgcloud/admin/common/SettingDtoService.java
new file mode 100644
index 00000000..2624360a
--- /dev/null
+++ b/src/main/java/de/ozgcloud/admin/common/SettingDtoService.java
@@ -0,0 +1,8 @@
+package de.ozgcloud.admin.common;
+
+public interface SettingDtoService {
+
+	String getSettingKeyName();
+
+	Object getDataTransferObject();
+}
diff --git a/src/main/java/de/ozgcloud/admin/reporting/AggregationMappingMapper.java b/src/main/java/de/ozgcloud/admin/reporting/AggregationMappingMapper.java
new file mode 100644
index 00000000..80ba34c4
--- /dev/null
+++ b/src/main/java/de/ozgcloud/admin/reporting/AggregationMappingMapper.java
@@ -0,0 +1,15 @@
+package de.ozgcloud.admin.reporting;
+
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.NullValueCheckStrategy;
+
+import de.ozgcloud.admin.reporting.ReportingSettingDto.AggregationMappingDto;
+
+@Mapper(nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
+public interface AggregationMappingMapper {
+
+	@Mapping(target = "fieldMapping", ignore = true)
+	@Mapping(target = "fieldMappings", source = "mappings")
+	AggregationMappingDto toMapping(ReportingSetting setting);
+}
diff --git a/src/main/java/de/ozgcloud/admin/reporting/ReportingAggregationManagerSettingDTOService.java b/src/main/java/de/ozgcloud/admin/reporting/ReportingAggregationManagerSettingDTOService.java
new file mode 100644
index 00000000..b74146d6
--- /dev/null
+++ b/src/main/java/de/ozgcloud/admin/reporting/ReportingAggregationManagerSettingDTOService.java
@@ -0,0 +1,32 @@
+package de.ozgcloud.admin.reporting;
+
+import java.util.stream.Stream;
+
+import de.ozgcloud.admin.common.DtoService;
+import de.ozgcloud.admin.common.SettingDtoService;
+import de.ozgcloud.admin.setting.SettingConstants;
+import lombok.RequiredArgsConstructor;
+
+@RequiredArgsConstructor
+@DtoService(SettingConstants.AGGREGATION_MANAGER)
+class ReportingAggregationManagerSettingDTOService implements SettingDtoService {
+
+	private final ReportingSettingRepository repository;
+	private final AggregationMappingMapper mapper;
+
+	@Override
+	public ReportingSettingDto getDataTransferObject() {
+		return mapToDto(repository.findAll().stream());
+	}
+
+	ReportingSettingDto mapToDto(Stream<ReportingSetting> settings) {
+		return ReportingSettingDto.builder()
+				.aggregationMappings(settings.map(mapper::toMapping).toList())
+				.build();
+	}
+
+	@Override
+	public String getSettingKeyName() {
+		return "aggregation";
+	}
+}
diff --git a/src/main/java/de/ozgcloud/admin/reporting/ReportingSetting.java b/src/main/java/de/ozgcloud/admin/reporting/ReportingSetting.java
index 83ad52c2..963c9d0c 100644
--- a/src/main/java/de/ozgcloud/admin/reporting/ReportingSetting.java
+++ b/src/main/java/de/ozgcloud/admin/reporting/ReportingSetting.java
@@ -2,6 +2,7 @@ package de.ozgcloud.admin.reporting;
 
 import java.util.List;
 
+import jakarta.validation.Valid;
 import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotEmpty;
 
@@ -9,34 +10,47 @@ import org.springframework.data.annotation.Id;
 import org.springframework.data.annotation.TypeAlias;
 import org.springframework.data.mongodb.core.mapping.Document;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+import de.ozgcloud.admin.reporting.ReportingSettingDto.FormIdentifierDto;
 import lombok.Builder;
 import lombok.Getter;
+import lombok.Singular;
 import lombok.extern.jackson.Jacksonized;
 
 @Document("settings")
-@TypeAlias("reporting")
+@TypeAlias("fieldMapping")
 @Jacksonized
 @Builder
 @Getter
 public class ReportingSetting {
 
 	@Id
+	@JsonIgnore
 	private String id;
 	@Builder.Default
-	private String name = "reporting";
+	private String name = "fieldMapping";
 
-	@NotBlank
-	private String formEngineName;
-	@NotBlank
-	private String formId;
+	@Valid
+	private FormIdentifierDto formIdentifier;
 
 	@NotEmpty
+	@Singular
 	private List<FieldMapping> mappings;
 
 	@Builder
 	@Getter
 	static class FieldMapping {
+		@NotBlank
 		private String sourcePath;
+		@NotBlank
 		private String targetPath;
 	}
+
+	static class FormIdentifer {
+		@NotBlank
+		private String formEngineName;
+		@NotBlank
+		private String formId;
+	}
 }
diff --git a/src/main/java/de/ozgcloud/admin/reporting/ReportingSettingDto.java b/src/main/java/de/ozgcloud/admin/reporting/ReportingSettingDto.java
new file mode 100644
index 00000000..5b25418b
--- /dev/null
+++ b/src/main/java/de/ozgcloud/admin/reporting/ReportingSettingDto.java
@@ -0,0 +1,39 @@
+package de.ozgcloud.admin.reporting;
+
+import java.util.List;
+
+import lombok.Builder;
+import lombok.Getter;
+import lombok.Singular;
+import lombok.ToString;
+
+@Builder
+@Getter
+@ToString
+public class ReportingSettingDto {
+
+	@Singular
+	private List<AggregationMappingDto> aggregationMappings;
+
+	@Builder
+	@Getter
+	static class AggregationMappingDto {
+		private FormIdentifierDto formIdentifier;
+		@Singular
+		private List<FieldMappingDto> fieldMappings;
+	}
+
+	@Builder
+	@Getter
+	static class FormIdentifierDto {
+		private String formEngineName;
+		private String formId;
+	}
+
+	@Builder
+	@Getter
+	static class FieldMappingDto {
+		private String sourcePath;
+		private String targetPath;
+	}
+}
diff --git a/src/main/java/de/ozgcloud/admin/reporting/ReportingSettingRepository.java b/src/main/java/de/ozgcloud/admin/reporting/ReportingSettingRepository.java
index 3614a99a..0c4f3ec7 100644
--- a/src/main/java/de/ozgcloud/admin/reporting/ReportingSettingRepository.java
+++ b/src/main/java/de/ozgcloud/admin/reporting/ReportingSettingRepository.java
@@ -1,9 +1,14 @@
 package de.ozgcloud.admin.reporting;
 
+import java.util.List;
+
 import org.springframework.data.mongodb.repository.MongoRepository;
+import org.springframework.data.mongodb.repository.Query;
 import org.springframework.data.rest.core.annotation.RepositoryRestResource;
 
 @RepositoryRestResource
-public interface ReportingSettingRepository extends MongoRepository<ReportingSetting, String> {
-
+interface ReportingSettingRepository extends MongoRepository<ReportingSetting, String> {
+	@Override
+	@Query("{'_class': 'fieldMapping'}")
+	List<ReportingSetting> findAll();
 }
diff --git a/src/main/java/de/ozgcloud/admin/setting/MapBasedApplicationSettingDto.java b/src/main/java/de/ozgcloud/admin/setting/MapBasedApplicationSettingDto.java
new file mode 100644
index 00000000..864acde2
--- /dev/null
+++ b/src/main/java/de/ozgcloud/admin/setting/MapBasedApplicationSettingDto.java
@@ -0,0 +1,22 @@
+package de.ozgcloud.admin.setting;
+
+import java.util.Map;
+
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+
+import lombok.Builder;
+import lombok.Getter;
+import lombok.Singular;
+
+@Builder
+@Getter
+public class MapBasedApplicationSettingDto implements ApplicationSettingDTO {
+
+	@Singular
+	private Map<String, Object> settings;
+
+	@JsonAnyGetter
+	public Map<String, Object> getSettings() {
+		return settings;
+	}
+}
diff --git a/src/main/java/de/ozgcloud/admin/setting/SettingConstants.java b/src/main/java/de/ozgcloud/admin/setting/SettingConstants.java
index 9c40c612..afcf0934 100644
--- a/src/main/java/de/ozgcloud/admin/setting/SettingConstants.java
+++ b/src/main/java/de/ozgcloud/admin/setting/SettingConstants.java
@@ -32,4 +32,6 @@ public class SettingConstants {
 	static final String REL = "settings";
 
 	public static final String PATH = "settings";
+
+	public static final String AGGREGATION_MANAGER = "OzgCloud_AggregationManager";
 }
diff --git a/src/main/java/de/ozgcloud/admin/setting/SettingEnvironmentRepository.java b/src/main/java/de/ozgcloud/admin/setting/SettingEnvironmentRepository.java
index db793f2f..dfe17a50 100644
--- a/src/main/java/de/ozgcloud/admin/setting/SettingEnvironmentRepository.java
+++ b/src/main/java/de/ozgcloud/admin/setting/SettingEnvironmentRepository.java
@@ -23,6 +23,8 @@
  */
 package de.ozgcloud.admin.setting;
 
+import static de.ozgcloud.admin.setting.SettingConstants.*;
+
 import java.util.Map;
 import java.util.Optional;
 
@@ -41,13 +43,12 @@ import lombok.RequiredArgsConstructor;
 @Component
 public class SettingEnvironmentRepository implements EnvironmentRepository {
 
-	private final SettingService settingService;
-
-	private final ObjectMapper objectMapper;
-
 	private static final String ALFA = "Alfa";
 	private static final String VORGANG_MANAGER = "OzgCloud_VorgangManager";
 
+	private final SettingService settingService;
+	private final ObjectMapper objectMapper;
+
 	@Override
 	public Environment findOne(String application, String profile, String label) {
 		return buildEnvironment(application, findAnwendungSettingDTO(application));
@@ -55,12 +56,14 @@ public class SettingEnvironmentRepository implements EnvironmentRepository {
 
 	Optional<ApplicationSettingDTO> findAnwendungSettingDTO(String application) {
 		switch (application) {
-			case ALFA:
-				return Optional.of(settingService.getAlfaSettingDTO());
-			case VORGANG_MANAGER:
-				return Optional.of(settingService.getVorgangManagerSettingDTO());
-			default:
-				return Optional.empty();
+		case ALFA:
+			return Optional.of(settingService.getAlfaSettingDTO());
+		case VORGANG_MANAGER:
+			return Optional.of(settingService.getVorgangManagerSettingDTO());
+		case AGGREGATION_MANAGER:
+			return Optional.of(settingService.getAggregationManagerSettingDto());
+		default:
+			return Optional.empty();
 		}
 	}
 
diff --git a/src/main/java/de/ozgcloud/admin/setting/SettingService.java b/src/main/java/de/ozgcloud/admin/setting/SettingService.java
index 51b8529a..ef6a78f3 100644
--- a/src/main/java/de/ozgcloud/admin/setting/SettingService.java
+++ b/src/main/java/de/ozgcloud/admin/setting/SettingService.java
@@ -23,11 +23,20 @@
  */
 package de.ozgcloud.admin.setting;
 
+import static de.ozgcloud.admin.setting.SettingConstants.*;
+
+import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
+import jakarta.annotation.PostConstruct;
+
+import org.springframework.beans.factory.ListableBeanFactory;
 import org.springframework.stereotype.Service;
 
+import de.ozgcloud.admin.common.DtoService;
+import de.ozgcloud.admin.common.SettingDtoService;
 import de.ozgcloud.admin.organisationseinheit.OrganisationsEinheitSettings;
 import de.ozgcloud.admin.setting.postfach.PostfachSettingBody;
 import lombok.RequiredArgsConstructor;
@@ -41,6 +50,21 @@ class SettingService {
 	private final SettingRepository repository;
 
 	private final SettingMapper mapper;
+	private final ListableBeanFactory beanFactory;
+
+	private Map<String, List<SettingDtoService>> dtoServiceByManager;
+
+	@PostConstruct
+	void initDtoServices() {
+		this.dtoServiceByManager = beanFactory.getBeansWithAnnotation(DtoService.class).values().stream()
+				.map(dtoService -> (SettingDtoService) dtoService)
+				.collect(Collectors.groupingBy(dtoService -> getManagerForService(dtoService)));
+	}
+
+	private String getManagerForService(SettingDtoService dtoService) {
+		var annotation = dtoService.getClass().getDeclaredAnnotation(DtoService.class);
+		return annotation.value();
+	}
 
 	public AlfaSettingDTO getAlfaSettingDTO() {
 		var postfachData = getSettingWithPostfachFromDb();
@@ -63,6 +87,17 @@ class SettingService {
 				.build();
 	}
 
+	public ApplicationSettingDTO getAggregationManagerSettingDto() {
+		return MapBasedApplicationSettingDto.builder()
+				.settings(getDtoService(AGGREGATION_MANAGER).stream()
+						.collect(Collectors.toMap(SettingDtoService::getSettingKeyName, SettingDtoService::getDataTransferObject)))
+				.build();
+	}
+
+	private List<SettingDtoService> getDtoService(String managerName) {
+		return dtoServiceByManager.getOrDefault(managerName, Collections.emptyList());
+	}
+
 	PostfachSettingBody getSettingWithPostfachFromDb() {
 		return repository.findOneByName(POSTFACH_SETTING_ITEM_NAME)
 				.map(Setting::getSettingBody)
@@ -75,4 +110,5 @@ class SettingService {
 				OrganisationsEinheitWithSettings::organisationsEinheitId,
 				OrganisationsEinheitWithSettings::settings));
 	}
+
 }
diff --git a/src/main/resources/application-local.yaml b/src/main/resources/application-local.yaml
index c5bb57b3..7faeb3ac 100644
--- a/src/main/resources/application-local.yaml
+++ b/src/main/resources/application-local.yaml
@@ -1,3 +1,6 @@
+logging:
+  config: classpath:log4j2-local.xml
+
 spring:
   data:
     mongodb:
diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml
index f4a4954d..eda94433 100644
--- a/src/main/resources/application.yaml
+++ b/src/main/resources/application.yaml
@@ -21,7 +21,7 @@
 # unter der Lizenz sind dem Lizenztext zu entnehmen.
 logging:
   level:
-    ROOT: INFO
+    ROOT: WARN
     '[de.ozgcloud]': INFO
 
 management:
diff --git a/src/test/java/de/ozgcloud/admin/common/LinkedResourceDeserializerTest.java b/src/test/java/de/ozgcloud/admin/common/LinkedResourceDeserializerTest.java
index 57b29873..b5011677 100644
--- a/src/test/java/de/ozgcloud/admin/common/LinkedResourceDeserializerTest.java
+++ b/src/test/java/de/ozgcloud/admin/common/LinkedResourceDeserializerTest.java
@@ -31,8 +31,6 @@ import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 
-import com.fasterxml.jackson.core.exc.StreamReadException;
-import com.fasterxml.jackson.databind.DatabindException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 
 import de.ozgcloud.admin.common.user.TestId;
diff --git a/src/test/java/de/ozgcloud/admin/common/ModelBuilderTest.java b/src/test/java/de/ozgcloud/admin/common/ModelBuilderTest.java
index eaaf4500..74c8a11d 100644
--- a/src/test/java/de/ozgcloud/admin/common/ModelBuilderTest.java
+++ b/src/test/java/de/ozgcloud/admin/common/ModelBuilderTest.java
@@ -24,11 +24,9 @@
 package de.ozgcloud.admin.common;
 
 import static org.assertj.core.api.Assertions.*;
-import static org.mockito.Mockito.*;
 
 import java.util.UUID;
 
-import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
@@ -36,7 +34,6 @@ import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.NullAndEmptySource;
 import org.mockito.Mock;
 import org.springframework.context.ApplicationContext;
-import org.springframework.core.env.Environment;
 import org.springframework.web.bind.annotation.RequestMapping;
 
 import lombok.Builder;
diff --git a/src/test/java/de/ozgcloud/admin/reporting/ReportingAggregationManagerSettingDTOServiceTest.java b/src/test/java/de/ozgcloud/admin/reporting/ReportingAggregationManagerSettingDTOServiceTest.java
new file mode 100644
index 00000000..a7b8213b
--- /dev/null
+++ b/src/test/java/de/ozgcloud/admin/reporting/ReportingAggregationManagerSettingDTOServiceTest.java
@@ -0,0 +1,30 @@
+package de.ozgcloud.admin.reporting;
+
+import static org.assertj.core.api.Assertions.*;
+
+import java.util.stream.Stream;
+
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mapstruct.factory.Mappers;
+import org.mockito.InjectMocks;
+import org.mockito.Spy;
+
+class ReportingAggregationManagerSettingDTOServiceTest {
+
+	@InjectMocks
+	private ReportingAggregationManagerSettingDTOService service;
+	@Spy
+	private AggregationMappingMapper mapper = Mappers.getMapper(AggregationMappingMapper.class);
+
+	@Nested
+	class TestMapToDto {
+		@Test
+		void shouldCreateDto() {
+			var dto = service.mapToDto(Stream.of(ReportingSettingTestFactory.create()));
+
+			assertThat(dto).usingRecursiveComparison().isEqualTo(ReportingSettingDtoTestFactory.create());
+		}
+	}
+
+}
diff --git a/src/test/java/de/ozgcloud/admin/reporting/ReportingSettingDtoTestFactory.java b/src/test/java/de/ozgcloud/admin/reporting/ReportingSettingDtoTestFactory.java
new file mode 100644
index 00000000..b465498c
--- /dev/null
+++ b/src/test/java/de/ozgcloud/admin/reporting/ReportingSettingDtoTestFactory.java
@@ -0,0 +1,25 @@
+package de.ozgcloud.admin.reporting;
+
+import static de.ozgcloud.admin.reporting.ReportingSettingTestFactory.*;
+
+import de.ozgcloud.admin.reporting.ReportingSettingDto.AggregationMappingDto;
+import de.ozgcloud.admin.reporting.ReportingSettingDto.FieldMappingDto;
+import de.ozgcloud.admin.reporting.ReportingSettingDto.FormIdentifierDto;
+
+class ReportingSettingDtoTestFactory {
+
+	public static final FormIdentifierDto FORM_IDENTIFIER = FormIdentifierDto.builder().formId(FORM_ID).formEngineName(FORM_ENGINE_NAME).build();
+
+	public static ReportingSettingDto create() {
+		return createBuilder().build();
+	}
+
+	public static ReportingSettingDto.ReportingSettingDtoBuilder createBuilder() {
+		return ReportingSettingDto.builder()
+				.aggregationMapping(AggregationMappingDto.builder()
+						.formIdentifier(FORM_IDENTIFIER)
+						.fieldMapping(FieldMappingDto.builder().sourcePath(SOURCE_PATH).targetPath(TARGET_PATH).build())
+						.build());
+	}
+
+}
diff --git a/src/test/java/de/ozgcloud/admin/reporting/ReportingSettingsITCase.java b/src/test/java/de/ozgcloud/admin/reporting/ReportingSettingITCase.java
similarity index 92%
rename from src/test/java/de/ozgcloud/admin/reporting/ReportingSettingsITCase.java
rename to src/test/java/de/ozgcloud/admin/reporting/ReportingSettingITCase.java
index 6e0a486d..298e5a19 100644
--- a/src/test/java/de/ozgcloud/admin/reporting/ReportingSettingsITCase.java
+++ b/src/test/java/de/ozgcloud/admin/reporting/ReportingSettingITCase.java
@@ -6,7 +6,6 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
 
 import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
@@ -16,12 +15,13 @@ import org.springframework.security.test.context.support.WithMockUser;
 import org.springframework.test.web.servlet.MockMvc;
 
 import de.ozgcloud.common.test.DataITCase;
+import de.ozgcloud.common.test.TestUtils;
 import lombok.SneakyThrows;
 
 @AutoConfigureMockMvc
 @WithMockUser(roles = "ADMIN_ADMIN")
 @DataITCase
-class ReportingSettingsITCase {
+class ReportingSettingITCase {
 
 	@Autowired
 	private MockMvc mockMvc;
@@ -50,12 +50,11 @@ class ReportingSettingsITCase {
 				.andExpect(status().isUnprocessableEntity());
 	}
 
-	@Disabled
 	@Test
 	@SneakyThrows
 	void shouldAddReportingSetting() {
 		mockMvc.perform(post("/api/configuration/reportingSettings").with(csrf())
-				.contentType(MediaType.APPLICATION_JSON).content("{}"))
+				.contentType(MediaType.APPLICATION_JSON).content(TestUtils.loadTextFile("reporting/request.json")))
 				.andExpect(status().isCreated());
 
 		var collection = mongoOperations.getCollection("settings");
diff --git a/src/test/java/de/ozgcloud/admin/reporting/ReportingSettingRepositoryITCase.java b/src/test/java/de/ozgcloud/admin/reporting/ReportingSettingRepositoryITCase.java
new file mode 100644
index 00000000..96905a1b
--- /dev/null
+++ b/src/test/java/de/ozgcloud/admin/reporting/ReportingSettingRepositoryITCase.java
@@ -0,0 +1,37 @@
+package de.ozgcloud.admin.reporting;
+
+import static org.assertj.core.api.Assertions.*;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoOperations;
+
+import de.ozgcloud.admin.setting.SettingTestFactory;
+import de.ozgcloud.common.test.DataITCase;
+
+@DataITCase
+class ReportingSettingRepositoryITCase {
+
+	@Autowired
+	private ReportingSettingRepository repository;
+
+	@Autowired
+	private MongoOperations operations;
+
+	@BeforeEach
+	void dropCollection() {
+		operations.dropCollection("settings");
+	}
+
+	@Test
+	void shouldLoadOnlyFieldMapping() {
+		operations.save(ReportingSettingTestFactory.create());
+		operations.save(SettingTestFactory.create());
+
+		var result = repository.findAll();
+
+		assertThat(result).hasSize(1);
+	}
+
+}
diff --git a/src/test/java/de/ozgcloud/admin/reporting/ReportingSettingTestFactory.java b/src/test/java/de/ozgcloud/admin/reporting/ReportingSettingTestFactory.java
new file mode 100644
index 00000000..b825f04d
--- /dev/null
+++ b/src/test/java/de/ozgcloud/admin/reporting/ReportingSettingTestFactory.java
@@ -0,0 +1,31 @@
+package de.ozgcloud.admin.reporting;
+
+import java.util.UUID;
+
+import de.ozgcloud.admin.reporting.ReportingSetting.FieldMapping;
+import de.ozgcloud.admin.reporting.ReportingSettingDto.FormIdentifierDto;
+
+class ReportingSettingTestFactory {
+
+	public static final String ID = UUID.randomUUID().toString();
+	public static final String FORM_ENGINE_NAME = "A12";
+	public static final String FORM_ID = "123AABC";
+
+	public static final String SOURCE_PATH = "name";
+	public static final String TARGET_PATH = "antragsteller.name";
+
+	public static ReportingSetting create() {
+		return createBuilder().build();
+	}
+
+	public static ReportingSetting.ReportingSettingBuilder createBuilder() {
+		return ReportingSetting.builder()
+				.id(UUID.randomUUID().toString())
+				.formIdentifier(FormIdentifierDto.builder()
+						.formEngineName(FORM_ENGINE_NAME)
+						.formId(FORM_ID)
+						.build())
+				.mapping(FieldMapping.builder().sourcePath(SOURCE_PATH).targetPath(TARGET_PATH).build());
+	}
+
+}
diff --git a/src/test/resources/application-itcase.yaml b/src/test/resources/application-itcase.yaml
index 05de7ad1..07702372 100644
--- a/src/test/resources/application-itcase.yaml
+++ b/src/test/resources/application-itcase.yaml
@@ -1,4 +1,6 @@
 logging:
+  level:
+    '[org.springframework.data.mongodb]': WARN
   config: classpath:log4j2-local.xml
 
 spring:
diff --git a/src/test/resources/reporting/request.json b/src/test/resources/reporting/request.json
new file mode 100644
index 00000000..19608183
--- /dev/null
+++ b/src/test/resources/reporting/request.json
@@ -0,0 +1,12 @@
+{
+	"formIdentifier": {
+		"formEngineName": "AFM",
+		"formId": "42"
+	},
+	"mappings": [
+		{
+			"sourcePath": "name",
+			"targetPath": "antragsteller.name"
+		}
+	] 
+}
\ No newline at end of file
-- 
GitLab