diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java index b1b2e73f0147c826ed60528e1b0ce39d8e13c86b..dc4206747f9b8319555d6a4d62c1b0be5a86f052 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java @@ -30,22 +30,53 @@ import org.springframework.stereotype.Service; import de.ozgcloud.common.errorhandling.TechnicalException; import de.ozgcloud.eingang.forwarder.RouteForwardingServiceGrpc; +import de.ozgcloud.eingang.forwarding.GrpcRouteForwardingRequest; import de.ozgcloud.eingang.forwarding.GrpcRouteForwardingResponse; import de.ozgcloud.vorgang.callcontext.VorgangManagerClientCallContextAttachingInterceptor; +import de.ozgcloud.vorgang.vorgang.Eingang; +import de.ozgcloud.vorgang.vorgang.VorgangService; import io.grpc.stub.StreamObserver; import lombok.RequiredArgsConstructor; import net.devh.boot.grpc.client.inject.GrpcClient; @Service +@RequiredArgsConstructor class ForwardingRemoteService { + private final VorgangService vorgangService; + private final ForwardingRequestMapper forwardingRequestMapper; @GrpcClient("forwarder") - private RouteForwardingServiceGrpc.RouteForwardingServiceStub routeForwardingServiceGrpc; + private final RouteForwardingServiceGrpc.RouteForwardingServiceStub routeForwardingServiceGrpc; public void forward(ForwardingRequest request) { CompletableFuture<Void> responseFuture = new CompletableFuture<>(); + routeForwarding(request, new ForwardingResponseObserver(responseFuture)); + waitForCompletion(responseFuture); + } + + void routeForwarding(ForwardingRequest request, ForwardingResponseObserver responseObserver) { var requestStreamObserver = routeForwardingServiceGrpc.withInterceptors(new VorgangManagerClientCallContextAttachingInterceptor()) - .routeForwarding(new ForwardingResponseObserver(responseFuture)); + .routeForwarding(responseObserver); + try { + sendEingang(request, requestStreamObserver); + requestStreamObserver.onCompleted(); + } catch (Throwable t) { + requestStreamObserver.onError(t); + } + } + + void sendEingang(ForwardingRequest request, StreamObserver<GrpcRouteForwardingRequest> requestStreamObserver) { + var eingang = vorgangService.getById(request.getVorgangId()).getEingangs().getFirst(); + requestStreamObserver.onNext(buildRouteForwardingRequest(request, eingang)); + + } + + GrpcRouteForwardingRequest buildRouteForwardingRequest(ForwardingRequest request, Eingang eingang) { + var routeForwarding = forwardingRequestMapper.toGrpcRouteForwarding(request, eingang); + return GrpcRouteForwardingRequest.newBuilder().setRouteForwarding(routeForwarding).build(); + } + + private static void waitForCompletion(CompletableFuture<Void> responseFuture) { try { responseFuture.get(); } catch (InterruptedException | ExecutionException e) {