From 3b05075ebb3062aa6fc069ce0e705d3d7247f33a Mon Sep 17 00:00:00 2001
From: Felix Reichenbach <felix.reichenbach@mgm-tp.com>
Date: Wed, 8 Jan 2025 16:00:15 +0100
Subject: [PATCH] OZG-6741 add zufiSuche Link

---
 .../admin/common/FeatureToggleProperties.java |  4 +-
 .../OrganisationsEinheitProperties.java       | 24 +++++++
 .../OrganisationsEinheitRootProcessor.java    | 17 ++++-
 ...OrganisationsEinheitRootProcessorTest.java | 71 +++++++++++++++++--
 4 files changed, 109 insertions(+), 7 deletions(-)
 create mode 100644 src/main/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitProperties.java

diff --git a/src/main/java/de/ozgcloud/admin/common/FeatureToggleProperties.java b/src/main/java/de/ozgcloud/admin/common/FeatureToggleProperties.java
index 1589df74..71cdb9ee 100644
--- a/src/main/java/de/ozgcloud/admin/common/FeatureToggleProperties.java
+++ b/src/main/java/de/ozgcloud/admin/common/FeatureToggleProperties.java
@@ -32,9 +32,11 @@ import lombok.Setter;
 @Setter
 @Getter
 @Configuration
-@ConfigurationProperties(prefix = "ozgcloud.feature")
+@ConfigurationProperties(prefix = FeatureToggleProperties.FEATURE_TOGGLE_PREFIX)
 public class FeatureToggleProperties {
 
+	public static final String FEATURE_TOGGLE_PREFIX = "ozgcloud.feature";
+
 	private boolean postfach;
 	private boolean benutzerRollen;
 	private boolean organisationsEinheiten;
diff --git a/src/main/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitProperties.java b/src/main/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitProperties.java
new file mode 100644
index 00000000..2a38bb39
--- /dev/null
+++ b/src/main/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitProperties.java
@@ -0,0 +1,24 @@
+package de.ozgcloud.admin.organisationseinheit;
+
+import jakarta.validation.constraints.NotBlank;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+import de.ozgcloud.admin.common.FeatureToggleProperties;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+@Configuration
+@ConfigurationProperties(prefix = OrganisationsEinheitProperties.ORGANISATIONS_EINHEIT_PROPERTIES_PREFIX)
+@ConditionalOnProperty(prefix = FeatureToggleProperties.FEATURE_TOGGLE_PREFIX, name = "organisationsEinheiten", havingValue = "true")
+class OrganisationsEinheitProperties {
+
+	static final String ORGANISATIONS_EINHEIT_PROPERTIES_PREFIX = "ozgcloud.organisationsEinheit";
+
+	@NotBlank
+	private String zufiSucheUri;
+}
diff --git a/src/main/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitRootProcessor.java b/src/main/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitRootProcessor.java
index 1cb98fd6..9d76ca2b 100644
--- a/src/main/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitRootProcessor.java
+++ b/src/main/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitRootProcessor.java
@@ -25,7 +25,10 @@ package de.ozgcloud.admin.organisationseinheit;
 
 import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*;
 
+import java.util.List;
+
 import org.springframework.hateoas.EntityModel;
+import org.springframework.hateoas.Link;
 import org.springframework.hateoas.server.RepresentationModelProcessor;
 import org.springframework.stereotype.Component;
 
@@ -38,12 +41,22 @@ import lombok.RequiredArgsConstructor;
 class OrganisationsEinheitRootProcessor implements RepresentationModelProcessor<EntityModel<Root>> {
 
 	static final String REL_ORGANISATIONS_EINHEITEN = "organisationsEinheiten";
+	static final String REL_SEARCH_ORGANISATIONS_EINHEIT = "searchOrganisationsEinheit";
 
 	private final FeatureToggleProperties featureToggleProperties;
+	private final OrganisationsEinheitProperties organisationsEinheitProperties;
 
 	@Override
 	public EntityModel<Root> process(EntityModel<Root> model) {
-		return model.addIf(featureToggleProperties.isOrganisationsEinheiten(),
-				() -> linkTo(methodOn(OrganisationsEinheitController.class).getAll()).withRel(REL_ORGANISATIONS_EINHEITEN));
+		return model.addAllIf(featureToggleProperties.isOrganisationsEinheiten(),
+				() -> List.of(buildGetAllOrganisationsEinheitenLink(), buildSearchOrganisationsEinheitLink()));
+	}
+
+	private Link buildGetAllOrganisationsEinheitenLink() {
+		return linkTo(methodOn(OrganisationsEinheitController.class).getAll()).withRel(REL_ORGANISATIONS_EINHEITEN);
+	}
+
+	private Link buildSearchOrganisationsEinheitLink() {
+		return Link.of(organisationsEinheitProperties.getZufiSucheUri(), REL_SEARCH_ORGANISATIONS_EINHEIT);
 	}
 }
diff --git a/src/test/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitRootProcessorTest.java b/src/test/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitRootProcessorTest.java
index f147d68e..1d3bfcc9 100644
--- a/src/test/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitRootProcessorTest.java
+++ b/src/test/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitRootProcessorTest.java
@@ -33,6 +33,8 @@ import org.mockito.Mock;
 import org.springframework.hateoas.EntityModel;
 import org.springframework.hateoas.Link;
 
+import com.thedeanda.lorem.LoremIpsum;
+
 import de.ozgcloud.admin.RootTestFactory;
 import de.ozgcloud.admin.common.FeatureToggleProperties;
 
@@ -42,10 +44,14 @@ class OrganisationsEinheitRootProcessorTest {
 	private OrganisationsEinheitRootProcessor organisationsEinheitRootProcessor;
 	@Mock
 	private FeatureToggleProperties featureToggleProperties;
+	@Mock
+	private OrganisationsEinheitProperties organisationsEinheitProperties;
 
 	@Nested
 	class TestProcess {
 
+		private final String zufiSucheUri = LoremIpsum.getInstance().getUrl() + "?searchBy={searchBy}";
+
 		@Nested
 		class OrganisationsEinheitenLinkRelation {
 
@@ -78,14 +84,71 @@ class OrganisationsEinheitRootProcessorTest {
 						.extracting(Link::getHref)
 						.isEqualTo(OrganisationsEinheitController.PATH);
 			}
+		}
+
+		@Nested
+		class SearchOrganisationsEinheitenLink {
+
+			@Test
+			void shouldExistsIfFeatureEnabled() {
+				givenFeatureIsEnabled();
+
+				var model = organisationsEinheitRootProcessor.process(EntityModel.of(RootTestFactory.create()));
 
-			private void givenFeatureIsEnabled() {
-				when(featureToggleProperties.isOrganisationsEinheiten()).thenReturn(true);
+				assertThat(model.getLink(OrganisationsEinheitRootProcessor.REL_SEARCH_ORGANISATIONS_EINHEIT)).isNotEmpty();
 			}
 
-			private void givenFeatureIsDisabled() {
-				when(featureToggleProperties.isOrganisationsEinheiten()).thenReturn(false);
+			@Test
+			void shouldNotExistIfFeatureDisabled() {
+				givenFeatureIsDisabled();
+
+				var model = organisationsEinheitRootProcessor.process(EntityModel.of(RootTestFactory.create()));
+
+				assertThat(model.getLink(OrganisationsEinheitRootProcessor.REL_SEARCH_ORGANISATIONS_EINHEIT)).isEmpty();
 			}
+
+			@Test
+			void shouldGetZufiSucheUri() {
+				givenFeatureIsEnabled();
+
+				organisationsEinheitRootProcessor.process(EntityModel.of(RootTestFactory.create()));
+
+				verify(organisationsEinheitProperties).getZufiSucheUri();
+
+			}
+
+			@Test
+			void shouldHaveHref() {
+				givenFeatureIsEnabled();
+
+				var model = organisationsEinheitRootProcessor.process(EntityModel.of(RootTestFactory.create()));
+
+				assertThat(model.getLink(OrganisationsEinheitRootProcessor.REL_SEARCH_ORGANISATIONS_EINHEIT))
+						.get()
+						.extracting(Link::getHref)
+						.isEqualTo(zufiSucheUri);
+			}
+
+			@Test
+			void shouldBeTemplated() {
+				givenFeatureIsEnabled();
+
+				var model = organisationsEinheitRootProcessor.process(EntityModel.of(RootTestFactory.create()));
+
+				assertThat(model.getLink(OrganisationsEinheitRootProcessor.REL_SEARCH_ORGANISATIONS_EINHEIT))
+						.get()
+						.extracting(Link::isTemplated)
+						.isEqualTo(true);
+			}
+		}
+
+		private void givenFeatureIsEnabled() {
+			when(featureToggleProperties.isOrganisationsEinheiten()).thenReturn(true);
+			when(organisationsEinheitProperties.getZufiSucheUri()).thenReturn(zufiSucheUri);
+		}
+
+		private void givenFeatureIsDisabled() {
+			when(featureToggleProperties.isOrganisationsEinheiten()).thenReturn(false);
 		}
 
 	}
-- 
GitLab