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