diff --git a/pluto-server/pom.xml b/pluto-server/pom.xml index 9bdd80d5d6a1749f627807505abc469da945daed..42231e157c9cacd03e2808a63a14a8257218be2e 100644 --- a/pluto-server/pom.xml +++ b/pluto-server/pom.xml @@ -48,6 +48,7 @@ <spring-boot.build-image.imageName>docker.ozg-sh.de/pluto:build-latest</spring-boot.build-image.imageName> <kop.license.version>1.3.0</kop.license.version> + <kop.zufi.version>0.1.0-SNAPSHOT</kop.zufi.version> <zip.version>2.11.1</zip.version> <jsoup.version>1.15.3</jsoup.version> @@ -81,6 +82,12 @@ <version>${project.version}</version> <scope>runtime</scope> </dependency> + + <dependency> + <groupId>de.itvsh.kop.zufi</groupId> + <artifactId>kop-zufi-api</artifactId> + <version>${kop.zufi.version}</version> + </dependency> <!-- Spring --> <dependency> diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/RegistryScheduler.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/RegistryScheduler.java new file mode 100644 index 0000000000000000000000000000000000000000..06ca63659b853cfe74216635d385ab634e313aec --- /dev/null +++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/RegistryScheduler.java @@ -0,0 +1,18 @@ +package de.itvsh.ozg.pluto.registry; + +import java.util.concurrent.TimeUnit; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +@Component +class RegistryScheduler { + @Autowired + private RegistryService registryService; + + @Scheduled(fixedDelayString = "${kop.vorgangmanager.registry.intervall}", initialDelay = 5, timeUnit = TimeUnit.MINUTES) + void register() { + registryService.registerVorgangManager(); + } +} diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/RegistryService.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/RegistryService.java new file mode 100644 index 0000000000000000000000000000000000000000..e683f37e3af93fa64b85c52fcccdb87f6837bc7b --- /dev/null +++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/RegistryService.java @@ -0,0 +1,35 @@ +package de.itvsh.ozg.pluto.registry; + +import java.util.List; + +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import lombok.extern.log4j.Log4j2; + +@Service +@Log4j2 +class RegistryService { + @Autowired + private UserOrganisationsEinheitenRemoteService userOrganisationsEinheitenRemoteService; + + @Autowired + private ZufiRemoteService zufiRemoteService; + + void registerVorgangManager() { + try { + register(userOrganisationsEinheitenRemoteService.getSupportedOrganisationsEinheiten()); + } catch (Exception e) { + LOG.error("Error registering this VorgangsManager.", e); + } + } + + private void register(List<String> supportedOrganisationsEinheiten) { + if (CollectionUtils.isNotEmpty(supportedOrganisationsEinheiten)) { + zufiRemoteService.registerVorgangManager(supportedOrganisationsEinheiten); + } else { + LOG.info("No OrganistationsEinheitenIds provided. Not registering this VorgangsManager"); + } + } +} diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/UserOrganisationsEinheitenRemoteService.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/UserOrganisationsEinheitenRemoteService.java new file mode 100644 index 0000000000000000000000000000000000000000..9babe2cd3ea28246857fcc287cd4baab4a2f2cc7 --- /dev/null +++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/UserOrganisationsEinheitenRemoteService.java @@ -0,0 +1,14 @@ +package de.itvsh.ozg.pluto.registry; + +import java.util.List; + +import org.springframework.stereotype.Service; + +@Service +class UserOrganisationsEinheitenRemoteService { + + List<String> getSupportedOrganisationsEinheiten() { + return null; + } + +} diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/ZufiRemoteService.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/ZufiRemoteService.java new file mode 100644 index 0000000000000000000000000000000000000000..569f6d36deeada0d4d6eb358b4ee4aa056dc7276 --- /dev/null +++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/ZufiRemoteService.java @@ -0,0 +1,42 @@ +package de.itvsh.ozg.pluto.registry; + +import java.util.List; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import de.itvsh.kop.zufi.grpc.registration.GrpcRegistrationRequest; +import de.itvsh.kop.zufi.grpc.registration.RegistrationServiceGrpc; +import lombok.NonNull; +import lombok.extern.log4j.Log4j2; +import net.devh.boot.grpc.client.inject.GrpcClient; + +@Log4j2 +@Service +class ZufiRemoteService { + @Value(value = "${kop.vorgangmanager.register.external.address:}") + private String externalVorgangManagerAddress; + + @GrpcClient("zufi-manager") + private RegistrationServiceGrpc.RegistrationServiceBlockingStub registryGrpcService; + + void registerVorgangManager(@NonNull List<String> organistationsEinheitenIds) { + var proceed = checkPreconditions(); + + if (proceed) { + var request = GrpcRegistrationRequest.newBuilder().addAllOrganisationseinheitenId(organistationsEinheitenIds) + .setAddress(externalVorgangManagerAddress).build(); + registryGrpcService.register(request); + } + } + + boolean checkPreconditions() { + if (StringUtils.isEmpty(externalVorgangManagerAddress)) { + LOG.warn("Property kop.vorgangmanager.register.external.address not set. Not registering this VorgangsManager"); + return false; + } + + return true; + } +} diff --git a/pluto-server/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/pluto-server/src/main/resources/META-INF/additional-spring-configuration-metadata.json index 8eff43ef35a026d11421528306fa3084a84fcd50..b87f57218bf216a3d40f77d5c29882a3aed0af79 100644 --- a/pluto-server/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/pluto-server/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -33,5 +33,15 @@ "name": "kop.usermanager.url", "type": "java.lang.String", "description": "Url of the user manager migration endpoint" + }, + { + "name": "kop.notification.mail-from", + "type": "java.lang.String", + "description": "The sender email address used in notification emails" + }, + { + "name": "kop.vorgangmanager.registry.intervall", + "type": "java.lang.String", + "description": "The update intervall of the VorgangManager OrgansisationsEinheiten Ids in minutes" } ]} \ No newline at end of file diff --git a/pluto-server/src/main/resources/application.yml b/pluto-server/src/main/resources/application.yml index 3864230aee4ada47c4e04c62de9af908d132e27c..f37dba65d928655467e6ba8a7c18b4e14470b38a 100644 --- a/pluto-server/src/main/resources/application.yml +++ b/pluto-server/src/main/resources/application.yml @@ -29,7 +29,11 @@ grpc: negotiationType: PLAINTEXT email: address: self:self - negotiationType: PLAINTEXT + negotiationType: PLAINTEXT + zufi-manager: + address: static://127.0.0.1:9010 + negotiationType: PLAINTEXT + pluto: redirect: mail-from: EA-Poststelle@itvsh.de @@ -65,3 +69,6 @@ kop: enabled: true notification: mail-from: hilfe@kop.support + vorgangmanager: + registry: + intervall: 360 diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/registry/RegistrySchedulerTest.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/registry/RegistrySchedulerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..c4dc3915acfe4a5fe42796ae4321167769a8dcd9 --- /dev/null +++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/registry/RegistrySchedulerTest.java @@ -0,0 +1,31 @@ +package de.itvsh.ozg.pluto.registry; + +import static org.mockito.Mockito.*; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; + +class RegistrySchedulerTest { + + @DisplayName("Test the registry scheduler") + @Nested + class TestScheduler { + @Spy + @InjectMocks + private RegistryScheduler registryScheduler; + + @Mock + private RegistryService registryService; + + @Test + void shouldCallService() { + registryScheduler.register(); + + verify(registryService).registerVorgangManager(); + } + } +} diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/registry/RegistryServiceTest.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/registry/RegistryServiceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..54be62dd2e89148fcf82e605d2657345a9dc14c6 --- /dev/null +++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/registry/RegistryServiceTest.java @@ -0,0 +1,68 @@ +package de.itvsh.ozg.pluto.registry; + +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; + +import org.elasticsearch.core.List; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; + +class RegistryServiceTest { + + @DisplayName("Test registry service") + @Nested + class TestService { + @Spy + @InjectMocks + private RegistryService registryService; + + @Mock + private UserOrganisationsEinheitenRemoteService userOrganisationsEinheitenRemoteService; + + @Mock + private ZufiRemoteService zufiRemoteService; + + @BeforeEach + void init() { + when(userOrganisationsEinheitenRemoteService.getSupportedOrganisationsEinheiten()).thenReturn(List.of("123456", "987654")); + } + + @Test + void shouldCallUserRemoteService() { + registryService.registerVorgangManager(); + + verify(userOrganisationsEinheitenRemoteService).getSupportedOrganisationsEinheiten(); + } + + @Test + void shouldCallZuFiRemoteService() { + registryService.registerVorgangManager(); + + verify(zufiRemoteService).registerVorgangManager(any()); + } + + @Test + void shouldNotCallZuFiRemoteServiceOnEmptyOrganisationsEinheitenIds() { + when(userOrganisationsEinheitenRemoteService.getSupportedOrganisationsEinheiten()).thenReturn(List.of()); + + registryService.registerVorgangManager(); + + verify(zufiRemoteService, never()).registerVorgangManager(any()); + } + + @Test + void shouldNotCallZuFiRemoteServiceOnException() { + when(userOrganisationsEinheitenRemoteService.getSupportedOrganisationsEinheiten()).thenThrow(Exception.class); + + registryService.registerVorgangManager(); + + verify(zufiRemoteService, never()).registerVorgangManager(any()); + } + } + +} diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/registry/ZufiManagerRemoteServiceTest.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/registry/ZufiManagerRemoteServiceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..7cca9cb85d6ddce805fe2d512500a9cb2f27b58f --- /dev/null +++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/registry/ZufiManagerRemoteServiceTest.java @@ -0,0 +1,37 @@ +package de.itvsh.ozg.pluto.registry; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Spy; +import org.springframework.test.util.ReflectionTestUtils; + +class ZufiManagerRemoteServiceTest { + @DisplayName("Test ZuFiRemoteService") + @Nested + class TestZufiManagerRemoteService { + + @Spy + @InjectMocks + private ZufiRemoteService zufiRemoteService; + + @Test + void shouldProceed() { + ReflectionTestUtils.setField(zufiRemoteService, "externalVorgangManagerAddress", "value"); + + var proceed = zufiRemoteService.checkPreconditions(); + + assertThat(proceed).isTrue(); + } + + @Test + void shouldNotProceed() { + var proceed = zufiRemoteService.checkPreconditions(); + + assertThat(proceed).isFalse(); + } + } +}