From bd376abbf72215a94c344f0fbfc56f6401c9bcad Mon Sep 17 00:00:00 2001
From: OZGCloud <ozgcloud@mgm-tp.com>
Date: Wed, 7 Aug 2024 17:06:23 +0200
Subject: [PATCH] OZG-6300 OZG-6388 Feature toggle for collaboration

---
 .../src/main/resources/application-dev.yml    |  1 +
 .../src/main/resources/application-local.yml  |  1 +
 .../CollaborationVorgangProcessor.java        | 36 +++++++++++
 .../alfa/common/FeatureToggleProperties.java  |  5 ++
 .../CollaborationVorgangProcessorITCase.java  | 32 ++++++++++
 .../CollaborationVorgangProcessorTest.java    | 60 +++++++++++++++++++
 6 files changed, 135 insertions(+)
 create mode 100644 alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/CollaborationVorgangProcessor.java
 create mode 100644 alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationVorgangProcessorITCase.java
 create mode 100644 alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationVorgangProcessorTest.java

diff --git a/alfa-server/src/main/resources/application-dev.yml b/alfa-server/src/main/resources/application-dev.yml
index 52ca56a22d..6f11904235 100644
--- a/alfa-server/src/main/resources/application-dev.yml
+++ b/alfa-server/src/main/resources/application-dev.yml
@@ -10,6 +10,7 @@ server:
 ozgcloud:
   feature:
     reply-always-allowed: true
+    collaboration-enabled: true
   production: false
   stage:
     production: false
diff --git a/alfa-server/src/main/resources/application-local.yml b/alfa-server/src/main/resources/application-local.yml
index b113a7052d..74743fd293 100644
--- a/alfa-server/src/main/resources/application-local.yml
+++ b/alfa-server/src/main/resources/application-local.yml
@@ -18,6 +18,7 @@ grpc:
 ozgcloud:
   feature:
     reply-always-allowed: true
+    collaboration-enabled: true
   production: false
   user-assistance:
     documentation:
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/CollaborationVorgangProcessor.java b/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/CollaborationVorgangProcessor.java
new file mode 100644
index 0000000000..eff3647129
--- /dev/null
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/CollaborationVorgangProcessor.java
@@ -0,0 +1,36 @@
+package de.ozgcloud.alfa.collaboration;
+
+import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*;
+
+import java.util.Objects;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.hateoas.EntityModel;
+import org.springframework.hateoas.LinkRelation;
+import org.springframework.hateoas.server.RepresentationModelProcessor;
+import org.springframework.stereotype.Component;
+
+import de.ozgcloud.alfa.common.ModelBuilder;
+import de.ozgcloud.alfa.common.command.CommandController;
+import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
+
+@Component
+@ConditionalOnProperty("ozgcloud.feature.collaboration-enabled")
+class CollaborationVorgangProcessor implements RepresentationModelProcessor<EntityModel<VorgangWithEingang>> {
+
+	static final LinkRelation REL_CREATE_COLLABORATION_REQUEST = LinkRelation.of("createCollaborationRequest");
+
+	@Override
+	public EntityModel<VorgangWithEingang> process(EntityModel<VorgangWithEingang> model) {
+		var vorgang = model.getContent();
+
+		if (Objects.isNull(vorgang)) {
+			return model;
+		}
+
+		return ModelBuilder.fromModel(model)
+				.addLink(linkTo(methodOn(CommandController.CommandByRelationController.class).createCommand(vorgang.getId(), vorgang.getId(),
+						vorgang.getVersion(), null)).withRel(REL_CREATE_COLLABORATION_REQUEST))
+				.buildModel();
+	}
+}
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/FeatureToggleProperties.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/FeatureToggleProperties.java
index 80238fccb2..5b60fc6720 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/FeatureToggleProperties.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/FeatureToggleProperties.java
@@ -16,4 +16,9 @@ public class FeatureToggleProperties {
 	 * Enable mail reply option regardless of other configuration.
 	 */
 	private boolean replyAlwaysAllowed = false;
+
+	/**
+	 * Enable collaboration-feature in Vorgang
+	 */
+	private boolean collaborationEnabled = false;
 }
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationVorgangProcessorITCase.java b/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationVorgangProcessorITCase.java
new file mode 100644
index 0000000000..fe18954881
--- /dev/null
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationVorgangProcessorITCase.java
@@ -0,0 +1,32 @@
+package de.ozgcloud.alfa.collaboration;
+
+import static org.assertj.core.api.Assertions.*;
+
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.ApplicationContext;
+
+class CollaborationVorgangProcessorITCase {
+
+	@SpringBootTest(properties = {"ozgcloud.feature.collaboration-enabled=true"})
+	@Nested
+	class OnFeatureEnabled {
+
+		@Test
+		void shouldExistInApplicationContext(ApplicationContext context) {
+			assertThat(context.getBean(CollaborationVorgangProcessor.class)).isNotNull();
+		}
+	}
+
+	@SpringBootTest
+	@Nested
+	class OnFeatureDisabled {
+
+		@Test
+		void shouldNotExistInApplicationContext(ApplicationContext context) {
+			assertThatThrownBy(() -> context.getBean(CollaborationVorgangProcessor.class)).isInstanceOf(NoSuchBeanDefinitionException.class);
+		}
+	}
+}
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationVorgangProcessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationVorgangProcessorTest.java
new file mode 100644
index 0000000000..86b1fad98a
--- /dev/null
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationVorgangProcessorTest.java
@@ -0,0 +1,60 @@
+package de.ozgcloud.alfa.collaboration;
+
+import static de.ozgcloud.alfa.common.UserProfileUrlProviderTestFactory.*;
+import static org.assertj.core.api.Assertions.*;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mockito.Spy;
+import org.springframework.hateoas.EntityModel;
+import org.springframework.hateoas.Link;
+import org.springframework.hateoas.UriTemplate;
+
+import de.ozgcloud.alfa.common.UserProfileUrlProvider;
+import de.ozgcloud.alfa.common.command.CommandController;
+import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory;
+import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory;
+
+class CollaborationVorgangProcessorTest {
+
+	@Spy
+	private CollaborationVorgangProcessor processor;
+
+	private final UserProfileUrlProvider urlProvider = new UserProfileUrlProvider();
+
+	@Nested
+	class TestProcess {
+
+		@Nested
+		class OnNullVorgang {
+
+			@Test
+			void shouldNotAddLinksIfVorgangIsNull() {
+				var model = processor.process(new EntityModel<>() {});
+
+				assertThat(model.hasLinks()).isFalse();
+			}
+		}
+
+		@Nested
+		class OnNonNullVorgang {
+
+			@BeforeEach
+			void prepareBuilder() {
+				initUserProfileUrlProvider(urlProvider);
+			}
+
+
+			@Test
+			void shouldAddCreateCollaborationRequestRelation() {
+				var model = processor.process(EntityModel.of(VorgangWithEingangTestFactory.create()));
+
+				assertThat(model.getLink(CollaborationVorgangProcessor.REL_CREATE_COLLABORATION_REQUEST)).isPresent().get()
+						.extracting(Link::getHref)
+						.isEqualTo(UriTemplate.of(CommandController.CommandByRelationController.COMMAND_BY_RELATION_PATH)
+								.expand(VorgangHeaderTestFactory.ID, VorgangHeaderTestFactory.ID, VorgangHeaderTestFactory.VERSION).toString());
+			}
+		}
+	}
+}
-- 
GitLab