From a37452323c067ae0e7d14d08d94b66dadb3f86af Mon Sep 17 00:00:00 2001
From: OZGCloud <ozgcloud@mgm-tp.com>
Date: Mon, 23 Sep 2024 09:19:22 +0200
Subject: [PATCH] =?UTF-8?q?OZG-6751=20Validierung=20zum=20Grpc=20Service?=
 =?UTF-8?q?=20hinzugef=C3=BCgt.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../info/nachricht/NachrichtGrpcService.java  | 21 ++++++++++++++++++-
 .../NachrichtenGrpcServiceITCase.java         | 10 +++++++++
 .../NachrichtenGrpcTestConfiguration.java     | 15 ++++++++++---
 3 files changed, 42 insertions(+), 4 deletions(-)

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 8b41576..4bae807 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 93025e8..03a5821 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 daac2ed..1585b16 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());
 	}
 }
-- 
GitLab