diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/servicekonto/ServiceKonto.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/servicekonto/ServiceKonto.java index c65e33018262555e9b38727cf434e221ec3ac4eb..1b932d19d2a567520bbdc4d0b0b3b0e73730f5ce 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/servicekonto/ServiceKonto.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/servicekonto/ServiceKonto.java @@ -3,13 +3,17 @@ package de.ozgcloud.vorgang.servicekonto; import java.util.List; import java.util.Set; +import jakarta.validation.constraints.NotEmpty; + import org.apache.commons.lang3.StringUtils; +import org.springframework.validation.annotation.Validated; import lombok.Builder; import lombok.Getter; import lombok.Singular; import lombok.extern.log4j.Log4j2; +@Validated @Getter @Builder @Log4j2 @@ -21,6 +25,8 @@ public class ServiceKonto { private String type; private String trustLevel; + + @NotEmpty @Singular private List<PostfachAddress> postfachAddresses; diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/Eingang.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/Eingang.java index d8c1ab65d0365d32fed233f872c76569ecc36dfc..4c564cad1b2a2455c0a345371ef0a511c3df13d7 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/Eingang.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/Eingang.java @@ -26,11 +26,16 @@ package de.ozgcloud.vorgang.vorgang; import java.util.List; import java.util.Map; +import jakarta.validation.Valid; + +import org.springframework.validation.annotation.Validated; + import lombok.Builder; import lombok.Getter; import lombok.Singular; import lombok.ToString; +@Validated @ToString(onlyExplicitlyIncluded = true) @Getter @Builder(toBuilder = true) @@ -39,6 +44,7 @@ public class Eingang { @ToString.Include private String id; + @Valid @ToString.Include private EingangHeader header; private Antragsteller antragsteller; diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/EingangHeader.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/EingangHeader.java index d092cc381f65bc11bc918bf1e3a157ceda3cb492..ac8a3dc88ce4437216d904438e3a53254d418003 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/EingangHeader.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/EingangHeader.java @@ -25,11 +25,16 @@ package de.ozgcloud.vorgang.vorgang; import java.time.ZonedDateTime; +import jakarta.validation.Valid; + +import org.springframework.validation.annotation.Validated; + import de.ozgcloud.vorgang.servicekonto.ServiceKonto; import lombok.Builder; import lombok.Getter; import lombok.ToString; +@Validated @ToString @Getter @Builder @@ -44,5 +49,6 @@ public class EingangHeader { private String vorgangNummer; private String sender; + @Valid private ServiceKonto serviceKonto; } \ No newline at end of file diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/GrpcVorgangService.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcService.java similarity index 98% rename from vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/GrpcVorgangService.java rename to vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcService.java index 647303f1968fcf6ae80edad3dbe42e87497e6579..3adf3dcf4bf4b7d352039c64292abffdfe1068dc 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/GrpcVorgangService.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcService.java @@ -35,7 +35,7 @@ import net.devh.boot.grpc.server.service.GrpcService; @GrpcService @RequiredArgsConstructor -class GrpcVorgangService extends VorgangServiceGrpc.VorgangServiceImplBase { +class VorgangGrpcService extends VorgangServiceGrpc.VorgangServiceImplBase { private final VorgangService vorgangService; private final VorgangHeaderService vorgangHeaderService; diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangService.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangService.java index 3b69aa9e535b41598d1f2d76f9645436e3c8e75c..51e2ba9baad098db8ba6c73cd84f6ee75ddd8d1a 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangService.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangService.java @@ -30,6 +30,8 @@ import java.util.Map.Entry; import java.util.Optional; import java.util.stream.Stream; +import jakarta.validation.Valid; + import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; @@ -37,6 +39,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEventPublisher; import org.springframework.security.access.AccessDeniedException; import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; import de.ozgcloud.command.Command; import de.ozgcloud.command.VorgangCreatedEvent; @@ -47,6 +50,7 @@ import de.ozgcloud.vorgang.common.errorhandling.NotFoundException; import de.ozgcloud.vorgang.servicekonto.ServiceKonto; import lombok.NonNull; +@Validated @Service public class VorgangService { @@ -72,7 +76,7 @@ public class VorgangService { @Autowired private VorgangStubMapper stubMapper; - public Vorgang startCreation(Eingang eingang) { + public Vorgang startCreation(@Valid Eingang eingang) { var mappedEingang = kopControlDataMapper.moveLabelsToControlData(eingang); return repository.save(buildVorgang(mappedEingang, true)); diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/GrpcVorgangServiceITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcServiceITCase.java similarity index 86% rename from vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/GrpcVorgangServiceITCase.java rename to vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcServiceITCase.java index 64f5d92f697a27617174aa251c471232b00423ad..c2984475269832306c7462326caffeaadab6f276 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/GrpcVorgangServiceITCase.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcServiceITCase.java @@ -27,14 +27,11 @@ import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; -import java.time.LocalDate; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.Optional; -import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -42,32 +39,17 @@ import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.security.test.context.support.WithMockUser; -import org.springframework.test.annotation.DirtiesContext; -import de.ozgcloud.common.test.DataITCase; import de.ozgcloud.common.test.ITCase; -import de.ozgcloud.vorgang.callcontext.CallContextUserTestFactory; -import de.ozgcloud.vorgang.callcontext.CurrentUserService; -import de.ozgcloud.vorgang.clientattribute.ClientAttribute; -import de.ozgcloud.vorgang.clientattribute.ClientAttributeTestFactory; -import de.ozgcloud.vorgang.clientattribute.ClientAttributesMap; -import de.ozgcloud.vorgang.clientattribute.ClientAttributesMapTestFactory; -import de.ozgcloud.vorgang.common.GrpcQueryOperator; -import de.ozgcloud.vorgang.common.db.CriteriaUtil; import de.ozgcloud.vorgang.common.grpc.GrpcFormDataTestFactory; import de.ozgcloud.vorgang.common.grpc.GrpcFormFieldTestFactory; import de.ozgcloud.vorgang.common.grpc.GrpcSubFormTestFactory; -import de.ozgcloud.vorgang.common.operator.OperatorBuilder; -import de.ozgcloud.vorgang.vorgang.VorgangServiceGrpc.VorgangServiceBlockingStub; import io.grpc.stub.StreamObserver; -import net.devh.boot.grpc.client.inject.GrpcClient; @ITCase -class GrpcVorgangServiceITCase { +class VorgangGrpcServiceITCase { static final String VALUE_KEY = "value"; static final String LABEL_KEY = "label"; @@ -97,7 +79,7 @@ class GrpcVorgangServiceITCase { private static final String TITLE_SUBFORM_3 = "SUBFORM_3"; @Autowired - private GrpcVorgangService grpcVorgangService; + private VorgangGrpcService grpcVorgangService; @MockBean private VorgangService service; @@ -117,7 +99,7 @@ class GrpcVorgangServiceITCase { void shouldKeepFieldsOrder() { var grpcFormData = GrpcFormData.newBuilder().addAllField(formFields).build(); - Map<String, Object> formData = startCreation(grpcFormData); + var formData = startCreation(grpcFormData); assertThat(removeControlData(formData)).containsExactly( entry(NAME_FIELD_1, FIELD_1), @@ -131,7 +113,7 @@ class GrpcVorgangServiceITCase { .addForm(GrpcSubFormTestFactory.createBuilder().setTitle(TITLE_SUBFORM_2)) .addForm(GrpcSubFormTestFactory.createBuilder().setTitle(TITLE_SUBFORM_3)).build(); - Map<String, Object> formData = startCreation(grpcFormData); + var formData = startCreation(grpcFormData); verifySubFormOrder(formData, TITLE_SUBFORM_1, TITLE_SUBFORM_2, TITLE_SUBFORM_3); } @@ -140,7 +122,7 @@ class GrpcVorgangServiceITCase { @Test void shouldKeepFieldsOrderInSubForm() { var grpcFormData = GrpcFormDataTestFactory.createBuilder().addForm( - GrpcSubFormTestFactory.createBuilder().clearField().clearSubForm().setTitle(TITLE_SUBFORM_1).addAllField(formFields)) + GrpcSubFormTestFactory.createBuilder().clearField().clearSubForm().setTitle(TITLE_SUBFORM_1).addAllField(formFields)) .build(); var formData = (Map<String, Object>) startCreation(grpcFormData).get(TITLE_SUBFORM_1); diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/GrpcVorgangServiceTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcServiceTest.java similarity index 99% rename from vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/GrpcVorgangServiceTest.java rename to vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcServiceTest.java index 3b78df2424dfa62ae1048907e663065de5110e27..e555f66338c6679e81c68b4aa0a2dbcdb483f2b4 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/GrpcVorgangServiceTest.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcServiceTest.java @@ -51,7 +51,7 @@ import de.ozgcloud.vorgang.collaboration.GrpcCollaborationRequestTestFactory; import de.ozgcloud.vorgang.collaboration.GrpcCreateCollaborationVorgangResponseTestFactory; import io.grpc.stub.StreamObserver; -class GrpcVorgangServiceTest { +class VorgangGrpcServiceTest { private static final int LIMIT = 10; private static final int OFFSET = 0; @@ -59,7 +59,7 @@ class GrpcVorgangServiceTest { @Spy @InjectMocks - private GrpcVorgangService service; + private VorgangGrpcService service; @Mock private VorgangService vorgangService; @Mock diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangITCase.java index c15c4a2244378fdedae6b7608784aed4876aeb9a..1daf6ec91d576e4022724eda11620c3dfedb04fe 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangITCase.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangITCase.java @@ -52,7 +52,7 @@ import io.grpc.stub.StreamObserver; class VorgangITCase { @Autowired - private GrpcVorgangService service; + private VorgangGrpcService service; @Autowired private MongoOperations mongoOperations; diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangServiceITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangServiceITCase.java index 443303a1c8212f534df06dfb03c17def5d0c6ca3..5835a656a9cd2ed08c8002665bbc679e6439691f 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangServiceITCase.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangServiceITCase.java @@ -29,6 +29,8 @@ import static org.mockito.Mockito.*; import java.util.List; +import jakarta.validation.ConstraintViolationException; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -40,6 +42,7 @@ import de.ozgcloud.common.test.DataITCase; import de.ozgcloud.notification.antragsteller.AntragstellerNotificationEventListener; import de.ozgcloud.notification.user.UserNotificationEventListener; import de.ozgcloud.vorgang.command.CommandService; +import de.ozgcloud.vorgang.servicekonto.ServiceKontoTestFactory; @DataITCase @WithMockUser @@ -80,5 +83,20 @@ class VorgangServiceITCase { verify(antragstellerNotificationEventListener, timeout(60000)).onVorgangCreated(any()); verify(userNotificationEventListener, timeout(60000)).onVorgangCreated(any()); } + + @DisplayName("validation") + @Nested + class TestValidation { + + @DisplayName("should be invalid on missing postfachAddress in serviceKonto") + @Test + void shouldBeInvalidOnMissingPostfachAddress() { + var eingang = EingangTestFactory.createBuilder().header(EingangHeaderTestFactory.createBuilder() + .serviceKonto(ServiceKontoTestFactory.createBuilder().clearPostfachAddresses().build()).build()) + .build(); + + assertThatThrownBy(() -> vorgangService.startCreation(eingang)).isInstanceOf(ConstraintViolationException.class); + } + } } } \ No newline at end of file