From 82b1d7d92a440c9d82f20dbafdd944279f399c03 Mon Sep 17 00:00:00 2001
From: OZGCloud <ozgcloud@mgm-tp.com>
Date: Fri, 26 Jul 2024 15:33:47 +0200
Subject: [PATCH] OZG-6179 adjust proto file; set accessible

---
 .../src/main/protobuf/antragraum.model.proto  |  34 ++-
 nachrichten-manager-server/pom.xml            |   2 +-
 .../antragraum/AntragraumGrpcService.java     |  19 +-
 .../antragraum/AntragraumNachrichtMapper.java |  10 +-
 .../antragraum/AntragraumService.java         |  37 ++-
 .../nachrichten/antragraum/Rueckfrage.java    |   8 +-
 .../antragraum/RueckfrageMapper.java          |  15 +-
 .../antragraum/AntragraumGrpcServiceTest.java |  42 ++-
 .../AntragraumNachrichtMapperTest.java        |  16 +-
 .../antragraum/AntragraumServiceTest.java     | 256 ++++++++++++++----
 ...rpcFindRueckfragenResponseTestFactory.java |  12 +
 .../GrpcRueckfrageHeadTestFactory.java        |  12 +
 .../antragraum/GrpcRueckfrageTestFactory.java |   5 +-
 .../antragraum/RueckfrageMapperTest.java      |  14 -
 .../antragraum/RueckfrageTestFactory.java     |   4 +-
 15 files changed, 334 insertions(+), 152 deletions(-)
 create mode 100644 nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/GrpcFindRueckfragenResponseTestFactory.java
 create mode 100644 nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/GrpcRueckfrageHeadTestFactory.java

diff --git a/nachrichten-manager-interface/src/main/protobuf/antragraum.model.proto b/nachrichten-manager-interface/src/main/protobuf/antragraum.model.proto
index 7efeb87..3450413 100644
--- a/nachrichten-manager-interface/src/main/protobuf/antragraum.model.proto
+++ b/nachrichten-manager-interface/src/main/protobuf/antragraum.model.proto
@@ -37,22 +37,36 @@ message GrpcFindRueckfragenRequest {
 }
 
 message GrpcFindRueckfragenResponse {
-  repeated GrpcRueckfrage rueckfrage = 1;
+  repeated GrpcRueckfrageHead rueckfrageHead = 1;
+}
+
+message GrpcRueckfrageHead {
+  string id = 1;
+  string vorgangId = 2;
+  string vorgangName = 3;
+  string vorgangNummer = 4;
+  string sentAt = 5;
+  string answeredAt = 6;
+  string status = 7;
+  string trustLevel = 8;
+  bool accessible = 9;
 }
 
 message GrpcRueckfrage {
   string id = 1;
   string vorgangId = 2;
   string vorgangName = 3;
-  string sentAt = 4;
-  string answeredAt = 5;
-  string status = 6;
-  string text = 7;
-  repeated string attachmentFileId = 8;
-  repeated GrpcRueckfrageAnswer answers = 9;
-  string vorgangNummer = 10;
-  string trustLevel = 11;
-  string accessible = 12;
+  string vorgangNummer = 4;
+  string sentAt = 5;
+  string answeredAt = 6;
+  string status = 7;
+  string trustLevel = 8;
+  bool accessible = 9;
+  
+  string text = 10;
+  
+  repeated string attachmentFileId = 11;
+  repeated GrpcRueckfrageAnswer answers = 12;
 }
 
 message GrpcSendRueckfrageAnswerRequest {
diff --git a/nachrichten-manager-server/pom.xml b/nachrichten-manager-server/pom.xml
index b4f9d89..2f9c3f0 100644
--- a/nachrichten-manager-server/pom.xml
+++ b/nachrichten-manager-server/pom.xml
@@ -45,7 +45,7 @@
 		<jaxb-maven-plugin.version>3.0.1</jaxb-maven-plugin.version>
 		<ozg-info-manager-interface.version>0.1.0-SNAPSHOT</ozg-info-manager-interface.version>
 		<bayernid-proxy-interface.version>0.1.0</bayernid-proxy-interface.version>
-		<vorgang-manager.version>2.8.0</vorgang-manager.version>
+		<vorgang-manager.version>2.11.0-SNAPSHOT</vorgang-manager.version>
 		<muk-postfach.version>0.1.0-SNAPSHOT</muk-postfach.version>
 		<ozgcloud-starter.version>0.10.0</ozgcloud-starter.version>
 	</properties>
diff --git a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcService.java b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcService.java
index b7509fe..8d5a6cf 100644
--- a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcService.java
+++ b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcService.java
@@ -49,24 +49,14 @@ class AntragraumGrpcService extends AntragraumServiceGrpc.AntragraumServiceImplB
 
 	@Override
 	public void findRueckfragen(GrpcFindRueckfragenRequest request, StreamObserver<GrpcFindRueckfragenResponse> streamObserver) {
-		var rueckfragen = service.findRueckfragen(request.getSamlToken())
-				.map(mapper::toGrpc)
-				.map(rueckfrage -> addAnswers(request.getSamlToken(), rueckfrage));
+		var rueckfragen = service.findRueckfragen(request.getSamlToken()).map(mapper::toGrpc);
 
 		streamObserver.onNext(buildFindRueckfragenResponse(rueckfragen));
 		streamObserver.onCompleted();
 	}
 
-	private GrpcRueckfrage addAnswers(String samlToken, GrpcRueckfrage rueckfrage) {
-		return rueckfrage.toBuilder().addAllAnswers(findRueckfrageAnswers(samlToken, rueckfrage.getId())).build();
-	}
-
-	List<GrpcRueckfrageAnswer> findRueckfrageAnswers(String samlToken, String rueckfrageId) {
-		return service.findAnswers(samlToken, rueckfrageId).map(mapper::toRueckfrageAnswer).toList();
-	}
-
-	private GrpcFindRueckfragenResponse buildFindRueckfragenResponse(Stream<GrpcRueckfrage> rueckfragen) {
-		return GrpcFindRueckfragenResponse.newBuilder().addAllRueckfrage(rueckfragen.toList()).build();
+	private GrpcFindRueckfragenResponse buildFindRueckfragenResponse(Stream<GrpcRueckfrageHead> rueckfragen) {
+		return GrpcFindRueckfragenResponse.newBuilder().addAllRueckfrageHead(rueckfragen.toList()).build();
 	}
 
 	@Override
@@ -112,7 +102,8 @@ class AntragraumGrpcService extends AntragraumServiceGrpc.AntragraumServiceImplB
 		var answers = service.findAnswers(samlToken, rueckfrage.getId()).toList();
 		var firstAnswerSentAt = service.getFirstSentAt(answers.stream());
 
-		return addAnswers(rueckfrageMapper.toRueckfrage(firstAnswerSentAt, vorgang, rueckfrage), answers);
+		var rueckfrageWithAnswer = addAnswers(rueckfrageMapper.toRueckfrage(firstAnswerSentAt, vorgang, rueckfrage), answers);
+		return rueckfrageWithAnswer.toBuilder().setAccessible(service.isAccessible(samlToken, vorgang.getTrustLevel())).build();
 	}
 
 	GrpcRueckfrage addAnswers(GrpcRueckfrage rueckfrage, List<PostfachNachricht> answers) {
diff --git a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumNachrichtMapper.java b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumNachrichtMapper.java
index f0c9540..5bc0818 100644
--- a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumNachrichtMapper.java
+++ b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumNachrichtMapper.java
@@ -37,27 +37,23 @@ import de.ozgcloud.nachrichten.postfach.PostfachNachricht;
 @Mapper(collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED, nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
 interface AntragraumNachrichtMapper {
 
+	@Mapping(target = "trustLevelBytes", ignore = true)
+	@Mapping(target = "vorgangNummerBytes", ignore = true)
 	@Mapping(target = "mergeFrom", ignore = true)
 	@Mapping(target = "clearField", ignore = true)
 	@Mapping(target = "clearOneof", ignore = true)
 	@Mapping(target = "mergeUnknownFields", ignore = true)
-	@Mapping(target = "removeAnswers", ignore = true)
 	@Mapping(target = "answeredAt", ignore = true)
 	@Mapping(target = "answeredAtBytes", ignore = true)
 	@Mapping(target = "idBytes", ignore = true)
 	@Mapping(target = "sentAtBytes", ignore = true)
 	@Mapping(target = "statusBytes", ignore = true)
-	@Mapping(target = "textBytes", ignore = true)
 	@Mapping(target = "unknownFields", ignore = true)
 	@Mapping(target = "vorgangIdBytes", ignore = true)
 	@Mapping(target = "vorgangNameBytes", ignore = true)
 	@Mapping(target = "allFields", ignore = true)
-	@Mapping(target = "answersBuilderList", ignore = true)
-	@Mapping(target = "answersList", ignore = true)
-	@Mapping(target = "answersOrBuilderList", ignore = true)
 	@Mapping(target = "sentAt", source = "sentAt", dateFormat = "yyyy-MM-dd'T'HH:mm:ss")
-	@Mapping(target = "attachmentFileIdList", source = "attachments")
-	GrpcRueckfrage toGrpc(Rueckfrage rueckfrage);
+	GrpcRueckfrageHead toGrpc(Rueckfrage rueckfrage);
 
 	@Mapping(target = "referencedNachricht", ignore = true)
 	@Mapping(target = "mailBody", source = "answerText")
diff --git a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumService.java b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumService.java
index d6a76af..8d43506 100644
--- a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumService.java
+++ b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumService.java
@@ -34,6 +34,8 @@ import java.util.stream.Stream;
 import jakarta.annotation.PostConstruct;
 
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.opensaml.saml.saml2.core.Response;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.stereotype.Service;
@@ -105,7 +107,7 @@ public class AntragraumService {
 		var rueckfragen = postfachNachrichtService.findRueckfragen(BAYERN_ID_SERVICE_KONTO_TYPE, getPostfachId(samlToken))
 				.map(rueckfrageMapper::fromPostfachNachricht)
 				.map(rueckfrage -> enrichByAnswers(rueckfrage, samlToken)).toList();
-		return enrichRueckfragen(rueckfragen);
+		return enrichRueckfragen(rueckfragen, samlToken);
 	}
 
 	Rueckfrage enrichByAnswers(Rueckfrage rueckfrage, String samlToken) {
@@ -121,20 +123,27 @@ public class AntragraumService {
 		return answers.sorted(Comparator.comparing(PostfachNachricht::getSentAt)).map(PostfachNachricht::getSentAt).findFirst();
 	}
 
-	Stream<Rueckfrage> enrichRueckfragen(List<Rueckfrage> rueckfragen) {
+	Stream<Rueckfrage> enrichRueckfragen(List<Rueckfrage> rueckfragen, String samlToken) {
 		if (rueckfragen.isEmpty()) {
 			return Stream.empty();
 		}
-		return addVorgangData(rueckfragen, rueckfragen.getFirst().getVorgangId());
+		var vorgang = vorgangService.getVorgang(rueckfragen.getFirst().getVorgangId());
+
+		return rueckfragen.stream()
+				.map(rueckfrage -> addVorgangData(rueckfrage, vorgang))
+				.map(rueckfrage -> addAccessible(rueckfrage, samlToken));
 	}
 
-	Stream<Rueckfrage> addVorgangData(List<Rueckfrage> rueckfragen, String vorgangId) {
-		var vorgang = vorgangService.getVorgang(vorgangId);
-		return rueckfragen.stream().map(rueckfrage -> addVorgangData(rueckfrage, vorgang));
+	Rueckfrage addAccessible(Rueckfrage rueckfrage, String samlToken) {
+		return rueckfrage.toBuilder().accessible(isAccessible(samlToken, rueckfrage.getTrustLevel())).build();
 	}
 
-	private Rueckfrage addVorgangData(Rueckfrage rueckfrage, Vorgang vorgang) {
-		return rueckfrage.toBuilder().vorgangName(vorgang.getName()).vorgangNummer(vorgang.getNummer()).build();
+	Rueckfrage addVorgangData(Rueckfrage rueckfrage, Vorgang vorgang) {
+		return rueckfrage.toBuilder()
+				.vorgangName(vorgang.getName())
+				.vorgangNummer(vorgang.getNummer())
+				.trustLevel(vorgang.getTrustLevel())
+				.build();
 	}
 
 	public String sendRueckfrageAnswer(String samlToken, String rueckfrageId, PostfachNachricht nachricht) {
@@ -165,4 +174,16 @@ public class AntragraumService {
 			throw new SecurityException("SAML Token verification failed. Errors: %s".formatted(errors));
 		}
 	}
+
+	public boolean isAccessible(String samlToken, String trustLevel) {
+		return StringUtils.equals(getTrustLevel(samlToken), trustLevel);
+	}
+
+	String getTrustLevel(String samlToken) {
+		return decrypter.decryptTrustLevel(parseSamlToken(samlToken));
+	}
+
+	Response parseSamlToken(String samlToken) {
+		return parser.parse(samlToken);
+	}
 }
\ No newline at end of file
diff --git a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/Rueckfrage.java b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/Rueckfrage.java
index acc18d8..a398a46 100644
--- a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/Rueckfrage.java
+++ b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/Rueckfrage.java
@@ -1,8 +1,6 @@
 package de.ozgcloud.nachrichten.antragraum;
 
 import java.time.ZonedDateTime;
-import java.util.Collections;
-import java.util.List;
 
 import de.ozgcloud.nachrichten.postfach.PostfachAddress;
 import lombok.Builder;
@@ -23,9 +21,7 @@ class Rueckfrage {
 
 	@Builder.Default
 	private RueckfrageStatus status = RueckfrageStatus.NEW;
-	private String text;
-
-	@Builder.Default
-	private List<String> attachments = Collections.emptyList();
 
+	private String trustLevel;
+	private boolean accessible;
 }
\ No newline at end of file
diff --git a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/RueckfrageMapper.java b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/RueckfrageMapper.java
index 0b725a4..f2f7634 100644
--- a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/RueckfrageMapper.java
+++ b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/RueckfrageMapper.java
@@ -21,9 +21,11 @@ interface RueckfrageMapper {
 
 	final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssX");
 
+	@Mapping(target = "accessible", ignore = true)
+	@Mapping(target = "trustLevel", ignore = true)
+	@Mapping(target = "vorgangNummer", ignore = true)
 	@Mapping(target = "answeredAt", ignore = true)
 	@Mapping(target = "status", ignore = true)
-	@Mapping(target = "text", source = "mailBody")
 	@Mapping(target = "vorgangName", ignore = true)
 	Rueckfrage fromPostfachNachricht(PostfachNachricht postfachNachricht);
 
@@ -32,23 +34,22 @@ interface RueckfrageMapper {
 	@Mapping(target = "clearOneof", ignore = true)
 	@Mapping(target = "mergeUnknownFields", ignore = true)
 	@Mapping(target = "removeAnswers", ignore = true)
-	@Mapping(target = "accessible", ignore = true) // TODO
-	@Mapping(target = "accessibleBytes", ignore = true)
 	@Mapping(target = "answeredAt", expression = "java(setAnsweredAt(firstAnswerSentAt))")
 	@Mapping(target = "answeredAtBytes", ignore = true)
 	@Mapping(target = "idBytes", ignore = true)
 	@Mapping(target = "sentAtBytes", ignore = true)
-	@Mapping(target = "status", expression = "java(setStatus(firstAnswerSentAt))")
 	@Mapping(target = "statusBytes", ignore = true)
+	@Mapping(target = "trustLevelBytes", ignore = true)
+	@Mapping(target = "vorgangIdBytes", ignore = true)
+	@Mapping(target = "vorgangNummerBytes", ignore = true)
+	@Mapping(target = "accessible", ignore = true)
+	@Mapping(target = "status", expression = "java(setStatus(firstAnswerSentAt))")
 	@Mapping(target = "textBytes", ignore = true)
 	@Mapping(target = "trustLevel", source = "vorgang.trustLevel")
-	@Mapping(target = "trustLevelBytes", ignore = true)
 	@Mapping(target = "unknownFields", ignore = true)
-	@Mapping(target = "vorgangIdBytes", ignore = true)
 	@Mapping(target = "vorgangName", source = "vorgang.name")
 	@Mapping(target = "vorgangNameBytes", ignore = true)
 	@Mapping(target = "vorgangNummer", source = "vorgang.nummer")
-	@Mapping(target = "vorgangNummerBytes", ignore = true)
 	@Mapping(target = "allFields", ignore = true)
 	@Mapping(target = "answersBuilderList", ignore = true)
 	@Mapping(target = "answersList", ignore = true)
diff --git a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcServiceTest.java b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcServiceTest.java
index 80bbb26..5d6c596 100644
--- a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcServiceTest.java
+++ b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcServiceTest.java
@@ -42,6 +42,7 @@ import org.mockito.Mock;
 import org.mockito.Spy;
 
 import de.ozgcloud.common.errorhandling.TechnicalException;
+import de.ozgcloud.nachrichten.common.vorgang.GrpcServiceKontoTestFactory;
 import de.ozgcloud.nachrichten.common.vorgang.Vorgang;
 import de.ozgcloud.nachrichten.common.vorgang.VorgangService;
 import de.ozgcloud.nachrichten.common.vorgang.VorgangTestFactory;
@@ -65,30 +66,38 @@ class AntragraumGrpcServiceTest {
 	@Mock
 	private VorgangService vorgangService;
 
+	@DisplayName("Find rueckfragen")
 	@Nested
 	class TestFindRueckfragen {
 
+		@Captor
+		private ArgumentCaptor<GrpcFindRueckfragenResponse> responseCaptor;
 		@Mock
 		private StreamObserver<GrpcFindRueckfragenResponse> streamObserver;
 
+		private final Rueckfrage rueckfrage = RueckfrageTestFactory.create();
+
+		private final GrpcRueckfrageHead grpcRueckfrageHead = GrpcRueckfrageHeadTestFactory.create();
+
 		@BeforeEach
 		void setup() {
-			when(service.findRueckfragen(any())).thenReturn(Stream.of(RueckfrageTestFactory.create()));
-			when(nachrichtMapper.toGrpc(any(Rueckfrage.class))).thenReturn(GrpcRueckfrageTestFactory.create());
+			when(service.findRueckfragen(any())).thenReturn(Stream.of(rueckfrage));
+			when(nachrichtMapper.toGrpc(any())).thenReturn(grpcRueckfrageHead);
 		}
 
 		@Test
 		void shouldCallMapper() {
 			grpcService.findRueckfragen(GrpcFindRueckfrageRequestTestFactory.create(), streamObserver);
 
-			verify(nachrichtMapper).toGrpc(any(Rueckfrage.class));
+			verify(nachrichtMapper).toGrpc(rueckfrage);
 		}
 
 		@Test
 		void shouldCallOnNext() {
 			grpcService.findRueckfragen(GrpcFindRueckfrageRequestTestFactory.create(), streamObserver);
 
-			verify(streamObserver).onNext(any(GrpcFindRueckfragenResponse.class));
+			verify(streamObserver).onNext(responseCaptor.capture());
+			assertThat(responseCaptor.getValue().getRueckfrageHeadList()).containsExactly(grpcRueckfrageHead);
 		}
 
 		@Test
@@ -97,13 +106,6 @@ class AntragraumGrpcServiceTest {
 
 			verify(streamObserver).onCompleted();
 		}
-
-		@Test
-		void shouldLoadAnswers() {
-			grpcService.findRueckfragen(GrpcFindRueckfrageRequestTestFactory.create(), streamObserver);
-
-			verify(service).findAnswers(GrpcFindRueckfrageRequestTestFactory.SAML_TOKEN, PostfachNachrichtTestFactory.ID);
-		}
 	}
 
 	@DisplayName("Send rueckfrage answer")
@@ -310,7 +312,7 @@ class AntragraumGrpcServiceTest {
 
 	@DisplayName("Enhance rueckfrage")
 	@Nested
-	class TestBuildRueckfrage {
+	class TestEnhanceRueckfrage {
 
 		@Captor
 		private ArgumentCaptor<Stream<PostfachNachricht>> answersStreamCaptor;
@@ -335,6 +337,8 @@ class AntragraumGrpcServiceTest {
 			when(service.getFirstSentAt(any())).thenReturn(sentAt);
 			when(vorgangService.getVorgang(any())).thenReturn(vorgang);
 			when(rueckfrageMapper.toRueckfrage(any(), any(), any())).thenReturn(grpcRueckfrage);
+			when(service.isAccessible(any(), any())).thenReturn(true);
+
 			doReturn(grpcRueckfrage).when(grpcService).addAnswers(any(), any());
 		}
 
@@ -375,6 +379,20 @@ class AntragraumGrpcServiceTest {
 			assertThat(answersListCaptor.getValue().get(0)).isEqualTo(answer);
 		}
 
+		@Test
+		void shouldCallIsAccessable() {
+			enhanceRueckfrage();
+
+			verify(service).isAccessible(GrpcGetRueckfrageRequestTestFactory.SAML_TOKEN, GrpcServiceKontoTestFactory.TRUST_LEVEL);
+		}
+
+		@Test
+		void shouldSetAccessible() {
+			var rueckfrage = enhanceRueckfrage();
+
+			assertThat(rueckfrage.getAccessible()).isTrue();
+		}
+
 		@Test
 		void shouldReturnRueckfrage() {
 			var buildedRueckfrage = enhanceRueckfrage();
diff --git a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumNachrichtMapperTest.java b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumNachrichtMapperTest.java
index 528286a..8ac6a1e 100644
--- a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumNachrichtMapperTest.java
+++ b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumNachrichtMapperTest.java
@@ -78,21 +78,7 @@ class AntragraumNachrichtMapperTest {
 			assertThat(result.getSentAt()).isEqualTo(PostfachNachrichtTestFactory.SENT_AT.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
 		}
 
-		@Test
-		void shouldMapText() {
-			var result = map();
-
-			assertThat(result.getText()).isEqualTo(PostfachNachrichtTestFactory.MAIL_BODY);
-		}
-
-		@Test
-		void shouldMapAttachments() {
-			var result = map();
-
-			assertThat(result.getAttachmentFileIdList()).hasSize(1).first().isEqualTo(PostfachNachrichtTestFactory.ATTACHMENTS.get(0));
-		}
-
-		private GrpcRueckfrage map() {
+		private GrpcRueckfrageHead map() {
 			return mapper.toGrpc(RueckfrageTestFactory.create());
 		}
 
diff --git a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumServiceTest.java b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumServiceTest.java
index 2188ed9..ae98c89 100644
--- a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumServiceTest.java
+++ b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumServiceTest.java
@@ -22,6 +22,8 @@ import org.mockito.Spy;
 import org.opensaml.saml.saml2.core.Response;
 
 import de.ozgcloud.nachrichten.NachrichtenManagerProperties;
+import de.ozgcloud.nachrichten.common.vorgang.GrpcServiceKontoTestFactory;
+import de.ozgcloud.nachrichten.common.vorgang.Vorgang;
 import de.ozgcloud.nachrichten.common.vorgang.VorgangService;
 import de.ozgcloud.nachrichten.common.vorgang.VorgangTestFactory;
 import de.ozgcloud.nachrichten.postfach.PersistPostfachNachrichtService;
@@ -88,65 +90,64 @@ class AntragraumServiceTest {
 
 			when(rueckfrageMapper.fromPostfachNachricht(any())).thenReturn(rueckfrage);
 			doReturn(rueckfrage).when(service).enrichByAnswers(any(), any());
-			doReturn(Stream.of(rueckfrage)).when(service).enrichRueckfragen(any());
+			doReturn(Stream.of(rueckfrage)).when(service).enrichRueckfragen(any(), any());
 			doReturn(POSTFACH_ID).when(service).getPostfachId(any());
+
+			doNothing().when(service).verifyToken(any());
 		}
 
 		@Test
 		void shouldCallVerify() {
-			service.findRueckfragen(SAML_TOKEN).toList();
+			findRueckfragen();
 
 			verify(service).verifyToken(SAML_TOKEN);
 		}
 
-		@Test
-		void shouldCallVerifier() {
-			service.findRueckfragen(SAML_TOKEN).toList();
-
-			verify(verifier).verify(anyString());
-		}
-
 		@Test
 		void shouldGetPostfachId() {
-			service.findRueckfragen(SAML_TOKEN).toList();
+			findRueckfragen();
 
 			verify(service).getPostfachId(SAML_TOKEN);
 		}
 
 		@Test
 		void shouldCallPostfachService() {
-			service.findRueckfragen(SAML_TOKEN).toList();
+			findRueckfragen();
 
 			verify(postfachNachrichtService).findRueckfragen(AntragraumService.BAYERN_ID_SERVICE_KONTO_TYPE, POSTFACH_ID);
 		}
 
 		@Test
 		void shouldCallMapper() {
-			service.findRueckfragen(SAML_TOKEN).toList();
+			findRueckfragen();
 
 			verify(rueckfrageMapper).fromPostfachNachricht(postfachNachricht);
 		}
 
 		@Test
 		void shouldCallEnrichByAnswers() {
-			service.findRueckfragen(SAML_TOKEN).toList();
+			findRueckfragen();
 
 			verify(service).enrichByAnswers(rueckfrage, SAML_TOKEN);
 		}
 
 		@Test
 		void shouldCallEnrichRueckfragen() {
-			service.findRueckfragen(SAML_TOKEN).toList();
+			findRueckfragen();
 
-			verify(service).enrichRueckfragen(any());
+			verify(service).enrichRueckfragen(any(), eq(SAML_TOKEN));
 		}
 
 		@Test
 		void shouldReturnFullFilledValue() {
-			var rueckfragen = service.findRueckfragen(SAML_TOKEN).toList();
+			var rueckfragen = findRueckfragen();
 
 			assertThat(rueckfragen).containsExactly(rueckfrage);
 		}
+
+		private List<Rueckfrage> findRueckfragen() {
+			return service.findRueckfragen(SAML_TOKEN).toList();
+		}
 	}
 
 	@DisplayName("Enrich by answers")
@@ -198,69 +199,122 @@ class AntragraumServiceTest {
 		}
 	}
 
-	@DisplayName("Enrich rueckfrage")
+	@DisplayName("Enrich rueckfragen")
 	@Nested
-	class TestEnrichRueckgabe {
+	class TestEnrichRueckfragen {
 
-		private final Rueckfrage rueckfrageWithoutVorgangName = RueckfrageTestFactory.createBuilder().vorgangName(null).build();
-		private final List<Rueckfrage> rueckfragen = Collections.singletonList(rueckfrageWithoutVorgangName);
+		private final Rueckfrage rueckfrage = RueckfrageTestFactory.create();
+		private final List<Rueckfrage> rueckfragen = Collections.singletonList(rueckfrage);
 
-		@BeforeEach
-		void mock() {
-			doReturn(Stream.of(RueckfrageTestFactory.create())).when(service).addVorgangData(any(), any());
-		}
+		private final Vorgang vorgang = VorgangTestFactory.create();
 
+		@DisplayName("should return an empty stream is no rueckfragen exists")
 		@Test
-		void shouldCallAddVorgangDataIfRueckfragenExists() {
-			service.enrichRueckfragen(rueckfragen);
+		void shouldReturnEmptyStream() {
+			var rueckfragen = service.enrichRueckfragen(Collections.emptyList(), GrpcGetRueckfrageRequestTestFactory.SAML_TOKEN).toList();
 
-			verify(service).addVorgangData(Collections.singletonList(rueckfrageWithoutVorgangName), RueckfrageTestFactory.VORGANG_ID);
+			assertThat(rueckfragen).isEmpty();
 		}
 
-		@Test
-		void shouldReturnValue() {
-			var enrichedRueckfragen = service.enrichRueckfragen(rueckfragen);
+		@DisplayName("on existing rueckfragen")
+		@Nested
+		class TestOnExistingRueckfragen {
+
+			@BeforeEach
+			void mock() {
+				when(vorgangService.getVorgang(any())).thenReturn(vorgang);
 
-			assertThat(enrichedRueckfragen.findFirst()).get().extracting(Rueckfrage::getVorgangName).isEqualTo(RueckfrageTestFactory.VORGANG_NAME);
+				doReturn(rueckfrage).when(service).addVorgangData(any(), any());
+				doReturn(rueckfrage).when(service).addAccessible(any(), any());
+			}
+
+			@Test
+			void shouldCallVorgangService() {
+				enrichRueckfragen();
+
+				verify(vorgangService).getVorgang(RueckfrageTestFactory.VORGANG_ID);
+			}
+
+			@Test
+			void shouldAddVorgangData() {
+				enrichRueckfragen();
+
+				verify(service).addVorgangData(rueckfrage, vorgang);
+			}
+
+			@Test
+			void shouldAddAccessible() {
+				enrichRueckfragen();
+
+				verify(service).addAccessible(rueckfrage, GrpcGetRueckfrageRequestTestFactory.SAML_TOKEN);
+			}
+
+			@Test
+			void shouldReturnEnrichedRueckfragen() {
+				var enrichedRueckfragen = enrichRueckfragen();
+
+				assertThat(enrichedRueckfragen).containsExactly(rueckfrage);
+			}
+		}
+
+		private List<Rueckfrage> enrichRueckfragen() {
+			return service.enrichRueckfragen(rueckfragen, GrpcGetRueckfrageRequestTestFactory.SAML_TOKEN).toList();
 		}
 	}
 
-	@DisplayName("Add vorgang data")
+	@DisplayName("Add accessible")
 	@Nested
-	class TestAddVorgangData {
+	class TestAddAccessible {
 
-		private final Rueckfrage rueckfrage = RueckfrageTestFactory.createBuilder()
-				.vorgangName(null)
-				.build();
+		private final Rueckfrage rueckfrage = RueckfrageTestFactory.createBuilder().accessible(false).build();
 
 		@BeforeEach
 		void mock() {
-			when(vorgangService.getVorgang(any())).thenReturn(VorgangTestFactory.create());
+			doReturn(true).when(service).isAccessible(any(), any());
 		}
 
 		@Test
-		void shouldCallGetVorgang() {
-			addVorgangData().toList();
+		void shouldCallIsAccessible() {
+			service.addAccessible(rueckfrage, GrpcGetRueckfrageRequestTestFactory.SAML_TOKEN);
 
-			verify(vorgangService).getVorgang(RueckfrageTestFactory.VORGANG_ID);
+			verify(service).isAccessible(GrpcGetRueckfrageRequestTestFactory.SAML_TOKEN, GrpcServiceKontoTestFactory.TRUST_LEVEL);
 		}
 
+		@Test
+		void shouldSetAccessible() {
+			var rueckfrageWithAccessible = service.addAccessible(rueckfrage, GrpcGetRueckfrageRequestTestFactory.SAML_TOKEN);
+
+			assertThat(rueckfrageWithAccessible.isAccessible()).isTrue();
+		}
+	}
+
+	@DisplayName("Add vorgang data")
+	@Nested
+	class TestAddVorgangData {
+
 		@Test
 		void shouldSetVorgangName() {
-			var rueckfragenWithVorgangData = addVorgangData().toList();
+			var rueckfragenWithVorgangData = addVorgangData();
 
-			assertThat(rueckfragenWithVorgangData.getFirst().getVorgangName()).isEqualTo(VorgangTestFactory.NAME);
+			assertThat(rueckfragenWithVorgangData.getVorgangName()).isEqualTo(VorgangTestFactory.NAME);
 		}
 
 		@Test
 		void shouldSetVorgangNummer() {
-			var rueckfragenWithVorgangData = addVorgangData().toList();
+			var rueckfragenWithVorgangData = addVorgangData();
 
-			assertThat(rueckfragenWithVorgangData.getFirst().getVorgangNummer()).isEqualTo(VorgangTestFactory.NUMMER);
+			assertThat(rueckfragenWithVorgangData.getVorgangNummer()).isEqualTo(VorgangTestFactory.NUMMER);
 		}
 
-		private Stream<Rueckfrage> addVorgangData() {
-			return service.addVorgangData(Collections.singletonList(rueckfrage), RueckfrageTestFactory.VORGANG_ID);
+		@Test
+		void shouldSetTrustLevel() {
+			var rueckfragenWithVorgangData = addVorgangData();
+
+			assertThat(rueckfragenWithVorgangData.getTrustLevel()).isEqualTo(GrpcServiceKontoTestFactory.TRUST_LEVEL);
+		}
+
+		private Rueckfrage addVorgangData() {
+			return service.addVorgangData(Rueckfrage.builder().build(), VorgangTestFactory.create());
 		}
 	}
 
@@ -282,31 +336,30 @@ class AntragraumServiceTest {
 		}
 	}
 
+	@DisplayName("Send rueckfragen answers")
 	@Nested
 	class TestSendRueckfragenAnswers {
 		static final String SAML_TOKEN = "TOKEN";
 		static final String RUECKFRAGE_ID = UUID.randomUUID().toString();
 		static final PostfachNachricht NACHRICHT = PostfachNachrichtTestFactory.create();
 
-		@Test
-		void shouldCallVerify() {
-			service.sendRueckfrageAnswer(SAML_TOKEN, RUECKFRAGE_ID, NACHRICHT);
-
-			verify(service).verifyToken(SAML_TOKEN);
+		@BeforeEach
+		void mock() {
+			doNothing().when(service).verifyToken(any());
 		}
 
 		@Test
-		void shouldCallVerifier() {
-			service.findRueckfragen(SAML_TOKEN);
+		void shouldCallVerifyToken() {
+			service.sendRueckfrageAnswer(SAML_TOKEN, RUECKFRAGE_ID, NACHRICHT);
 
-			verify(verifier).verify(anyString());
+			verify(service).verifyToken(SAML_TOKEN);
 		}
 
 		@Test
 		void shouldCallPostfachService() {
 			service.sendRueckfrageAnswer(SAML_TOKEN, RUECKFRAGE_ID, NACHRICHT);
 
-			verify(postfachNachrichtService).persistAnswer(eq(RUECKFRAGE_ID), any(PostfachNachricht.class));
+			verify(postfachNachrichtService).persistAnswer(RUECKFRAGE_ID, NACHRICHT);
 		}
 	}
 
@@ -416,4 +469,97 @@ class AntragraumServiceTest {
 			return service.getRueckfrage(samlToken, RueckfrageTestFactory.ID);
 		}
 	}
+
+	@DisplayName("Is accessible")
+	@Nested
+	class TestIsAccessible {
+
+		@Test
+		void shouldCallGetTrustLevel() {
+			service.isAccessible(GrpcGetRueckfrageRequestTestFactory.SAML_TOKEN, GrpcServiceKontoTestFactory.TRUST_LEVEL);
+
+			verify(service).getTrustLevel(GrpcGetRueckfrageRequestTestFactory.SAML_TOKEN);
+		}
+
+		@Test
+		void shouldReturnTrueIfTrustLevelMatches() {
+			doReturn(GrpcServiceKontoTestFactory.TRUST_LEVEL).when(service).getTrustLevel(any());
+
+			var trustLevel = service.isAccessible(GrpcGetRueckfrageRequestTestFactory.SAML_TOKEN, GrpcServiceKontoTestFactory.TRUST_LEVEL);
+
+			assertThat(trustLevel).isTrue();
+		}
+
+		@Test
+		void shouldReturnFalseIfTrustLevelNotMatches() {
+			doReturn("qutasch").when(service).getTrustLevel(any());
+
+			var trustLevel = service.isAccessible(GrpcGetRueckfrageRequestTestFactory.SAML_TOKEN, GrpcServiceKontoTestFactory.TRUST_LEVEL);
+
+			assertThat(trustLevel).isFalse();
+		}
+	}
+
+	@DisplayName("Get trustLevel")
+	@Nested
+	class TestGetTrustLevel {
+
+		@Mock
+		private Response response;
+
+		@BeforeEach
+		void mock() {
+			doReturn(response).when(service).parseSamlToken(any());
+
+			when(decrypter.decryptTrustLevel(any())).thenReturn(GrpcServiceKontoTestFactory.TRUST_LEVEL);
+		}
+
+		@Test
+		void shouldCallParseSamlToken() {
+			service.getTrustLevel(GrpcGetRueckfrageRequestTestFactory.SAML_TOKEN);
+
+			verify(service).parseSamlToken(GrpcGetRueckfrageRequestTestFactory.SAML_TOKEN);
+		}
+
+		@Test
+		void shouldCallDecrypter() {
+			service.getTrustLevel(GrpcGetRueckfrageRequestTestFactory.SAML_TOKEN);
+
+			verify(decrypter).decryptTrustLevel(response);
+		}
+
+		@Test
+		void shouldReturnValue() {
+			var trustLevel = service.getTrustLevel(GrpcGetRueckfrageRequestTestFactory.SAML_TOKEN);
+
+			assertThat(trustLevel).isEqualTo(GrpcServiceKontoTestFactory.TRUST_LEVEL);
+		}
+	}
+
+	@DisplayName("Parse saml token")
+	@Nested
+	class TestParseSamlToken {
+
+		@Mock
+		private Response response;
+
+		@BeforeEach
+		void mock() {
+			when(parser.parse(any())).thenReturn(response);
+		}
+
+		@Test
+		void shouldCallParser() {
+			service.parseSamlToken(GrpcGetRueckfrageRequestTestFactory.SAML_TOKEN);
+
+			verify(parser).parse(GrpcGetRueckfrageRequestTestFactory.SAML_TOKEN);
+		}
+
+		@Test
+		void shouldReturnValue() {
+			var parseResponse = service.parseSamlToken(GrpcGetRueckfrageRequestTestFactory.SAML_TOKEN);
+
+			assertThat(parseResponse).isEqualTo(response);
+		}
+	}
 }
\ No newline at end of file
diff --git a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/GrpcFindRueckfragenResponseTestFactory.java b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/GrpcFindRueckfragenResponseTestFactory.java
new file mode 100644
index 0000000..053337a
--- /dev/null
+++ b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/GrpcFindRueckfragenResponseTestFactory.java
@@ -0,0 +1,12 @@
+package de.ozgcloud.nachrichten.antragraum;
+
+public class GrpcFindRueckfragenResponseTestFactory {
+
+	public static GrpcFindRueckfragenResponse create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcFindRueckfragenResponse.Builder createBuilder() {
+		return GrpcFindRueckfragenResponse.newBuilder();
+	}
+}
diff --git a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/GrpcRueckfrageHeadTestFactory.java b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/GrpcRueckfrageHeadTestFactory.java
new file mode 100644
index 0000000..68e54b5
--- /dev/null
+++ b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/GrpcRueckfrageHeadTestFactory.java
@@ -0,0 +1,12 @@
+package de.ozgcloud.nachrichten.antragraum;
+
+public class GrpcRueckfrageHeadTestFactory {
+
+	public static GrpcRueckfrageHead create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcRueckfrageHead.Builder createBuilder() {
+		return GrpcRueckfrageHead.newBuilder();
+	}
+}
\ No newline at end of file
diff --git a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/GrpcRueckfrageTestFactory.java b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/GrpcRueckfrageTestFactory.java
index 829463f..f053390 100644
--- a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/GrpcRueckfrageTestFactory.java
+++ b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/GrpcRueckfrageTestFactory.java
@@ -4,6 +4,8 @@ import de.ozgcloud.nachrichten.postfach.PostfachNachrichtTestFactory;
 
 public class GrpcRueckfrageTestFactory {
 
+	private final static boolean ACCESSIBLE = true;
+
 	public static GrpcRueckfrage create() {
 		return createBuilder().build();
 	}
@@ -13,7 +15,8 @@ public class GrpcRueckfrageTestFactory {
 				.setId(PostfachNachrichtTestFactory.ID)
 				.setText(PostfachNachrichtTestFactory.MAIL_BODY)
 				.setSentAt(PostfachNachrichtTestFactory.SENT_AT_STR)
-				.addAllAttachmentFileId(PostfachNachrichtTestFactory.ATTACHMENTS);
+				.addAllAttachmentFileId(PostfachNachrichtTestFactory.ATTACHMENTS)
+				.setAccessible(ACCESSIBLE);
 
 	}
 }
diff --git a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/RueckfrageMapperTest.java b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/RueckfrageMapperTest.java
index 74e0717..11f099d 100644
--- a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/RueckfrageMapperTest.java
+++ b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/RueckfrageMapperTest.java
@@ -54,20 +54,6 @@ class RueckfrageMapperTest {
 			assertThat(mapped.getSentAt()).isEqualTo(PostfachNachrichtTestFactory.SENT_AT);
 		}
 
-		@Test
-		void shouldMapText() {
-			var mapped = mapFromPostfachNachricht();
-
-			assertThat(mapped.getText()).isEqualTo(PostfachNachrichtTestFactory.MAIL_BODY);
-		}
-
-		@Test
-		void shouldMapAttachments() {
-			var mapped = mapFromPostfachNachricht();
-
-			assertThat(mapped.getAttachments()).isEqualTo(PostfachNachrichtTestFactory.ATTACHMENTS);
-		}
-
 		@Test
 		void shouldHaveDefaultStatus() {
 			var mapped = mapFromPostfachNachricht();
diff --git a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/RueckfrageTestFactory.java b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/RueckfrageTestFactory.java
index 3a60a8a..884770c 100644
--- a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/RueckfrageTestFactory.java
+++ b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/RueckfrageTestFactory.java
@@ -4,6 +4,7 @@ import java.util.UUID;
 
 import com.thedeanda.lorem.LoremIpsum;
 
+import de.ozgcloud.nachrichten.common.vorgang.GrpcServiceKontoTestFactory;
 import de.ozgcloud.nachrichten.postfach.PostfachAddressTestFactory;
 import de.ozgcloud.nachrichten.postfach.PostfachNachrichtTestFactory;
 
@@ -24,7 +25,6 @@ public class RueckfrageTestFactory {
 				.vorgangName(VORGANG_NAME)
 				.postfachAddress(PostfachAddressTestFactory.create())
 				.sentAt(PostfachNachrichtTestFactory.SENT_AT)
-				.text(PostfachNachrichtTestFactory.MAIL_BODY)
-				.attachments(PostfachNachrichtTestFactory.ATTACHMENTS);
+				.trustLevel(GrpcServiceKontoTestFactory.TRUST_LEVEL);
 	}
 }
-- 
GitLab