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..5b3c144fb06f7041feeeb423e938a5c515f47a90 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,14 @@ package de.ozgcloud.vorgang.vorgang; import java.util.List; import java.util.Map; +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) 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..e85204977d73be962ca204fa299440d7332ad705 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,14 @@ package de.ozgcloud.vorgang.vorgang; import java.time.ZonedDateTime; +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 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/VorgangGrpcServiceITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcServiceITCase.java index bf5cbf6aa9e27df1e36914d7584efebff804a04e..c2984475269832306c7462326caffeaadab6f276 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcServiceITCase.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,29 +39,14 @@ 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 VorgangGrpcServiceITCase { @@ -117,7 +99,7 @@ class VorgangGrpcServiceITCase { 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 VorgangGrpcServiceITCase { .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 VorgangGrpcServiceITCase { @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/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