From 5e86a7370dd3d41ad037dceb793bf6bc585b6bc0 Mon Sep 17 00:00:00 2001 From: Krzysztof <krzysztof.witukiewicz@mgm-tp.com> Date: Fri, 7 Mar 2025 14:10:51 +0100 Subject: [PATCH 1/7] OZG-7501 OZG-7874 Create ForwardByVorgangCommandController --- .../alfa/collaboration/Anschrift.java | 2 +- .../collaboration/OrganisationsEinheit.java | 2 +- .../OrganisationsEinheitController.java | 2 +- .../OrganisationsEinheitHeader.java | 2 +- .../alfa/common/command/CommandBody.java | 4 +- .../alfa/common/command/CommandOrder.java | 2 + .../ForwardByVorgangCommandController.java | 78 +++++++++ .../forwarding/ForwardVorgangCommandBody.java | 47 +++++ ...reateForwardVorgangCommandTestFactory.java | 44 +++++ ...ForwardByVorgangCommandControllerTest.java | 163 ++++++++++++++++++ .../ForwardVorgangCommandBodyTestFactory.java | 41 +++++ 11 files changed, 382 insertions(+), 5 deletions(-) create mode 100644 alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardByVorgangCommandController.java create mode 100644 alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBody.java create mode 100644 alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/CreateForwardVorgangCommandTestFactory.java create mode 100644 alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardByVorgangCommandControllerTest.java create mode 100644 alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyTestFactory.java diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/Anschrift.java b/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/Anschrift.java index 231090b96c..96b2d58709 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/Anschrift.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/Anschrift.java @@ -28,7 +28,7 @@ import lombok.Getter; @Builder @Getter -class Anschrift { +public class Anschrift { private String strasse; private String hausnummer; diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/OrganisationsEinheit.java b/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/OrganisationsEinheit.java index aeccb1786c..56e5510b8a 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/OrganisationsEinheit.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/OrganisationsEinheit.java @@ -30,7 +30,7 @@ import lombok.extern.jackson.Jacksonized; @Builder @Getter @Jacksonized -class OrganisationsEinheit { +public class OrganisationsEinheit { private String id; private XzufiId xzufiId; diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/OrganisationsEinheitController.java b/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/OrganisationsEinheitController.java index 9117179028..bee8310c01 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/OrganisationsEinheitController.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/OrganisationsEinheitController.java @@ -40,7 +40,7 @@ import lombok.RequiredArgsConstructor; @RestController @RequestMapping(OrganisationsEinheitController.PATH) @RequiredArgsConstructor -class OrganisationsEinheitController { +public class OrganisationsEinheitController { static final String PATH = "/api/organisationseinheits"; // NOSONAR static final String SEARCH_BY_PARAM = "searchBy"; diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/OrganisationsEinheitHeader.java b/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/OrganisationsEinheitHeader.java index b62a4788a8..ab2b3b4c6a 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/OrganisationsEinheitHeader.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/OrganisationsEinheitHeader.java @@ -30,7 +30,7 @@ import lombok.Getter; @Builder @Getter -class OrganisationsEinheitHeader { +public class OrganisationsEinheitHeader { @JsonIgnore private String id; diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandBody.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandBody.java index 46db2e9b65..1f288483dc 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandBody.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandBody.java @@ -30,6 +30,7 @@ import de.ozgcloud.alfa.aktenzeichen.AktenzeichenCommandBody; import de.ozgcloud.alfa.bescheid.Bescheid; import de.ozgcloud.alfa.bescheid.BescheidDocumentFromFileBody; import de.ozgcloud.alfa.collaboration.CollaborationCommandBody; +import de.ozgcloud.alfa.forwarding.ForwardVorgangCommandBody; import de.ozgcloud.alfa.forwarding.RedirectRequest; import de.ozgcloud.alfa.kommentar.Kommentar; import de.ozgcloud.alfa.loeschanforderung.DeleteLoeschAnforderung; @@ -57,7 +58,8 @@ import de.ozgcloud.alfa.wiedervorlage.Wiedervorlage; @Type(value = AktenzeichenCommandBody.class, name = "SET_AKTENZEICHEN"), @Type(value = BescheidDocumentFromFileBody.class, name = "CREATE_BESCHEID_DOCUMENT_FROM_FILE"), @Type(value = CollaborationCommandBody.class, name = "CREATE_COLLABORATION_REQUEST"), - @Type(value = EmptyCommandBody.class, name = "ARCHIVE_VORGANG") + @Type(value = EmptyCommandBody.class, name = "ARCHIVE_VORGANG"), + @Type(value = ForwardVorgangCommandBody.class, name = "FORWARD_VORGANG") }) public interface CommandBody { } diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandOrder.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandOrder.java index 5e97b02673..16b13bd448 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandOrder.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandOrder.java @@ -73,6 +73,8 @@ public enum CommandOrder { PROCESS_VORGANG(false, Type.VORGANG), + FORWARD_VORGANG(false, Type.VORGANG), + CREATE_COLLABORATION_REQUEST(false, Type.COLLABORATION), UNBEKANNT(false, Type.NONE); diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardByVorgangCommandController.java b/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardByVorgangCommandController.java new file mode 100644 index 0000000000..c9928a5d9a --- /dev/null +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardByVorgangCommandController.java @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.alfa.forwarding; + +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import de.ozgcloud.alfa.collaboration.OrganisationsEinheit; +import de.ozgcloud.alfa.collaboration.OrganisationsEinheitController; +import de.ozgcloud.alfa.common.command.CommandController; +import de.ozgcloud.alfa.common.command.CommandService; +import de.ozgcloud.alfa.common.command.CreateCommand; +import de.ozgcloud.common.errorhandling.TechnicalException; +import lombok.RequiredArgsConstructor; + +@RestController +@RequestMapping(ForwardByVorgangCommandController.PATH) +@RequiredArgsConstructor +class ForwardByVorgangCommandController { + static final String PATH = "/api/vorgangs/{vorgangId}/{vorgangVersion}/forwarding"; + + private final CommandService commandService; + private final OrganisationsEinheitController organisationsEinheitController; + + @PostMapping + public ResponseEntity<Void> createCommand(@PathVariable String vorgangId, @PathVariable long vorgangVersion, @RequestBody CreateCommand command) { + var body = (ForwardVorgangCommandBody) command.getBody(); + var enrichedCommand = command.toBuilder() + .vorgangId(vorgangId) + .relationId(vorgangId) + .body(addOrganisationsEinheitData(getOrganisationsEinheitById(body.getOrganisationsEinheitId()), body)) + .build(); + var created = commandService.createCommand(enrichedCommand, vorgangVersion); + return ResponseEntity.created(linkTo(CommandController.class).slash(created.getId()).toUri()).build(); + } + + private OrganisationsEinheit getOrganisationsEinheitById(String id) { + var response = organisationsEinheitController.getById(id); + if (!response.getStatusCode().is2xxSuccessful() || response.getBody() == null) { + throw new TechnicalException("Could not get Organisationseinheit by id: " + id); + } + return response.getBody().getContent(); + } + + private ForwardVorgangCommandBody addOrganisationsEinheitData(OrganisationsEinheit organisationsEinheit, ForwardVorgangCommandBody body) { + return body.toBuilder() + .name(organisationsEinheit.getName()) + .anschrift(organisationsEinheit.getAnschrift()) + .build(); + } +} diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBody.java b/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBody.java new file mode 100644 index 0000000000..14c6d31e0e --- /dev/null +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBody.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.alfa.forwarding; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; + +import de.ozgcloud.alfa.collaboration.Anschrift; +import de.ozgcloud.alfa.common.LinkedResourceDeserializer; +import de.ozgcloud.alfa.common.command.CommandBody; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Builder(toBuilder = true) +@AllArgsConstructor +@NoArgsConstructor +public class ForwardVorgangCommandBody implements CommandBody { + + @JsonDeserialize(using = LinkedResourceDeserializer.class) + private String organisationsEinheitId; + + private String name; + private Anschrift anschrift; +} diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/CreateForwardVorgangCommandTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/CreateForwardVorgangCommandTestFactory.java new file mode 100644 index 0000000000..077816660e --- /dev/null +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/CreateForwardVorgangCommandTestFactory.java @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.alfa.forwarding; + +import de.ozgcloud.alfa.common.command.CommandOrder; +import de.ozgcloud.alfa.common.command.CreateCommand; +import de.ozgcloud.alfa.common.command.CreateCommand.CreateCommandBuilder; +import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory; + +class CreateForwardVorgangCommandTestFactory { + + static CreateCommand create() { + return createBuilder().build(); + } + + static CreateCommandBuilder createBuilder() { + return CreateCommand.builder() + .order(CommandOrder.FORWARD_VORGANG.name()) + .vorgangId(VorgangHeaderTestFactory.ID) + .relationId(VorgangHeaderTestFactory.ID) + .body(ForwardVorgangCommandBodyTestFactory.create()); + } +} diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardByVorgangCommandControllerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardByVorgangCommandControllerTest.java new file mode 100644 index 0000000000..196916013c --- /dev/null +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardByVorgangCommandControllerTest.java @@ -0,0 +1,163 @@ +/* + * Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.alfa.forwarding; + +import static de.ozgcloud.alfa.common.command.CommandController.*; +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; +import org.springframework.hateoas.EntityModel; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.ResultActions; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; + +import de.ozgcloud.alfa.collaboration.OrganisationsEinheitController; +import de.ozgcloud.alfa.collaboration.OrganisationsEinheitTestFactory; +import de.ozgcloud.alfa.common.command.CommandOrder; +import de.ozgcloud.alfa.common.command.CommandService; +import de.ozgcloud.alfa.common.command.CommandTestFactory; +import de.ozgcloud.alfa.common.command.CreateCommand; +import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory; +import de.ozgcloud.common.errorhandling.TechnicalException; +import lombok.SneakyThrows; + +class ForwardByVorgangCommandControllerTest { + + @Mock + private CommandService commandService; + @Mock + private OrganisationsEinheitController organisationsEinheitController; + @Spy + @InjectMocks + private ForwardByVorgangCommandController controller; + + private MockMvc mockMvc; + + @BeforeEach + void init() { + mockMvc = MockMvcBuilders.standaloneSetup(controller).build(); + } + + @Nested + class TestCreateCommand { + + @Nested + class OnOrganisationsEinheitAvailable { + + @Captor + private ArgumentCaptor<CreateCommand> commandCaptor; + + @BeforeEach + void init() { + when(organisationsEinheitController.getById(any())).thenReturn( + new ResponseEntity<>(EntityModel.of(OrganisationsEinheitTestFactory.create()), HttpStatus.OK)); + when(commandService.createCommand(any(), anyLong())).thenReturn(CommandTestFactory.create()); + } + + @Test + void shouldCallOrganisationsEinheitController() { + doRequest(); + + verify(organisationsEinheitController).getById(OrganisationsEinheitTestFactory.ID); + } + + @Test + void shouldCallCommandService() { + doRequest(); + + verify(commandService).createCommand(commandCaptor.capture(), eq(VorgangHeaderTestFactory.VERSION)); + assertThat(commandCaptor.getValue()).usingRecursiveComparison().isEqualTo(CreateForwardVorgangCommandTestFactory.create()); + } + + @SneakyThrows + @Test + void shouldReturnCreated() { + var response = doRequest(); + + response.andExpect(status().isCreated()); + } + + @SneakyThrows + @Test + void shouldReturnLinkToCreatedCommand() { + var response = doRequest(); + + response.andExpect(header().stringValues("location", "http://localhost" + COMMANDS_PATH + "/" + CommandTestFactory.ID)); + } + } + + @Nested + class OnOrganisationsEinheitMissing { + + @SneakyThrows + @Test + void shouldThrowExceptionIfNotFound() { + when(organisationsEinheitController.getById(OrganisationsEinheitTestFactory.ID)) + .thenReturn(new ResponseEntity<>(HttpStatus.NOT_FOUND)); + + assertTechnicalExceptionThrown(); + } + + @SneakyThrows + @Test + void shouldThrowExceptionIfBodyIsEmpty() { + when(organisationsEinheitController.getById(OrganisationsEinheitTestFactory.ID)) + .thenReturn(new ResponseEntity<>(null, HttpStatus.OK)); + + assertTechnicalExceptionThrown(); + } + + private void assertTechnicalExceptionThrown() { + assertThatThrownBy(() -> doRequest()).rootCause().isInstanceOf(TechnicalException.class) + .hasMessageStartingWith("Could not get Organisationseinheit by id: %s", OrganisationsEinheitTestFactory.ID); + } + } + + @SneakyThrows + private ResultActions doRequest() { + return mockMvc.perform(post(ForwardByVorgangCommandController.PATH, VorgangHeaderTestFactory.ID, VorgangHeaderTestFactory.VERSION) + .contentType(MediaType.APPLICATION_JSON) + .content(createContent())); + } + + private String createContent() { + return CommandTestFactory.buildCreateCommandWithBodyContent( + CommandOrder.FORWARD_VORGANG, + "{\"organisationsEinheitId\":\"%s\"}".formatted(OrganisationsEinheitTestFactory.ID)); + } + } +} diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyTestFactory.java new file mode 100644 index 0000000000..ac8f4a4d34 --- /dev/null +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyTestFactory.java @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.alfa.forwarding; + +import de.ozgcloud.alfa.collaboration.OrganisationsEinheitTestFactory; +import de.ozgcloud.alfa.forwarding.ForwardVorgangCommandBody.ForwardVorgangCommandBodyBuilder; + +class ForwardVorgangCommandBodyTestFactory { + + static ForwardVorgangCommandBody create() { + return createBuilder().build(); + } + + static ForwardVorgangCommandBodyBuilder createBuilder() { + return ForwardVorgangCommandBody.builder() + .organisationsEinheitId(OrganisationsEinheitTestFactory.ID) + .name(OrganisationsEinheitTestFactory.NAME) + .anschrift(OrganisationsEinheitTestFactory.ANSCHRIFT); + } +} -- GitLab From 1055b20bef0257b9dca3ddf4494e649f1b763f1e Mon Sep 17 00:00:00 2001 From: Krzysztof <krzysztof.witukiewicz@mgm-tp.com> Date: Fri, 7 Mar 2025 14:44:33 +0100 Subject: [PATCH 2/7] OZG-7501 OZG-7874 Point the link forwardByOzgCloud to ForwardByVorgangCommandController --- .../forwarding/ForwardingVorgangWithEingangProcessor.java | 3 +-- .../ForwardingVorgangWithEingangProcessorTest.java | 5 ++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardingVorgangWithEingangProcessor.java b/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardingVorgangWithEingangProcessor.java index 714dc343d3..3aa5eca619 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardingVorgangWithEingangProcessor.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardingVorgangWithEingangProcessor.java @@ -34,7 +34,6 @@ import org.springframework.hateoas.server.RepresentationModelProcessor; import org.springframework.stereotype.Component; import de.ozgcloud.alfa.common.FeatureToggleProperties; -import de.ozgcloud.alfa.common.command.CommandController; import de.ozgcloud.alfa.common.user.CurrentUserService; import de.ozgcloud.alfa.common.user.UserRole; import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus; @@ -74,7 +73,7 @@ class ForwardingVorgangWithEingangProcessor implements RepresentationModelProces } private Link buildForwardByOzgCloudLink(VorgangWithEingang vorgang) { - return linkTo(methodOn(CommandController.CommandByRelationController.class).createCommand(vorgang.getId(), vorgang.getId(), + return linkTo(methodOn(ForwardByVorgangCommandController.class).createCommand(vorgang.getId(), vorgang.getVersion(), null)).withRel(REL_FORWARD_BY_OZGCLOUD); } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardingVorgangWithEingangProcessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardingVorgangWithEingangProcessorTest.java index e1da1b36f7..ffa0dbd2fb 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardingVorgangWithEingangProcessorTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardingVorgangWithEingangProcessorTest.java @@ -42,7 +42,6 @@ import org.springframework.hateoas.Link; import org.springframework.web.util.UriComponentsBuilder; import de.ozgcloud.alfa.common.FeatureToggleProperties; -import de.ozgcloud.alfa.common.command.CommandController.CommandByRelationController; import de.ozgcloud.alfa.common.user.CurrentUserService; import de.ozgcloud.alfa.common.user.UserRole; import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus; @@ -122,8 +121,8 @@ class ForwardingVorgangWithEingangProcessorTest { @Test void shouldAddForwardByOzgCloudLink() { - var expectedHref = UriComponentsBuilder.fromUriString(CommandByRelationController.COMMAND_BY_RELATION_PATH) - .buildAndExpand(VorgangHeaderTestFactory.ID, VorgangHeaderTestFactory.ID, VorgangHeaderTestFactory.VERSION).toString(); + var expectedHref = UriComponentsBuilder.fromUriString(ForwardByVorgangCommandController.PATH) + .buildAndExpand(VorgangHeaderTestFactory.ID, VorgangHeaderTestFactory.VERSION).toString(); var model = processor.process(EntityModel.of(vorgang)); -- GitLab From 838ff04706986c32631a3f39a411f3dc424f7243 Mon Sep 17 00:00:00 2001 From: Krzysztof <krzysztof.witukiewicz@mgm-tp.com> Date: Fri, 7 Mar 2025 14:59:07 +0100 Subject: [PATCH 3/7] OZG-7501 OZG-7874 Change type of FORWARD_VORGANG --- .../main/java/de/ozgcloud/alfa/common/command/CommandOrder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandOrder.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandOrder.java index 16b13bd448..2abd4dff45 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandOrder.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandOrder.java @@ -73,7 +73,7 @@ public enum CommandOrder { PROCESS_VORGANG(false, Type.VORGANG), - FORWARD_VORGANG(false, Type.VORGANG), + FORWARD_VORGANG(false, Type.FORWARDING), CREATE_COLLABORATION_REQUEST(false, Type.COLLABORATION), -- GitLab From 8387f5a8f5cb63888a9d9f5229edf2c07a91ba60 Mon Sep 17 00:00:00 2001 From: Krzysztof <krzysztof.witukiewicz@mgm-tp.com> Date: Fri, 7 Mar 2025 16:01:21 +0100 Subject: [PATCH 4/7] OZG-7501 OZG-7874 Fix tests --- .../command/CommandModelAssemblerTest.java | 4 +-- ...ForwardByVorgangCommandControllerTest.java | 28 +++++++++---------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandModelAssemblerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandModelAssemblerTest.java index cdc84e3c2b..bd98a6b027 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandModelAssemblerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandModelAssemblerTest.java @@ -226,7 +226,7 @@ class CommandModelAssemblerTest { "UPDATE_ATTACHED_ITEM", "PATCH_ATTACHED_ITEM", "RECEIVE_POSTFACH_NACHRICHT", "VORGANG_LOESCHEN", "DELETE_ATTACHED_ITEM", "VORGANG_ZUM_LOESCHEN_MARKIEREN", "LOESCH_ANFORDERUNG_ZURUECKNEHMEN", "CREATE_BESCHEID", "PROCESS_VORGANG", "SET_AKTENZEICHEN", "DELETE_BESCHEID", "UPDATE_BESCHEID", "CREATE_BESCHEID_DOCUMENT_FROM_FILE", "CREATE_BESCHEID_DOCUMENT", "SEND_BESCHEID", - "UNBEKANNT", "CREATE_COLLABORATION_REQUEST" }) + "UNBEKANNT", "CREATE_COLLABORATION_REQUEST", "FORWARD_VORGANG" }) void shouldBePresentOnOrder(CommandOrder order) { var model = toModelWithOrder(order.name()); @@ -250,7 +250,7 @@ class CommandModelAssemblerTest { @ParameterizedTest @EnumSource(mode = Mode.EXCLUDE, names = { "VORGANG_ANNEHMEN", "VORGANG_VERWERFEN", "VORGANG_ZURUECKHOLEN", "VORGANG_BEARBEITEN", "VORGANG_BESCHEIDEN", "VORGANG_ZURUECKSTELLEN", "VORGANG_ABSCHLIESSEN", "VORGANG_WIEDEREROEFFNEN", "VORGANG_ZUM_LOESCHEN_MARKIEREN", - "LOESCH_ANFORDERUNG_ZURUECKNEHMEN" }) + "LOESCH_ANFORDERUNG_ZURUECKNEHMEN", "FORWARD_VORGANG" }) void shouldNOTBePresentOnOrder(CommandOrder order) { var model = toModelWithOrder(order.name()); diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardByVorgangCommandControllerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardByVorgangCommandControllerTest.java index 196916013c..d048bea2da 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardByVorgangCommandControllerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardByVorgangCommandControllerTest.java @@ -51,8 +51,9 @@ import de.ozgcloud.alfa.common.command.CommandOrder; import de.ozgcloud.alfa.common.command.CommandService; import de.ozgcloud.alfa.common.command.CommandTestFactory; import de.ozgcloud.alfa.common.command.CreateCommand; +import de.ozgcloud.alfa.common.errorhandling.ExceptionController; +import de.ozgcloud.alfa.common.errorhandling.ProblemDetailMapper; import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory; -import de.ozgcloud.common.errorhandling.TechnicalException; import lombok.SneakyThrows; class ForwardByVorgangCommandControllerTest { @@ -61,6 +62,8 @@ class ForwardByVorgangCommandControllerTest { private CommandService commandService; @Mock private OrganisationsEinheitController organisationsEinheitController; + @Mock + private ProblemDetailMapper problemDetailMapper; @Spy @InjectMocks private ForwardByVorgangCommandController controller; @@ -69,7 +72,7 @@ class ForwardByVorgangCommandControllerTest { @BeforeEach void init() { - mockMvc = MockMvcBuilders.standaloneSetup(controller).build(); + mockMvc = MockMvcBuilders.standaloneSetup(controller).setControllerAdvice(new ExceptionController(problemDetailMapper)).build(); } @Nested @@ -125,25 +128,22 @@ class ForwardByVorgangCommandControllerTest { @SneakyThrows @Test - void shouldThrowExceptionIfNotFound() { - when(organisationsEinheitController.getById(OrganisationsEinheitTestFactory.ID)) - .thenReturn(new ResponseEntity<>(HttpStatus.NOT_FOUND)); + void shouldReturnInternalServerErrorIfNotFound() { + when(organisationsEinheitController.getById(any())).thenReturn(new ResponseEntity<>(HttpStatus.NOT_FOUND)); + + var response = doRequest(); - assertTechnicalExceptionThrown(); + response.andExpect(status().isInternalServerError()); } @SneakyThrows @Test - void shouldThrowExceptionIfBodyIsEmpty() { - when(organisationsEinheitController.getById(OrganisationsEinheitTestFactory.ID)) - .thenReturn(new ResponseEntity<>(null, HttpStatus.OK)); + void shouldReturnInternalServerErrorIfBodyIsEmpty() { + when(organisationsEinheitController.getById(any())).thenReturn(new ResponseEntity<>(null, HttpStatus.OK)); - assertTechnicalExceptionThrown(); - } + var response = doRequest(); - private void assertTechnicalExceptionThrown() { - assertThatThrownBy(() -> doRequest()).rootCause().isInstanceOf(TechnicalException.class) - .hasMessageStartingWith("Could not get Organisationseinheit by id: %s", OrganisationsEinheitTestFactory.ID); + response.andExpect(status().isInternalServerError()); } } -- GitLab From 0dd2701cdc51dda01e679e1651e0daaf0d10ba82 Mon Sep 17 00:00:00 2001 From: Krzysztof <krzysztof.witukiewicz@mgm-tp.com> Date: Mon, 10 Mar 2025 13:31:54 +0100 Subject: [PATCH 5/7] OZG-7501 OZG-7874 Fix serialization issue --- .../ForwardByVorgangCommandController.java | 6 +- .../forwarding/ForwardVorgangCommandBody.java | 8 ++- .../ForwardVorgangCommandBodyMapper.java | 41 ++++++++++++ ...ForwardByVorgangCommandControllerTest.java | 18 +++++- .../ForwardVorgangCommandBodyMapperTest.java | 63 +++++++++++++++++++ .../ForwardVorgangCommandBodyTestFactory.java | 6 +- 6 files changed, 134 insertions(+), 8 deletions(-) create mode 100644 alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyMapper.java create mode 100644 alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyMapperTest.java diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardByVorgangCommandController.java b/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardByVorgangCommandController.java index c9928a5d9a..fb5224959e 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardByVorgangCommandController.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardByVorgangCommandController.java @@ -48,6 +48,7 @@ class ForwardByVorgangCommandController { private final CommandService commandService; private final OrganisationsEinheitController organisationsEinheitController; + private final ForwardVorgangCommandBodyMapper bodyMapper; @PostMapping public ResponseEntity<Void> createCommand(@PathVariable String vorgangId, @PathVariable long vorgangVersion, @RequestBody CreateCommand command) { @@ -70,9 +71,6 @@ class ForwardByVorgangCommandController { } private ForwardVorgangCommandBody addOrganisationsEinheitData(OrganisationsEinheit organisationsEinheit, ForwardVorgangCommandBody body) { - return body.toBuilder() - .name(organisationsEinheit.getName()) - .anschrift(organisationsEinheit.getAnschrift()) - .build(); + return bodyMapper.updateFromOrganisationsEinheit(organisationsEinheit, body); } } diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBody.java b/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBody.java index 14c6d31e0e..db96ddecb3 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBody.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBody.java @@ -25,15 +25,16 @@ package de.ozgcloud.alfa.forwarding; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import de.ozgcloud.alfa.collaboration.Anschrift; import de.ozgcloud.alfa.common.LinkedResourceDeserializer; import de.ozgcloud.alfa.common.command.CommandBody; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.Setter; @Getter +@Setter @Builder(toBuilder = true) @AllArgsConstructor @NoArgsConstructor @@ -43,5 +44,8 @@ public class ForwardVorgangCommandBody implements CommandBody { private String organisationsEinheitId; private String name; - private Anschrift anschrift; + private String strasse; + private String hausnummer; + private String plz; + private String ort; } diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyMapper.java b/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyMapper.java new file mode 100644 index 0000000000..f766f9e94b --- /dev/null +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyMapper.java @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.alfa.forwarding; + +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.MappingTarget; + +import de.ozgcloud.alfa.collaboration.OrganisationsEinheit; + +@Mapper +interface ForwardVorgangCommandBodyMapper { + + @Mapping(target = "organisationsEinheitId", ignore = true) + @Mapping(target = "strasse", source = "anschrift.strasse") + @Mapping(target = "hausnummer", source = "anschrift.hausnummer") + @Mapping(target = "plz", source = "anschrift.plz") + @Mapping(target = "ort", source = "anschrift.ort") + ForwardVorgangCommandBody updateFromOrganisationsEinheit(OrganisationsEinheit organisationsEinheit, @MappingTarget ForwardVorgangCommandBody commandBody); +} diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardByVorgangCommandControllerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardByVorgangCommandControllerTest.java index d048bea2da..908bf70e6b 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardByVorgangCommandControllerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardByVorgangCommandControllerTest.java @@ -45,6 +45,7 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import de.ozgcloud.alfa.collaboration.OrganisationsEinheit; import de.ozgcloud.alfa.collaboration.OrganisationsEinheitController; import de.ozgcloud.alfa.collaboration.OrganisationsEinheitTestFactory; import de.ozgcloud.alfa.common.command.CommandOrder; @@ -63,6 +64,8 @@ class ForwardByVorgangCommandControllerTest { @Mock private OrganisationsEinheitController organisationsEinheitController; @Mock + private ForwardVorgangCommandBodyMapper bodyMapper; + @Mock private ProblemDetailMapper problemDetailMapper; @Spy @InjectMocks @@ -78,17 +81,22 @@ class ForwardByVorgangCommandControllerTest { @Nested class TestCreateCommand { + @Captor + private ArgumentCaptor<ForwardVorgangCommandBody> bodyCaptor; + @Nested class OnOrganisationsEinheitAvailable { + private final OrganisationsEinheit organisationsEinheit = OrganisationsEinheitTestFactory.create(); @Captor private ArgumentCaptor<CreateCommand> commandCaptor; @BeforeEach void init() { when(organisationsEinheitController.getById(any())).thenReturn( - new ResponseEntity<>(EntityModel.of(OrganisationsEinheitTestFactory.create()), HttpStatus.OK)); + new ResponseEntity<>(EntityModel.of(organisationsEinheit), HttpStatus.OK)); when(commandService.createCommand(any(), anyLong())).thenReturn(CommandTestFactory.create()); + when(bodyMapper.updateFromOrganisationsEinheit(any(), any())).thenReturn(ForwardVorgangCommandBodyTestFactory.create()); } @Test @@ -98,6 +106,14 @@ class ForwardByVorgangCommandControllerTest { verify(organisationsEinheitController).getById(OrganisationsEinheitTestFactory.ID); } + @Test + void shouldAddOrganisationsEinheitData() { + doRequest(); + + verify(controller).createCommand(any(), anyLong(), commandCaptor.capture()); + verify(bodyMapper).updateFromOrganisationsEinheit(organisationsEinheit, (ForwardVorgangCommandBody) commandCaptor.getValue().getBody()); + } + @Test void shouldCallCommandService() { doRequest(); diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyMapperTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyMapperTest.java new file mode 100644 index 0000000000..a0359b4484 --- /dev/null +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyMapperTest.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.alfa.forwarding; + +import static org.assertj.core.api.Assertions.*; + +import java.util.UUID; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mapstruct.factory.Mappers; + +import de.ozgcloud.alfa.collaboration.OrganisationsEinheitTestFactory; + +class ForwardVorgangCommandBodyMapperTest { + + private final ForwardVorgangCommandBodyMapper mapper = Mappers.getMapper(ForwardVorgangCommandBodyMapper.class); + + @Nested + class TestUpdateFromOrganisationsEinheit { + + private static final String ORGANISATIONS_EINHEIT_ID = UUID.randomUUID().toString(); + + private final ForwardVorgangCommandBody body = ForwardVorgangCommandBody.builder() + .organisationsEinheitId(ORGANISATIONS_EINHEIT_ID).build(); + + @Test + void shouldUpdateFromOrganisationsEinheit() { + mapper.updateFromOrganisationsEinheit(OrganisationsEinheitTestFactory.create(), body); + + assertThat(body).usingRecursiveComparison().ignoringFields("organisationsEinheitId") + .isEqualTo(ForwardVorgangCommandBodyTestFactory.create()); + } + + @Test + void shouldPreserveId() { + mapper.updateFromOrganisationsEinheit(OrganisationsEinheitTestFactory.create(), body); + + assertThat(body.getOrganisationsEinheitId()).isEqualTo(ORGANISATIONS_EINHEIT_ID); + } + } +} diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyTestFactory.java index ac8f4a4d34..3f36de6314 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyTestFactory.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyTestFactory.java @@ -23,6 +23,7 @@ */ package de.ozgcloud.alfa.forwarding; +import de.ozgcloud.alfa.collaboration.AnschriftTestFactory; import de.ozgcloud.alfa.collaboration.OrganisationsEinheitTestFactory; import de.ozgcloud.alfa.forwarding.ForwardVorgangCommandBody.ForwardVorgangCommandBodyBuilder; @@ -36,6 +37,9 @@ class ForwardVorgangCommandBodyTestFactory { return ForwardVorgangCommandBody.builder() .organisationsEinheitId(OrganisationsEinheitTestFactory.ID) .name(OrganisationsEinheitTestFactory.NAME) - .anschrift(OrganisationsEinheitTestFactory.ANSCHRIFT); + .strasse(AnschriftTestFactory.STRASSE) + .ort(AnschriftTestFactory.ORT) + .hausnummer(AnschriftTestFactory.HAUSNUMMER) + .plz(AnschriftTestFactory.PLZ); } } -- GitLab From 7dc714eb7b7bb4d74a823f2147ddf1a0cd019549 Mon Sep 17 00:00:00 2001 From: Krzysztof <krzysztof.witukiewicz@mgm-tp.com> Date: Mon, 10 Mar 2025 16:03:04 +0100 Subject: [PATCH 6/7] OZG-7501 OZG-7874 Simplify mapper --- .../alfa/forwarding/ForwardVorgangCommandBodyMapper.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyMapper.java b/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyMapper.java index f766f9e94b..3026ef0557 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyMapper.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyMapper.java @@ -33,9 +33,6 @@ import de.ozgcloud.alfa.collaboration.OrganisationsEinheit; interface ForwardVorgangCommandBodyMapper { @Mapping(target = "organisationsEinheitId", ignore = true) - @Mapping(target = "strasse", source = "anschrift.strasse") - @Mapping(target = "hausnummer", source = "anschrift.hausnummer") - @Mapping(target = "plz", source = "anschrift.plz") - @Mapping(target = "ort", source = "anschrift.ort") + @Mapping(target = ".", source = "anschrift") ForwardVorgangCommandBody updateFromOrganisationsEinheit(OrganisationsEinheit organisationsEinheit, @MappingTarget ForwardVorgangCommandBody commandBody); } -- GitLab From 0e3d53cca6749398e8744dc7fc4cc1407f8d8b58 Mon Sep 17 00:00:00 2001 From: Krzysztof <krzysztof.witukiewicz@mgm-tp.com> Date: Thu, 13 Mar 2025 14:07:25 +0100 Subject: [PATCH 7/7] OZG-7501 OZG-7874 Small refactorings --- .../OrganisationsEinheitController.java | 4 + .../ForwardByVorgangCommandController.java | 18 +-- .../forwarding/ForwardVorgangCommandBody.java | 2 +- .../ForwardVorgangCommandBodyMapper.java | 4 +- .../OrganisationsEinheitControllerTest.java | 21 ++++ ...ForwardByVorgangCommandControllerTest.java | 110 +++++++----------- .../ForwardVorgangCommandBodyMapperTest.java | 14 +-- .../ForwardVorgangCommandBodyTestFactory.java | 2 +- 8 files changed, 80 insertions(+), 95 deletions(-) diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/OrganisationsEinheitController.java b/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/OrganisationsEinheitController.java index bee8310c01..a67353b79b 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/OrganisationsEinheitController.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/OrganisationsEinheitController.java @@ -59,4 +59,8 @@ public class OrganisationsEinheitController { public CollectionModel<EntityModel<OrganisationsEinheitHeader>> search(@RequestParam String searchBy) { return headerModelAssembler.toCollectionModel(service.searchOrganisationsEinheiten(searchBy).toList()); } + + public OrganisationsEinheit getOrganisationEinheit(String organisationEinheitId) { + return service.getById(organisationEinheitId); + } } diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardByVorgangCommandController.java b/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardByVorgangCommandController.java index fb5224959e..046d5308e0 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardByVorgangCommandController.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardByVorgangCommandController.java @@ -32,12 +32,10 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import de.ozgcloud.alfa.collaboration.OrganisationsEinheit; import de.ozgcloud.alfa.collaboration.OrganisationsEinheitController; import de.ozgcloud.alfa.common.command.CommandController; import de.ozgcloud.alfa.common.command.CommandService; import de.ozgcloud.alfa.common.command.CreateCommand; -import de.ozgcloud.common.errorhandling.TechnicalException; import lombok.RequiredArgsConstructor; @RestController @@ -52,25 +50,19 @@ class ForwardByVorgangCommandController { @PostMapping public ResponseEntity<Void> createCommand(@PathVariable String vorgangId, @PathVariable long vorgangVersion, @RequestBody CreateCommand command) { - var body = (ForwardVorgangCommandBody) command.getBody(); + var completeBody = addOrganisationEinheitData((ForwardVorgangCommandBody) command.getBody()); var enrichedCommand = command.toBuilder() .vorgangId(vorgangId) .relationId(vorgangId) - .body(addOrganisationsEinheitData(getOrganisationsEinheitById(body.getOrganisationsEinheitId()), body)) + .body(completeBody) .build(); var created = commandService.createCommand(enrichedCommand, vorgangVersion); return ResponseEntity.created(linkTo(CommandController.class).slash(created.getId()).toUri()).build(); } - private OrganisationsEinheit getOrganisationsEinheitById(String id) { - var response = organisationsEinheitController.getById(id); - if (!response.getStatusCode().is2xxSuccessful() || response.getBody() == null) { - throw new TechnicalException("Could not get Organisationseinheit by id: " + id); - } - return response.getBody().getContent(); - } - private ForwardVorgangCommandBody addOrganisationsEinheitData(OrganisationsEinheit organisationsEinheit, ForwardVorgangCommandBody body) { - return bodyMapper.updateFromOrganisationsEinheit(organisationsEinheit, body); + private ForwardVorgangCommandBody addOrganisationEinheitData(ForwardVorgangCommandBody body) { + var organisationEinheit = organisationsEinheitController.getOrganisationEinheit(body.getOrganisationEinheitId()); + return bodyMapper.updateFromOrganisationEinheit(organisationEinheit, body); } } diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBody.java b/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBody.java index db96ddecb3..7770b4333d 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBody.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBody.java @@ -41,7 +41,7 @@ import lombok.Setter; public class ForwardVorgangCommandBody implements CommandBody { @JsonDeserialize(using = LinkedResourceDeserializer.class) - private String organisationsEinheitId; + private String organisationEinheitId; private String name; private String strasse; diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyMapper.java b/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyMapper.java index 3026ef0557..bd36a44d24 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyMapper.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyMapper.java @@ -32,7 +32,7 @@ import de.ozgcloud.alfa.collaboration.OrganisationsEinheit; @Mapper interface ForwardVorgangCommandBodyMapper { - @Mapping(target = "organisationsEinheitId", ignore = true) + @Mapping(target = "organisationEinheitId", ignore = true) @Mapping(target = ".", source = "anschrift") - ForwardVorgangCommandBody updateFromOrganisationsEinheit(OrganisationsEinheit organisationsEinheit, @MappingTarget ForwardVorgangCommandBody commandBody); + ForwardVorgangCommandBody updateFromOrganisationEinheit(OrganisationsEinheit organisationsEinheit, @MappingTarget ForwardVorgangCommandBody commandBody); } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/OrganisationsEinheitControllerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/OrganisationsEinheitControllerTest.java index 8f1efd6b99..32662710a9 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/OrganisationsEinheitControllerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/OrganisationsEinheitControllerTest.java @@ -23,6 +23,7 @@ */ package de.ozgcloud.alfa.collaboration; +import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @@ -256,4 +257,24 @@ class OrganisationsEinheitControllerTest { } } + @Nested + class TestGetOrganisationEinheit { + + @Test + void shouldCallService() { + controller.getOrganisationEinheit(OrganisationsEinheitTestFactory.ID); + + verify(service).getById(OrganisationsEinheitTestFactory.ID); + } + + @Test + void shouldReturnOrganisationEinheit() { + var organisationEinheitFromService = OrganisationsEinheitTestFactory.create(); + when(service.getById(any())).thenReturn(organisationEinheitFromService); + + var organisationsEinheit = controller.getOrganisationEinheit(OrganisationsEinheitTestFactory.ID); + + assertThat(organisationsEinheit).isSameAs(organisationEinheitFromService); + } + } } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardByVorgangCommandControllerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardByVorgangCommandControllerTest.java index 908bf70e6b..09eb98b0ab 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardByVorgangCommandControllerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardByVorgangCommandControllerTest.java @@ -37,10 +37,7 @@ import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; -import org.springframework.hateoas.EntityModel; -import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.setup.MockMvcBuilders; @@ -81,86 +78,57 @@ class ForwardByVorgangCommandControllerTest { @Nested class TestCreateCommand { + private final OrganisationsEinheit organisationsEinheit = OrganisationsEinheitTestFactory.create(); @Captor - private ArgumentCaptor<ForwardVorgangCommandBody> bodyCaptor; - - @Nested - class OnOrganisationsEinheitAvailable { - - private final OrganisationsEinheit organisationsEinheit = OrganisationsEinheitTestFactory.create(); - @Captor - private ArgumentCaptor<CreateCommand> commandCaptor; - - @BeforeEach - void init() { - when(organisationsEinheitController.getById(any())).thenReturn( - new ResponseEntity<>(EntityModel.of(organisationsEinheit), HttpStatus.OK)); - when(commandService.createCommand(any(), anyLong())).thenReturn(CommandTestFactory.create()); - when(bodyMapper.updateFromOrganisationsEinheit(any(), any())).thenReturn(ForwardVorgangCommandBodyTestFactory.create()); - } - - @Test - void shouldCallOrganisationsEinheitController() { - doRequest(); - - verify(organisationsEinheitController).getById(OrganisationsEinheitTestFactory.ID); - } - - @Test - void shouldAddOrganisationsEinheitData() { - doRequest(); - - verify(controller).createCommand(any(), anyLong(), commandCaptor.capture()); - verify(bodyMapper).updateFromOrganisationsEinheit(organisationsEinheit, (ForwardVorgangCommandBody) commandCaptor.getValue().getBody()); - } - - @Test - void shouldCallCommandService() { - doRequest(); + private ArgumentCaptor<CreateCommand> commandCaptor; + @Captor + private ArgumentCaptor<ForwardVorgangCommandBody> commandBodyCaptor; - verify(commandService).createCommand(commandCaptor.capture(), eq(VorgangHeaderTestFactory.VERSION)); - assertThat(commandCaptor.getValue()).usingRecursiveComparison().isEqualTo(CreateForwardVorgangCommandTestFactory.create()); - } + @BeforeEach + void init() { + when(organisationsEinheitController.getOrganisationEinheit(any())).thenReturn(organisationsEinheit); + when(commandService.createCommand(any(), anyLong())).thenReturn(CommandTestFactory.create()); + when(bodyMapper.updateFromOrganisationEinheit(any(), any())).thenReturn(ForwardVorgangCommandBodyTestFactory.create()); + } - @SneakyThrows - @Test - void shouldReturnCreated() { - var response = doRequest(); + @Test + void shouldCallOrganisationsEinheitController() { + doRequest(); - response.andExpect(status().isCreated()); - } + verify(organisationsEinheitController).getOrganisationEinheit(OrganisationsEinheitTestFactory.ID); + } - @SneakyThrows - @Test - void shouldReturnLinkToCreatedCommand() { - var response = doRequest(); + @Test + void shouldAddOrganisationsEinheitData() { + doRequest(); - response.andExpect(header().stringValues("location", "http://localhost" + COMMANDS_PATH + "/" + CommandTestFactory.ID)); - } + verify(bodyMapper).updateFromOrganisationEinheit(same(organisationsEinheit), commandBodyCaptor.capture()); + assertThat(commandBodyCaptor.getValue()).usingRecursiveComparison() + .isEqualTo(ForwardVorgangCommandBody.builder().organisationEinheitId(OrganisationsEinheitTestFactory.ID).build()); } - @Nested - class OnOrganisationsEinheitMissing { - - @SneakyThrows - @Test - void shouldReturnInternalServerErrorIfNotFound() { - when(organisationsEinheitController.getById(any())).thenReturn(new ResponseEntity<>(HttpStatus.NOT_FOUND)); + @Test + void shouldCallCommandService() { + doRequest(); - var response = doRequest(); + verify(commandService).createCommand(commandCaptor.capture(), eq(VorgangHeaderTestFactory.VERSION)); + assertThat(commandCaptor.getValue()).usingRecursiveComparison().isEqualTo(CreateForwardVorgangCommandTestFactory.create()); + } - response.andExpect(status().isInternalServerError()); - } + @SneakyThrows + @Test + void shouldReturnCreated() { + var response = doRequest(); - @SneakyThrows - @Test - void shouldReturnInternalServerErrorIfBodyIsEmpty() { - when(organisationsEinheitController.getById(any())).thenReturn(new ResponseEntity<>(null, HttpStatus.OK)); + response.andExpect(status().isCreated()); + } - var response = doRequest(); + @SneakyThrows + @Test + void shouldReturnLinkToCreatedCommand() { + var response = doRequest(); - response.andExpect(status().isInternalServerError()); - } + response.andExpect(header().stringValues("location", "http://localhost" + COMMANDS_PATH + "/" + CommandTestFactory.ID)); } @SneakyThrows @@ -173,7 +141,7 @@ class ForwardByVorgangCommandControllerTest { private String createContent() { return CommandTestFactory.buildCreateCommandWithBodyContent( CommandOrder.FORWARD_VORGANG, - "{\"organisationsEinheitId\":\"%s\"}".formatted(OrganisationsEinheitTestFactory.ID)); + "{\"organisationEinheitId\":\"%s\"}".formatted(OrganisationsEinheitTestFactory.ID)); } } } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyMapperTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyMapperTest.java index a0359b4484..084a164b9d 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyMapperTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyMapperTest.java @@ -38,26 +38,26 @@ class ForwardVorgangCommandBodyMapperTest { private final ForwardVorgangCommandBodyMapper mapper = Mappers.getMapper(ForwardVorgangCommandBodyMapper.class); @Nested - class TestUpdateFromOrganisationsEinheit { + class TestUpdateFromOrganisationEinheit { private static final String ORGANISATIONS_EINHEIT_ID = UUID.randomUUID().toString(); private final ForwardVorgangCommandBody body = ForwardVorgangCommandBody.builder() - .organisationsEinheitId(ORGANISATIONS_EINHEIT_ID).build(); + .organisationEinheitId(ORGANISATIONS_EINHEIT_ID).build(); @Test - void shouldUpdateFromOrganisationsEinheit() { - mapper.updateFromOrganisationsEinheit(OrganisationsEinheitTestFactory.create(), body); + void shouldUpdateFromOrganisationEinheit() { + mapper.updateFromOrganisationEinheit(OrganisationsEinheitTestFactory.create(), body); - assertThat(body).usingRecursiveComparison().ignoringFields("organisationsEinheitId") + assertThat(body).usingRecursiveComparison().ignoringFields("organisationEinheitId") .isEqualTo(ForwardVorgangCommandBodyTestFactory.create()); } @Test void shouldPreserveId() { - mapper.updateFromOrganisationsEinheit(OrganisationsEinheitTestFactory.create(), body); + mapper.updateFromOrganisationEinheit(OrganisationsEinheitTestFactory.create(), body); - assertThat(body.getOrganisationsEinheitId()).isEqualTo(ORGANISATIONS_EINHEIT_ID); + assertThat(body.getOrganisationEinheitId()).isEqualTo(ORGANISATIONS_EINHEIT_ID); } } } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyTestFactory.java index 3f36de6314..abf89a2543 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyTestFactory.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyTestFactory.java @@ -35,7 +35,7 @@ class ForwardVorgangCommandBodyTestFactory { static ForwardVorgangCommandBodyBuilder createBuilder() { return ForwardVorgangCommandBody.builder() - .organisationsEinheitId(OrganisationsEinheitTestFactory.ID) + .organisationEinheitId(OrganisationsEinheitTestFactory.ID) .name(OrganisationsEinheitTestFactory.NAME) .strasse(AnschriftTestFactory.STRASSE) .ort(AnschriftTestFactory.ORT) -- GitLab