Skip to content
Snippets Groups Projects
Commit ebd1f98b authored by Krzysztof Witukiewicz's avatar Krzysztof Witukiewicz
Browse files

OZG-7573 OZG-7923 Create ForwardingRemoteService

parent f5c433ea
No related branches found
No related tags found
1 merge request!23Ozg 7573 forwarding interface
This commit is part of merge request !23. Comments created here will be created in the context of that merge request.
...@@ -60,6 +60,7 @@ ...@@ -60,6 +60,7 @@
<collaboration-manager.version>0.7.0</collaboration-manager.version> <collaboration-manager.version>0.7.0</collaboration-manager.version>
<archive-manager.version>0.3.0</archive-manager.version> <archive-manager.version>0.3.0</archive-manager.version>
<document-manager.version>1.2.0</document-manager.version> <document-manager.version>1.2.0</document-manager.version>
<eingang-manager-interface.version>2.19.0-SNAPSHOT</eingang-manager-interface.version>
<zip.version>2.11.5</zip.version> <zip.version>2.11.5</zip.version>
<jsoup.version>1.15.3</jsoup.version> <jsoup.version>1.15.3</jsoup.version>
...@@ -171,6 +172,11 @@ ...@@ -171,6 +172,11 @@
<artifactId>api-lib-core</artifactId> <artifactId>api-lib-core</artifactId>
<version>${api-lib.version}</version> <version>${api-lib.version}</version>
</dependency> </dependency>
<dependency>
<groupId>de.ozgcloud.eingang</groupId>
<artifactId>eingang-manager-interface</artifactId>
<version>${eingang-manager-interface.version}</version>
</dependency>
<!-- Spring --> <!-- Spring -->
<dependency> <dependency>
......
/*
* Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.vorgang.vorgang.redirect;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import org.springframework.stereotype.Service;
import de.ozgcloud.common.errorhandling.TechnicalException;
import de.ozgcloud.eingang.forwarder.RouteForwardingServiceGrpc;
import de.ozgcloud.eingang.forwarding.GrpcRouteForwardingResponse;
import de.ozgcloud.vorgang.callcontext.VorgangManagerClientCallContextAttachingInterceptor;
import io.grpc.stub.StreamObserver;
import lombok.RequiredArgsConstructor;
import net.devh.boot.grpc.client.inject.GrpcClient;
@Service
class ForwardingRemoteService {
@GrpcClient("forwarder")
private RouteForwardingServiceGrpc.RouteForwardingServiceStub routeForwardingServiceGrpc;
public void forward(ForwardingRequest request) {
CompletableFuture<Void> responseFuture = new CompletableFuture<>();
var requestStreamObserver = routeForwardingServiceGrpc.withInterceptors(new VorgangManagerClientCallContextAttachingInterceptor())
.routeForwarding(new ForwardingResponseObserver(responseFuture));
try {
responseFuture.get();
} catch (InterruptedException | ExecutionException e) {
throw new TechnicalException("Forwarding failed", e);
}
}
@RequiredArgsConstructor
static class ForwardingResponseObserver implements StreamObserver<GrpcRouteForwardingResponse> {
private final CompletableFuture<Void> future;
@Override
public void onNext(GrpcRouteForwardingResponse value) {
// noop
}
@Override
public void onError(Throwable t) {
future.completeExceptionally(t);
}
@Override
public void onCompleted() {
future.complete(null);
}
}
}
...@@ -35,7 +35,6 @@ import java.util.stream.Stream; ...@@ -35,7 +35,6 @@ import java.util.stream.Stream;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -56,10 +55,12 @@ import freemarker.template.Configuration; ...@@ -56,10 +55,12 @@ import freemarker.template.Configuration;
import freemarker.template.Template; import freemarker.template.Template;
import freemarker.template.TemplateException; import freemarker.template.TemplateException;
import jakarta.mail.util.ByteArrayDataSource; import jakarta.mail.util.ByteArrayDataSource;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
@Service @Service
@Log4j2 @Log4j2
@RequiredArgsConstructor
public class ForwardingService { public class ForwardingService {
static final String MAIL_TEMPLATE = "/mail/redirect.txt.ftlh"; static final String MAIL_TEMPLATE = "/mail/redirect.txt.ftlh";
...@@ -87,26 +88,15 @@ public class ForwardingService { ...@@ -87,26 +88,15 @@ public class ForwardingService {
static final String SUBJECT_BESTAETIGUNG_TEMPL = "Ihr Antrag auf %s - Az: %s"; static final String SUBJECT_BESTAETIGUNG_TEMPL = "Ihr Antrag auf %s - Az: %s";
static final String ZIP_FILENAME_TMPL = "%s.zip"; static final String ZIP_FILENAME_TMPL = "%s.zip";
@Autowired private final ForwardingRepository repository;
private ForwardingRepository repository; private final Configuration freemarkerCfg;
private final ZipBuilderService zipService;
@Autowired private final MailService emailService;
private Configuration freemarkerCfg; private final VorgangService vorgangService;
@Autowired
private ZipBuilderService zipService;
@Autowired
private MailService emailService;
@Autowired
private VorgangService vorgangService;
// TODO abhängigkeit entfernen // TODO abhängigkeit entfernen
@Autowired private final StatusService statusService;
private StatusService statusService; private final ForwardingRemoteService forwardingRemoteService;
private final ApplicationEventPublisher publisher;
@Autowired
private ApplicationEventPublisher publisher;
@Value("${ozgcloud.redirect.mail-from}") @Value("${ozgcloud.redirect.mail-from}")
private String mailFrom; private String mailFrom;
...@@ -332,5 +322,6 @@ public class ForwardingService { ...@@ -332,5 +322,6 @@ public class ForwardingService {
public void forward(ForwardingRequest request) { public void forward(ForwardingRequest request) {
statusService.setStatusToWeitergeleitet(request.getVorgangId(), request.getVersion()); statusService.setStatusToWeitergeleitet(request.getVorgangId(), request.getVersion());
forwardingRemoteService.forward(request);
} }
} }
\ No newline at end of file
...@@ -38,6 +38,10 @@ grpc: ...@@ -38,6 +38,10 @@ grpc:
negotiationType: PLAINTEXT negotiationType: PLAINTEXT
vorgang-manager: vorgang-manager:
negotiationType: PLAINTEXT negotiationType: PLAINTEXT
forwarder:
address: static://127.0.0.1:9292
negotiationType: PLAINTEXT
server: server:
security: security:
enabled: false enabled: false
......
...@@ -44,6 +44,8 @@ grpc: ...@@ -44,6 +44,8 @@ grpc:
negotiationType: PLAINTEXT negotiationType: PLAINTEXT
zufi-manager: zufi-manager:
negotiationType: TLS negotiationType: TLS
forwarder:
negotiationType: TLS
server: server:
security: security:
......
/*
* Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.vorgang.vorgang.redirect;
import static org.mockito.Mockito.*;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Spy;
import de.ozgcloud.eingang.forwarder.RouteForwardingServiceGrpc;
import de.ozgcloud.vorgang.callcontext.VorgangManagerClientCallContextAttachingInterceptor;
class ForwardingRemoteServiceTest {
@Mock
private RouteForwardingServiceGrpc.RouteForwardingServiceStub serviceStub;
@Spy
@InjectMocks
private ForwardingRemoteService service;
@Nested
class TestForward {
private final ForwardingRequest request = ForwardingRequestTestFactory.create();
@BeforeEach
void init() {
when(serviceStub.withInterceptors(any())).thenReturn(serviceStub);
}
@Test
void shouldAttachClientCallContext() {
givenGrpcCallCompletedSuccessfully();
forward();
verify(serviceStub).withInterceptors(any(VorgangManagerClientCallContextAttachingInterceptor.class));
}
@Test
void shouldMakeGrpcCallToRouteForwarding() {
givenGrpcCallCompletedSuccessfully();
forward();
verify(serviceStub).routeForwarding(any(ForwardingRemoteService.ForwardingResponseObserver.class));
}
private void givenGrpcCallCompletedSuccessfully() {
when(serviceStub.routeForwarding(any())).thenAnswer(invocation -> {
((ForwardingRemoteService.ForwardingResponseObserver) invocation.getArgument(0)).onCompleted();
return null;
});
}
private void forward() {
service.forward(request);
}
}
}
...@@ -64,19 +64,16 @@ class ForwardingServiceTest { ...@@ -64,19 +64,16 @@ class ForwardingServiceTest {
private ForwardingService service; private ForwardingService service;
@Mock @Mock
private ForwardingRepository repository; private ForwardingRepository repository;
@Mock @Mock
private ZipBuilderService zipService; private ZipBuilderService zipService;
@Mock @Mock
private MailService mailService; private MailService mailService;
@Mock @Mock
private VorgangService vorgangService; private VorgangService vorgangService;
@Mock @Mock
private StatusService statusService; private StatusService statusService;
@Mock
private ForwardingRemoteService remoteService;
@Mock @Mock
private ApplicationEventPublisher publisher; private ApplicationEventPublisher publisher;
...@@ -626,11 +623,24 @@ class ForwardingServiceTest { ...@@ -626,11 +623,24 @@ class ForwardingServiceTest {
@Nested @Nested
class TestForward { class TestForward {
private final ForwardingRequest request = ForwardingRequestTestFactory.create();
@Test @Test
void shouldSetStatusToWeitergeleitet() { void shouldSetStatusToWeitergeleitet() {
service.forward(ForwardingRequestTestFactory.create()); forward();
verify(statusService).setStatusToWeitergeleitet(VorgangTestFactory.ID, VorgangTestFactory.VERSION); verify(statusService).setStatusToWeitergeleitet(VorgangTestFactory.ID, VorgangTestFactory.VERSION);
} }
@Test
void shouldCallRemoteService() {
forward();
verify(remoteService).forward(request);
}
private void forward() {
service.forward(request);
}
} }
} }
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment