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 231090b96c06be539ba68fe68213163869d49202..96b2d58709780761d8bbc82baa57bd18d781e928 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 aeccb1786c7795171c5a65a07674a5cb36484512..56e5510b8ada0b536e60a9f8e215f5d509124843 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 911717902889dfc59197573842a89151a6792c83..a67353b79b2ba863b703a37775fe7c647edfd917 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"; @@ -59,4 +59,8 @@ 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/collaboration/OrganisationsEinheitHeader.java b/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/OrganisationsEinheitHeader.java index b62a4788a8fd963365a2e7e3833572917297a816..ab2b3b4c6a2e8e3efcbbcf636cc11ef7946e6f4d 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 46db2e9b657a09f9d98f4a25c77d800a07cdba1b..1f288483dc782a92baade909ff64f582c2ae53f9 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 5e97b02673c16a2ada39fd7c79ee931507668d46..2abd4dff45e34fa26b3dd6f023fa0023da3f23f8 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.FORWARDING), + 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 0000000000000000000000000000000000000000..046d5308e00596afca7a6383ec77b80a5455fea2 --- /dev/null +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardByVorgangCommandController.java @@ -0,0 +1,68 @@ +/* + * 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.OrganisationsEinheitController; +import de.ozgcloud.alfa.common.command.CommandController; +import de.ozgcloud.alfa.common.command.CommandService; +import de.ozgcloud.alfa.common.command.CreateCommand; +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; + private final ForwardVorgangCommandBodyMapper bodyMapper; + + @PostMapping + public ResponseEntity<Void> createCommand(@PathVariable String vorgangId, @PathVariable long vorgangVersion, @RequestBody CreateCommand command) { + var completeBody = addOrganisationEinheitData((ForwardVorgangCommandBody) command.getBody()); + var enrichedCommand = command.toBuilder() + .vorgangId(vorgangId) + .relationId(vorgangId) + .body(completeBody) + .build(); + var created = commandService.createCommand(enrichedCommand, vorgangVersion); + return ResponseEntity.created(linkTo(CommandController.class).slash(created.getId()).toUri()).build(); + } + + + 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 new file mode 100644 index 0000000000000000000000000000000000000000..7770b4333db7c66abdccac117a2fc155a78c0997 --- /dev/null +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBody.java @@ -0,0 +1,51 @@ +/* + * 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.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 +public class ForwardVorgangCommandBody implements CommandBody { + + @JsonDeserialize(using = LinkedResourceDeserializer.class) + private String organisationEinheitId; + + private String name; + 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 0000000000000000000000000000000000000000..bd36a44d244b5e355044ce4a4783ba4e6afd0fb6 --- /dev/null +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyMapper.java @@ -0,0 +1,38 @@ +/* + * 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 = "organisationEinheitId", ignore = true) + @Mapping(target = ".", source = "anschrift") + ForwardVorgangCommandBody updateFromOrganisationEinheit(OrganisationsEinheit organisationsEinheit, @MappingTarget ForwardVorgangCommandBody commandBody); +} 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 863d725f77977266b1ce78f38d075283e4993083..fdb1d9cf0266b2d0ff8ca9f3594dd4164f9b9139 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; @@ -70,7 +69,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/collaboration/OrganisationsEinheitControllerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/OrganisationsEinheitControllerTest.java index 8f1efd6b991fc2f5649f58359da0cf0d6941c2fb..32662710a920068da9e44cb896f4b47fe9f5f2bc 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/common/command/CommandModelAssemblerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandModelAssemblerTest.java index cdc84e3c2bb10c6620376542e304399ff8ea0cfb..bd98a6b0274afd52ed736ae3a742674401ff45ca 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/CreateForwardVorgangCommandTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/CreateForwardVorgangCommandTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..077816660e80ee50cc565e12efcc0c6215071f66 --- /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 0000000000000000000000000000000000000000..09eb98b0ab8cb795ca8b6a73595913edde158cc3 --- /dev/null +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardByVorgangCommandControllerTest.java @@ -0,0 +1,147 @@ +/* + * 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.http.MediaType; +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; +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 lombok.SneakyThrows; + +class ForwardByVorgangCommandControllerTest { + + @Mock + private CommandService commandService; + @Mock + private OrganisationsEinheitController organisationsEinheitController; + @Mock + private ForwardVorgangCommandBodyMapper bodyMapper; + @Mock + private ProblemDetailMapper problemDetailMapper; + @Spy + @InjectMocks + private ForwardByVorgangCommandController controller; + + private MockMvc mockMvc; + + @BeforeEach + void init() { + mockMvc = MockMvcBuilders.standaloneSetup(controller).setControllerAdvice(new ExceptionController(problemDetailMapper)).build(); + } + + @Nested + class TestCreateCommand { + + private final OrganisationsEinheit organisationsEinheit = OrganisationsEinheitTestFactory.create(); + @Captor + private ArgumentCaptor<CreateCommand> commandCaptor; + @Captor + private ArgumentCaptor<ForwardVorgangCommandBody> commandBodyCaptor; + + @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()); + } + + @Test + void shouldCallOrganisationsEinheitController() { + doRequest(); + + verify(organisationsEinheitController).getOrganisationEinheit(OrganisationsEinheitTestFactory.ID); + } + + @Test + void shouldAddOrganisationsEinheitData() { + doRequest(); + + verify(bodyMapper).updateFromOrganisationEinheit(same(organisationsEinheit), commandBodyCaptor.capture()); + assertThat(commandBodyCaptor.getValue()).usingRecursiveComparison() + .isEqualTo(ForwardVorgangCommandBody.builder().organisationEinheitId(OrganisationsEinheitTestFactory.ID).build()); + } + + @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)); + } + + @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, + "{\"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 new file mode 100644 index 0000000000000000000000000000000000000000..084a164b9dc5098685ce77e7af4e2a03f96c59f8 --- /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 TestUpdateFromOrganisationEinheit { + + private static final String ORGANISATIONS_EINHEIT_ID = UUID.randomUUID().toString(); + + private final ForwardVorgangCommandBody body = ForwardVorgangCommandBody.builder() + .organisationEinheitId(ORGANISATIONS_EINHEIT_ID).build(); + + @Test + void shouldUpdateFromOrganisationEinheit() { + mapper.updateFromOrganisationEinheit(OrganisationsEinheitTestFactory.create(), body); + + assertThat(body).usingRecursiveComparison().ignoringFields("organisationEinheitId") + .isEqualTo(ForwardVorgangCommandBodyTestFactory.create()); + } + + @Test + void shouldPreserveId() { + mapper.updateFromOrganisationEinheit(OrganisationsEinheitTestFactory.create(), body); + + 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 new file mode 100644 index 0000000000000000000000000000000000000000..abf89a2543920bfa2a5116a356a60bb7ab18e2d9 --- /dev/null +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyTestFactory.java @@ -0,0 +1,45 @@ +/* + * 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.AnschriftTestFactory; +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() + .organisationEinheitId(OrganisationsEinheitTestFactory.ID) + .name(OrganisationsEinheitTestFactory.NAME) + .strasse(AnschriftTestFactory.STRASSE) + .ort(AnschriftTestFactory.ORT) + .hausnummer(AnschriftTestFactory.HAUSNUMMER) + .plz(AnschriftTestFactory.PLZ); + } +} 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 2b480261858a77629a4036c3d29c6da52a452aa0..551f863ef0902690c89c3068ffcbe1612b71adb6 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));