From 6475ff2a5c9a5287b4af9f28f687850af5e7f47d Mon Sep 17 00:00:00 2001 From: OZGCloud <ozgcloud@mgm-tp.com> Date: Fri, 8 Mar 2024 12:14:49 +0100 Subject: [PATCH] OZG-5044 SettingService --- pom.xml | 38 +++++ .../admin/settings/AlfaKonfiguration.java | 4 + .../admin/settings/SettingMapper.java | 37 +++++ .../admin/settings/SettingRepository.java | 6 +- .../admin/settings/SettingService.java | 28 +++- .../settings/VorgangManagerKonfiguration.java | 4 + .../admin/settings/postfach/Absender.java | 2 +- .../SettingEnvironmentRepositoryTest.java | 3 - .../admin/settings/SettingServiceTest.java | 148 ++++++++++++++++++ ...organgManagerKonfigurationTestFactory.java | 5 +- 10 files changed, 267 insertions(+), 8 deletions(-) create mode 100644 src/main/java/de/ozgcloud/admin/settings/SettingMapper.java create mode 100644 src/test/java/de/ozgcloud/admin/settings/SettingServiceTest.java diff --git a/pom.xml b/pom.xml index 0ffeec2d..e1418204 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,7 @@ <testcontainers-keycloak.version>3.2.0</testcontainers-keycloak.version> <keycloak-admin-client.version>23.0.6</keycloak-admin-client.version> <mongock.version>5.4.0</mongock.version> + <lombok-mapstruct-binding.version>0.2.0</lombok-mapstruct-binding.version> </properties> <dependencies> @@ -70,6 +71,11 @@ <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> + <!-- tools --> + <dependency> + <groupId>org.mapstruct</groupId> + <artifactId>mapstruct</artifactId> + </dependency> <!-- mongock --> <dependency> <groupId>io.mongock</groupId> @@ -222,6 +228,38 @@ </execution> </executions> </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <configuration> + <source>1.8</source> + <target>1.8</target> + <!-- See https://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html --> + <!-- Classpath elements to supply as annotation processor path. If specified, the compiler --> + <!-- will detect annotation processors only in those classpath elements. If omitted, the --> + <!-- default classpath is used to detect annotation processors. The detection itself depends --> + <!-- on the configuration of annotationProcessors. --> + <!-- --> + <!-- According to this documentation, the provided dependency processor is not considered! --> + <annotationProcessorPaths> + <path> + <groupId>org.mapstruct</groupId> + <artifactId>mapstruct-processor</artifactId> + <version>${org.mapstruct.version}</version> + </path> + <path> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + <version>${org.projectlombok.version}</version> + </path> + <path> + <groupId>org.projectlombok</groupId> + <artifactId>lombok-mapstruct-binding</artifactId> + <version>${lombok-mapstruct-binding.version}</version> + </path> + </annotationProcessorPaths> + </configuration> + </plugin> </plugins> </build> diff --git a/src/main/java/de/ozgcloud/admin/settings/AlfaKonfiguration.java b/src/main/java/de/ozgcloud/admin/settings/AlfaKonfiguration.java index abcf52ec..5a2824ae 100644 --- a/src/main/java/de/ozgcloud/admin/settings/AlfaKonfiguration.java +++ b/src/main/java/de/ozgcloud/admin/settings/AlfaKonfiguration.java @@ -1,11 +1,15 @@ package de.ozgcloud.admin.settings; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Builder; @Builder class AlfaKonfiguration implements AnwendungsKonfiguration { + @JsonIgnore + protected static final String[] KONFIGURATIONS_TYPES = new String[] { "Postfach" }; + @JsonProperty("ozgcloud.postfach.signatur") @Builder.Default String signatur = ""; diff --git a/src/main/java/de/ozgcloud/admin/settings/SettingMapper.java b/src/main/java/de/ozgcloud/admin/settings/SettingMapper.java new file mode 100644 index 00000000..714360d7 --- /dev/null +++ b/src/main/java/de/ozgcloud/admin/settings/SettingMapper.java @@ -0,0 +1,37 @@ +package de.ozgcloud.admin.settings; + +import org.mapstruct.Mapper; +import org.mapstruct.MappingTarget; + +import de.ozgcloud.admin.settings.AlfaKonfiguration.AlfaKonfigurationBuilder; +import de.ozgcloud.admin.settings.AnwendungsKonfiguration.AnwendungsKonfigurationBuilder; +import de.ozgcloud.admin.settings.VorgangManagerKonfiguration.VorgangManagerKonfigurationBuilder; +import de.ozgcloud.admin.settings.postfach.Absender; +import de.ozgcloud.admin.settings.postfach.AbsenderVorgangManager; +import de.ozgcloud.admin.settings.postfach.PostfachSettingBody; + +@Mapper +public interface SettingMapper { + + public default AnwendungsKonfigurationBuilder mapToAnwendungKonfiguration(@MappingTarget AnwendungsKonfigurationBuilder builder, + SettingBody body) { + if (body == null) { + return builder; + } + if (body instanceof PostfachSettingBody) { + if (builder instanceof AlfaKonfigurationBuilder) { + return addPostfachToAlfaKonfiguration((AlfaKonfigurationBuilder) builder, (PostfachSettingBody) body); + } else if (builder instanceof VorgangManagerKonfigurationBuilder) { + return addPostfachToVorgangManagerKonfiguration((VorgangManagerKonfigurationBuilder) builder, (PostfachSettingBody) body); + } + } + return builder; + } + + AlfaKonfigurationBuilder addPostfachToAlfaKonfiguration(@MappingTarget AlfaKonfigurationBuilder builder, PostfachSettingBody body); + + VorgangManagerKonfigurationBuilder addPostfachToVorgangManagerKonfiguration(@MappingTarget VorgangManagerKonfigurationBuilder builder, + PostfachSettingBody body); + + AbsenderVorgangManager mapAbsenderToAbsenderVorgangManager(Absender absender); +} diff --git a/src/main/java/de/ozgcloud/admin/settings/SettingRepository.java b/src/main/java/de/ozgcloud/admin/settings/SettingRepository.java index c81b27b5..f0d18f34 100644 --- a/src/main/java/de/ozgcloud/admin/settings/SettingRepository.java +++ b/src/main/java/de/ozgcloud/admin/settings/SettingRepository.java @@ -21,10 +21,14 @@ */ package de.ozgcloud.admin.settings; +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(collectionResourceRel = SettingConstant.REL, path = SettingConstant.PATH) interface SettingRepository extends MongoRepository<Setting, String> { - + @Query("{'name' : {$in : ?0}}") + List<Setting> findByNames(String[] names); } diff --git a/src/main/java/de/ozgcloud/admin/settings/SettingService.java b/src/main/java/de/ozgcloud/admin/settings/SettingService.java index 72829e56..38dd9854 100644 --- a/src/main/java/de/ozgcloud/admin/settings/SettingService.java +++ b/src/main/java/de/ozgcloud/admin/settings/SettingService.java @@ -1,14 +1,38 @@ package de.ozgcloud.admin.settings; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import de.ozgcloud.admin.settings.AnwendungsKonfiguration.AnwendungsKonfigurationBuilder; + @Service public class SettingService { + @Autowired + private SettingRepository repository; + @Autowired + private SettingMapper mapper; + public AlfaKonfiguration getAlfaKonfiguration() { - return null; + var settings = getSettingListFromDb(AlfaKonfiguration.KONFIGURATIONS_TYPES); + var alfaKonfigurationBuilder = AlfaKonfiguration.builder(); + buildKonfiguration(alfaKonfigurationBuilder, settings); + return alfaKonfigurationBuilder.build(); } public VorgangManagerKonfiguration getVorgangManagerKonfiguration() { - return null; + var settings = getSettingListFromDb(VorgangManagerKonfiguration.KONFIGURATIONS_TYPES); + var vorgangManagerKonfigurationBuilder = VorgangManagerKonfiguration.builder(); + buildKonfiguration(vorgangManagerKonfigurationBuilder, settings); + return vorgangManagerKonfigurationBuilder.build(); + } + + private List<Setting> getSettingListFromDb(String[] settingTypes) { + return repository.findByNames(settingTypes); + } + + private void buildKonfiguration(AnwendungsKonfigurationBuilder builder, List<Setting> settings) { + settings.forEach(setting -> mapper.mapToAnwendungKonfiguration(builder, setting.getSettingBody())); } } diff --git a/src/main/java/de/ozgcloud/admin/settings/VorgangManagerKonfiguration.java b/src/main/java/de/ozgcloud/admin/settings/VorgangManagerKonfiguration.java index d55607ed..80e123b6 100644 --- a/src/main/java/de/ozgcloud/admin/settings/VorgangManagerKonfiguration.java +++ b/src/main/java/de/ozgcloud/admin/settings/VorgangManagerKonfiguration.java @@ -1,5 +1,6 @@ package de.ozgcloud.admin.settings; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonUnwrapped; import de.ozgcloud.admin.settings.postfach.AbsenderVorgangManager; @@ -9,6 +10,9 @@ import lombok.Getter; @Builder @Getter class VorgangManagerKonfiguration implements AnwendungsKonfiguration { + @JsonIgnore + protected static final String[] KONFIGURATIONS_TYPES = new String[] { "Postfach" }; + @JsonUnwrapped(prefix = "ozgcloud.postfach.absender.") @Builder.Default private AbsenderVorgangManager absender = AbsenderVorgangManager.builder().build(); diff --git a/src/main/java/de/ozgcloud/admin/settings/postfach/Absender.java b/src/main/java/de/ozgcloud/admin/settings/postfach/Absender.java index c5be084a..102416b1 100644 --- a/src/main/java/de/ozgcloud/admin/settings/postfach/Absender.java +++ b/src/main/java/de/ozgcloud/admin/settings/postfach/Absender.java @@ -11,7 +11,7 @@ import lombok.extern.jackson.Jacksonized; @Getter @Builder @Jacksonized -class Absender { +public class Absender { @NotEmpty(message = FIELD_IS_EMPTY) private String name; @NotEmpty(message = FIELD_IS_EMPTY) diff --git a/src/test/java/de/ozgcloud/admin/settings/SettingEnvironmentRepositoryTest.java b/src/test/java/de/ozgcloud/admin/settings/SettingEnvironmentRepositoryTest.java index d8d9eeab..040a1b73 100644 --- a/src/test/java/de/ozgcloud/admin/settings/SettingEnvironmentRepositoryTest.java +++ b/src/test/java/de/ozgcloud/admin/settings/SettingEnvironmentRepositoryTest.java @@ -5,15 +5,12 @@ import static org.mockito.Mockito.*; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; -import org.mockito.junit.jupiter.MockitoExtension; import com.fasterxml.jackson.databind.ObjectMapper; -@ExtendWith(MockitoExtension.class) public class SettingEnvironmentRepositoryTest { @InjectMocks @Spy diff --git a/src/test/java/de/ozgcloud/admin/settings/SettingServiceTest.java b/src/test/java/de/ozgcloud/admin/settings/SettingServiceTest.java new file mode 100644 index 00000000..76c553af --- /dev/null +++ b/src/test/java/de/ozgcloud/admin/settings/SettingServiceTest.java @@ -0,0 +1,148 @@ +package de.ozgcloud.admin.settings; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; + +import java.util.List; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; +import org.mockito.junit.jupiter.MockitoExtension; + +import de.ozgcloud.admin.settings.AlfaKonfiguration.AlfaKonfigurationBuilder; +import de.ozgcloud.admin.settings.VorgangManagerKonfiguration.VorgangManagerKonfigurationBuilder; +import de.ozgcloud.admin.settings.postfach.PostfachSettingBody; +import de.ozgcloud.admin.settings.postfach.PostfachSettingBodyTestFactory; + +@ExtendWith(MockitoExtension.class) +public class SettingServiceTest { + private final static String[] POSTFACH_ARRAY = new String[] { "Postfach" }; + + @InjectMocks + @Spy + private SettingService service; + + @Mock + private SettingRepository repository; + + @Mock + private SettingMapper mapper; + + private final String POSTFACH = "Postfach"; + private final PostfachSettingBody postfach = PostfachSettingBodyTestFactory.create(); + private final Setting settingWithPostfach = SettingTestFactory.createBuilder().name(POSTFACH).settingBody(postfach).build(); + @Captor + private ArgumentCaptor<SettingBody> bodyCaptor; + + @Nested + class TestGetAlfaKonfiguration { + private final AlfaKonfigurationBuilder ALFA_KONFIGURATION_BUILDER = AlfaKonfiguration.builder(); + @Captor + private ArgumentCaptor<AlfaKonfigurationBuilder> alfaBuilderCaptor; + + private final AlfaKonfiguration alfaSetting = AlfaKonfigurationTestFactory.create(); + + @BeforeEach + void mockRepository() { + when(repository.findByNames(POSTFACH_ARRAY)).thenReturn(List.of(settingWithPostfach)); + } + + @Test + void shouldQueryRepositoryWithPostfachArray() { + service.getAlfaKonfiguration(); + + verify(repository).findByNames(POSTFACH_ARRAY); + } + + @Test + void shouldCallMapToAlfaKonfigurationWithAlfaBuilder() { + service.getAlfaKonfiguration(); + + verify(mapper).mapToAnwendungKonfiguration(alfaBuilderCaptor.capture(), bodyCaptor.capture()); + + assertThat(alfaBuilderCaptor.getValue()).usingRecursiveComparison().isEqualTo(ALFA_KONFIGURATION_BUILDER); + } + + @Test + void shouldCallMapToAlfaKonfigurationWithPostfachSettingBody() { + service.getAlfaKonfiguration(); + + verify(mapper).mapToAnwendungKonfiguration(alfaBuilderCaptor.capture(), bodyCaptor.capture()); + + assertThat(bodyCaptor.getValue()).usingRecursiveComparison().isEqualTo(postfach); + } + + @Test + void shouldReturnBuiltAlfaKonfiguration() { + when(mapper.mapToAnwendungKonfiguration(any(), eq(postfach))).thenAnswer(input -> { + ((AlfaKonfigurationBuilder) input.getArgument(0)).signatur(PostfachSettingBodyTestFactory.SIGNATUR); + return input.getArgument(0); + }); + + var resultAppSetting = service.getAlfaKonfiguration(); + + assertThat(resultAppSetting).usingRecursiveComparison().isEqualTo(alfaSetting); + } + + } + + @Nested + class TestGetVorgangManagerKonfiguration { + private final VorgangManagerKonfigurationBuilder VORGANG_MANAGER_KONFIGURATION_BUILDER = VorgangManagerKonfiguration.builder(); + @Captor + private ArgumentCaptor<VorgangManagerKonfigurationBuilder> vorgangManagerBuilderCaptor; + + private final VorgangManagerKonfiguration vorgangManagerSetting = VorgangManagerKonfigurationTestFactory.create(); + + @BeforeEach + void mockRepository() { + when(repository.findByNames(POSTFACH_ARRAY)).thenReturn(List.of(settingWithPostfach)); + } + + @Test + void shouldQueryRepositoryWithPostfachArray() { + service.getVorgangManagerKonfiguration(); + + verify(repository).findByNames(POSTFACH_ARRAY); + } + + @Test + void shouldCallMapToVorgangManagerKonfigurationWithVorgangManagerBuilder() { + service.getVorgangManagerKonfiguration(); + + verify(mapper).mapToAnwendungKonfiguration(vorgangManagerBuilderCaptor.capture(), bodyCaptor.capture()); + + assertThat(vorgangManagerBuilderCaptor.getValue()).usingRecursiveComparison().isEqualTo(VORGANG_MANAGER_KONFIGURATION_BUILDER); + } + + @Test + void shouldCallMapToVorgangManagerKonfigurationWithPostfachSettingBody() { + service.getVorgangManagerKonfiguration(); + + verify(mapper).mapToAnwendungKonfiguration(vorgangManagerBuilderCaptor.capture(), bodyCaptor.capture()); + + assertThat(bodyCaptor.getValue()).usingRecursiveComparison().isEqualTo(postfach); + } + + @Test + void shouldReturnBuiltVorgangManagerKonfiguration() { + when(mapper.mapToAnwendungKonfiguration(any(), eq(postfach))).thenAnswer(input -> { + ((VorgangManagerKonfigurationBuilder) input.getArgument(0)).absender(VorgangManagerKonfigurationTestFactory.ABSENDER_VM); + return input.getArgument(0); + }); + + var resultAppSetting = service.getVorgangManagerKonfiguration(); + + assertThat(resultAppSetting).usingRecursiveComparison().isEqualTo(vorgangManagerSetting); + } + + } +} diff --git a/src/test/java/de/ozgcloud/admin/settings/VorgangManagerKonfigurationTestFactory.java b/src/test/java/de/ozgcloud/admin/settings/VorgangManagerKonfigurationTestFactory.java index 18fbddfc..f35110e7 100644 --- a/src/test/java/de/ozgcloud/admin/settings/VorgangManagerKonfigurationTestFactory.java +++ b/src/test/java/de/ozgcloud/admin/settings/VorgangManagerKonfigurationTestFactory.java @@ -1,13 +1,16 @@ package de.ozgcloud.admin.settings; +import de.ozgcloud.admin.settings.postfach.AbsenderVorgangManager; import de.ozgcloud.admin.settings.postfach.AbsenderVorgangManagerTestFactory; public class VorgangManagerKonfigurationTestFactory { + public static AbsenderVorgangManager ABSENDER_VM = AbsenderVorgangManagerTestFactory.create(); + public static VorgangManagerKonfiguration create() { return createBuilder().build(); } public static VorgangManagerKonfiguration.VorgangManagerKonfigurationBuilder createBuilder() { - return VorgangManagerKonfiguration.builder().absender(AbsenderVorgangManagerTestFactory.create()); + return VorgangManagerKonfiguration.builder().absender(ABSENDER_VM); } } -- GitLab