From cd9735f5b315f89c206b660ccb5e6af77902795e Mon Sep 17 00:00:00 2001
From: OZGCloud <ozgcloud@mgm-tp.com>
Date: Thu, 10 Oct 2024 12:51:50 +0200
Subject: [PATCH] OZG-6676 OZG-6878 add link relation for searching a
 fachstelle

---
 .../CollaborationVorgangProcessor.java        |  7 +++++-
 .../alfa/collaboration/Fachstelle.java        | 15 ++++++++++++
 .../collaboration/FachstelleController.java   | 24 +++++++++++++++++++
 .../CollaborationVorgangProcessorTest.java    | 16 +++++++++++--
 4 files changed, 59 insertions(+), 3 deletions(-)
 create mode 100644 alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/Fachstelle.java
 create mode 100644 alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/FachstelleController.java

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
index c8c7378a3e..4edfc3a6fb 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/CollaborationVorgangProcessor.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/CollaborationVorgangProcessor.java
@@ -23,6 +23,7 @@ class CollaborationVorgangProcessor implements RepresentationModelProcessor<Enti
 
 	static final LinkRelation REL_COLLABORATIONS = LinkRelation.of("collaborations");
 	static final LinkRelation REL_SEARCH_ORGANISATIONS_EINHEIT = LinkRelation.of("searchOrganisationsEinheit");
+	static final LinkRelation REL_SEARCH_FACHSTELLE = LinkRelation.of("searchFachstelle");
 
 	private final CurrentUserService currentUserService;
 	private final CollaborationService collaborationService;
@@ -35,9 +36,13 @@ class CollaborationVorgangProcessor implements RepresentationModelProcessor<Enti
 			return model;
 		}
 
+		var searchOrgnisationsEinheitLink = linkTo(methodOn(OrganisationsEinheitController.class).search(null)).withRel(
+				REL_SEARCH_ORGANISATIONS_EINHEIT);
+		var searchFachstelleLink = linkTo(methodOn(FachstelleController.class).search(null)).withRel(REL_SEARCH_FACHSTELLE);
+
 		return ModelBuilder.fromModel(model)
 				.ifMatch(() -> !collaborationService.hasCollaboration(vorgang.getId()))
-				.addLink(linkTo(methodOn(OrganisationsEinheitController.class).search(null)).withRel(REL_SEARCH_ORGANISATIONS_EINHEIT))
+				.addLinks(searchOrgnisationsEinheitLink, searchFachstelleLink)
 				.addLink(linkTo(methodOn(CollaborationController.class).getAllByVorgangId(vorgang.getId())).withRel(REL_COLLABORATIONS))
 				.buildModel();
 	}
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/Fachstelle.java b/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/Fachstelle.java
new file mode 100644
index 0000000000..604f6c1fe9
--- /dev/null
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/Fachstelle.java
@@ -0,0 +1,15 @@
+package de.ozgcloud.alfa.collaboration;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+import lombok.Builder;
+import lombok.Getter;
+
+@Builder
+@Getter
+class Fachstelle {
+
+	@JsonIgnore
+	private String id;
+
+}
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/FachstelleController.java b/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/FachstelleController.java
new file mode 100644
index 0000000000..3ac3e39ebb
--- /dev/null
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/FachstelleController.java
@@ -0,0 +1,24 @@
+package de.ozgcloud.alfa.collaboration;
+
+import org.springframework.hateoas.CollectionModel;
+import org.springframework.hateoas.EntityModel;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import lombok.RequiredArgsConstructor;
+
+@RestController
+@RequestMapping(FachstelleController.PATH)
+@RequiredArgsConstructor
+class FachstelleController {
+
+	static final String PATH = "/api/fachstelles"; // NOSONAR
+	static final String SEARCH_BY_PARAM = "searchBy";
+
+	@GetMapping(params = { SEARCH_BY_PARAM })
+	public CollectionModel<EntityModel<Fachstelle>> search(@RequestParam String searchBy) {
+		return null;
+	}
+}
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
index 8e28fca8d2..9379fab4b2 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationVorgangProcessorTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationVorgangProcessorTest.java
@@ -124,8 +124,7 @@ class CollaborationVorgangProcessorTest {
 				void shouldHaveThreeLinks() {
 					var model = callProcessor();
 
-					assertThat(model.getLinks()).hasSize(3);
-
+					assertThat(model.getLinks()).hasSize(4);
 				}
 
 				@Test
@@ -141,6 +140,19 @@ class CollaborationVorgangProcessorTest {
 							.isEqualTo(expectedHref);
 				}
 
+				@Test
+				void shouldAddSearchFachstelleLink() {
+					var expectedHref = UriComponentsBuilder.fromUriString(FachstelleController.PATH)
+							.queryParam(FachstelleController.SEARCH_BY_PARAM, "{" + FachstelleController.SEARCH_BY_PARAM + "}")
+							.build().toString();
+
+					var model = callProcessor();
+
+					assertThat(model.getLink(CollaborationVorgangProcessor.REL_SEARCH_FACHSTELLE)).get()
+							.extracting(Link::getHref)
+							.isEqualTo(expectedHref);
+				}
+
 				@Test
 				void shouldAddCollaborationsLink() {
 					var expectedHref = UriComponentsBuilder.fromUriString(CollaborationController.PATH)
-- 
GitLab