diff --git a/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtGrpcService.java b/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtGrpcService.java index 8b415760bdcf5555300a8ee9b91a0b5f8d2c4a5e..4bae8077690e8f41248ec23576e321846cdeb574 100644 --- a/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtGrpcService.java +++ b/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtGrpcService.java @@ -20,9 +20,14 @@ package de.ozgcloud.info.nachricht; +import java.util.Set; + +import jakarta.validation.ConstraintViolation; import jakarta.validation.ConstraintViolationException; +import jakarta.validation.Validator; import de.ozgcloud.info.common.InvalidNachrichtenListUrlException; +import de.ozgcloud.info.common.NachrichtEvent; import io.grpc.Status; import io.grpc.stub.StreamObserver; import lombok.RequiredArgsConstructor; @@ -35,6 +40,7 @@ public class NachrichtGrpcService extends NachrichtServiceGrpc.NachrichtServiceI private final NachrichtService nachrichtService; private final NachrichtMapper nachrichtenMapper; + private final Validator validator; @Override public void saveNewNachricht(GrpcNewNachrichtRequest request, StreamObserver<GrpcNewNachrichtReply> responseObserver) { @@ -49,7 +55,20 @@ public class NachrichtGrpcService extends NachrichtServiceGrpc.NachrichtServiceI } private void saveNachricht(GrpcNewNachrichtRequest request) { - nachrichtService.save(nachrichtenMapper.fromGrpcNachricht(request.getNachricht())); + var nachricht = nachrichtenMapper.fromGrpcNachricht(request.getNachricht()); + + if (isValid(nachricht)) { + nachrichtService.save(nachricht); + } + } + + private boolean isValid(NachrichtEvent nachrichtEvent) { + Set<ConstraintViolation<NachrichtEvent>> violations = validator.validate(nachrichtEvent); + if (!violations.isEmpty()) { + throw new ConstraintViolationException(violations); + } + + return true; } @Override diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenGrpcServiceITCase.java b/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenGrpcServiceITCase.java index 93025e8f1da78b8583cd058aeb8b0bfdd559b2d9..03a58213faef6c7bdee5d8cfc73a046ffedeaafa 100644 --- a/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenGrpcServiceITCase.java +++ b/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenGrpcServiceITCase.java @@ -30,6 +30,7 @@ import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; import de.ozgcloud.info.NachrichtEventTestFactory; +import io.grpc.StatusRuntimeException; import net.devh.boot.grpc.client.inject.GrpcClient; @SpringBootTest(properties = { @@ -54,6 +55,15 @@ class NachrichtenGrpcServiceITCase { assertThat(response.getStatus()).isEqualTo(STATUS_OK); } + + @Test + @DirtiesContext + void shouldNotSaveInvalidNewNachricht() { + var nachricht = GrpcNachricht.newBuilder().setNachrichtenListUrl("lala").build(); + var request = NachrichtEventTestFactory.createNewNachrichtRequest().toBuilder().setNachricht(nachricht).build(); + + assertThatExceptionOfType(StatusRuntimeException.class).isThrownBy(() -> service.saveNewNachricht(request)); + } } @Nested diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenGrpcTestConfiguration.java b/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenGrpcTestConfiguration.java index daac2ed2246f451fc05d39e3f2a8d548807c0a4f..1585b165118a2753a910b4e30404a8bf61b0f6d9 100644 --- a/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenGrpcTestConfiguration.java +++ b/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenGrpcTestConfiguration.java @@ -24,9 +24,13 @@ package de.ozgcloud.info.nachricht; import static org.mockito.Mockito.*; +import jakarta.validation.Validator; + import org.springframework.boot.autoconfigure.ImportAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; import net.devh.boot.grpc.client.autoconfigure.GrpcClientAutoConfiguration; import net.devh.boot.grpc.server.autoconfigure.GrpcServerAutoConfiguration; @@ -40,7 +44,12 @@ import net.devh.boot.grpc.server.autoconfigure.GrpcServerFactoryAutoConfiguratio class NachrichtenGrpcTestConfiguration { @Bean NachrichtService nachrichtenService() { - return mock(NachrichtService.class); + return new NachrichtService(nachrichtenRepository()); + } + + @Bean + Validator validator() { + return new LocalValidatorFactoryBean(); } @Bean @@ -50,11 +59,11 @@ class NachrichtenGrpcTestConfiguration { @Bean NachrichtMapper nachrichtenMapper() { - return mock(NachrichtMapper.class); + return new NachrichtMapper(mock(Environment.class)); } @Bean NachrichtGrpcService nachrichtenGrpcService() { - return new NachrichtGrpcService(nachrichtenService(), nachrichtenMapper()); + return new NachrichtGrpcService(nachrichtenService(), nachrichtenMapper(), validator()); } }