diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/EnvironmentController.java b/alfa-service/src/main/java/de/ozgcloud/alfa/EnvironmentController.java index 9dda134b2ea6580936e80d068055309175b645ce..b18d3421b4e18bcc9329a453f6a503537c667b51 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/EnvironmentController.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/EnvironmentController.java @@ -25,30 +25,44 @@ package de.ozgcloud.alfa; import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; +import java.util.List; + import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import de.ozgcloud.alfa.vorgang.VorgangProperties; +import de.ozgcloud.alfa.vorgang.VorgangProperties.VorgangProperty; + @RestController -@RequestMapping("/api/environment") +@RequestMapping(EnvironmentController.PREFIX) public class EnvironmentController { + + static final String PREFIX = "/api/environment"; @Autowired private OAuth2Properties oAuth2Properties; - @Value("${goofy.production}") - private boolean production = true; + @Autowired + private GoofyProperties goofyProperties; + + @Autowired + private VorgangProperties vorgangProperties; @GetMapping public FrontendEnvironment getFrontendEnvironment() { return FrontendEnvironment.builder() - .production(production) + .production(goofyProperties.isProduction()) .remoteHost(linkTo(RootController.class).toUri().toString()) .authServer(oAuth2Properties.getAuthServerUrl()) .clientId(oAuth2Properties.getResource()) .realm(oAuth2Properties.getRealm()) + .processorNames(getProcessorNames()) .build(); } + + private List<String> getProcessorNames() { + return vorgangProperties.getAnalogButtonProcessor().stream().map(VorgangProperty::getFormId).toList(); + } } \ No newline at end of file diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/FrontendEnvironment.java b/alfa-service/src/main/java/de/ozgcloud/alfa/FrontendEnvironment.java index d380547186666d7e70155b0fe72145e2c9b818ee..218f2f1f4732c4bb0b856403f9fd0e8b9eafec73 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/FrontendEnvironment.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/FrontendEnvironment.java @@ -23,6 +23,8 @@ */ package de.ozgcloud.alfa; +import java.util.List; + import lombok.Builder; import lombok.Getter; @@ -35,4 +37,5 @@ public class FrontendEnvironment { private String authServer; private String realm; private String clientId; + private List<String> processorNames; } diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/GoofyProperties.java b/alfa-service/src/main/java/de/ozgcloud/alfa/GoofyProperties.java new file mode 100644 index 0000000000000000000000000000000000000000..8af46660ac3fbf48a9d27bae0b1dad8fe927a2d4 --- /dev/null +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/GoofyProperties.java @@ -0,0 +1,22 @@ +package de.ozgcloud.alfa; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Configuration +@ConfigurationProperties(prefix = GoofyProperties.PREFIX) +class GoofyProperties { + + static final String PREFIX = "goofy"; + + /** + * Set production mode. + */ + private boolean production = true; + +} 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 26dba360939dae95de5ea084c47b66d51b6d48ad..b013c2631377384cbcd3f276e0dda3a3b1bdd396 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 @@ -31,6 +31,7 @@ import de.ozgcloud.alfa.loeschanforderung.DeleteLoeschAnforderung; import de.ozgcloud.alfa.loeschanforderung.LoeschAnforderung; import de.ozgcloud.alfa.postfach.PostfachMail; import de.ozgcloud.alfa.vorgang.AssignUserCommandBody; +import de.ozgcloud.alfa.vorgang.ExecuteProcessorBody; import de.ozgcloud.alfa.vorgang.forwarding.RedirectRequest; import de.ozgcloud.alfa.wiedervorlage.Wiedervorlage; @@ -44,7 +45,8 @@ import de.ozgcloud.alfa.wiedervorlage.Wiedervorlage; @Type(value = Kommentar.class, name = "KOMMENTAR"), @Type(value = LoeschAnforderung.class, name = "LOESCH_ANFORDERUNG"), @Type(value = DeleteLoeschAnforderung.class, name = "DELETE_LOESCH_ANFORDERUNG"), - @Type(value = GenericCommandBody.class, name = "CREATE_BESCHEID") + @Type(value = GenericCommandBody.class, name = "CREATE_BESCHEID"), + @Type(value = ExecuteProcessorBody.class, name = "EXECUTE_PROCESSOR") }) public interface CommandBody { } diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/ExecuteProcessorBody.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/ExecuteProcessorBody.java new file mode 100644 index 0000000000000000000000000000000000000000..f5fe156c97e087c5a9c7a2623674e4e067085f3b --- /dev/null +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/ExecuteProcessorBody.java @@ -0,0 +1,13 @@ +package de.ozgcloud.alfa.vorgang; + +import java.util.ArrayList; + +import de.ozgcloud.alfa.common.command.CommandBody; +import lombok.Getter; + +@Getter +public class ExecuteProcessorBody implements CommandBody { + + private ArrayList<String> processorNames; + +} \ No newline at end of file diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangProperties.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangProperties.java index 5ab1498cd82c7a9ad66eb6cf0d533b442d3463a0..2140099e72633cdd29c9873ff9b425f4bbe4da3c 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangProperties.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangProperties.java @@ -14,7 +14,7 @@ import lombok.Setter; @Setter @Configuration @ConfigurationProperties(prefix = VorgangProperties.PREFIX) -class VorgangProperties { +public class VorgangProperties { static final String PREFIX = "ozgcloud.vorgang"; @@ -31,7 +31,7 @@ class VorgangProperties { @Builder @Setter @Getter - static class VorgangProperty { + public static class VorgangProperty { private String formId; private String formEngineName; diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/EnvironmentControllerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/EnvironmentControllerTest.java index 7ef79567ddc28f389673dc545eab8832d6f26916..21f04f747ad386b7b89381187c1d2337352fd8ef 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/EnvironmentControllerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/EnvironmentControllerTest.java @@ -27,6 +27,8 @@ import static org.mockito.Mockito.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; +import java.util.List; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; @@ -35,16 +37,21 @@ 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.vorgang.EingangHeaderTestFactory; +import de.ozgcloud.alfa.vorgang.VorgangProperties; +import de.ozgcloud.alfa.vorgang.VorgangPropertyTestFactory; import lombok.SneakyThrows; class EnvironmentControllerTest { - private final String PATH = "/api/environment"; - @InjectMocks private EnvironmentController controller; @Mock private OAuth2Properties oAuth2Properties; + @Mock + private GoofyProperties goofyProperties; + @Mock + private VorgangProperties vorgangProperties; private MockMvc mockMvc; @@ -53,31 +60,47 @@ class EnvironmentControllerTest { mockMvc = MockMvcBuilders.standaloneSetup(controller).build(); } + @SneakyThrows @Test - void shouldReturnOk() throws Exception { + void shouldReturnOk() { var response = doRequest(); response.andExpect(status().isOk()); } + @SneakyThrows @Test - void shouldHaveProductionTrueAsDefault() throws Exception { + void shouldHaveProductionTrueAsDefault() { + when(goofyProperties.isProduction()).thenReturn(true); + var response = doRequest(); response.andExpect(jsonPath("$.production").value(true)); } + @SneakyThrows @Test - void shouldHaveClientId() throws Exception { + void shouldHaveClientId() { var client = "goofy"; when(oAuth2Properties.getResource()).thenReturn(client); + var response = doRequest(); response.andExpect(jsonPath("$.clientId").value(client)); } + + @SneakyThrows + @Test + void shouldHaveProcessorNames() { + when(vorgangProperties.getAnalogButtonProcessor()).thenReturn(List.of(VorgangPropertyTestFactory.create())); + + var response = doRequest(); + + response.andExpect(jsonPath("$.processorNames").value(EingangHeaderTestFactory.FORM_ID)); + } @SneakyThrows private ResultActions doRequest() { - return mockMvc.perform(get(PATH)); + return mockMvc.perform(get(EnvironmentController.PREFIX)); } } \ No newline at end of file diff --git a/goofy-client/libs/environment-shared/src/lib/environment.model.ts b/goofy-client/libs/environment-shared/src/lib/environment.model.ts index c615af927b747ff836e6346e52ceda1c9ce5ea4b..cd84fed8493b327833052aedb4ca235805c7b590 100644 --- a/goofy-client/libs/environment-shared/src/lib/environment.model.ts +++ b/goofy-client/libs/environment-shared/src/lib/environment.model.ts @@ -28,5 +28,6 @@ export interface Environment { remoteHost: ResourceUri, authServer: string, realm: string, - clientId: string + clientId: string, + processorNames: string[] } diff --git a/goofy-client/libs/environment-shared/test/environment.ts b/goofy-client/libs/environment-shared/test/environment.ts index 39522ad0bed2ae7143c75f8eccbe4d5dc70a061e..d79cfdc39ebb8a6130d49be057e7367dda4ea256 100644 --- a/goofy-client/libs/environment-shared/test/environment.ts +++ b/goofy-client/libs/environment-shared/test/environment.ts @@ -25,14 +25,13 @@ import { faker } from '@faker-js/faker'; import { cloneDeep } from 'lodash-es'; import { Environment } from '../src/lib/environment.model'; -const baseUrl = faker.internet.url(); - const environment: Environment = { production: false, - remoteHost: baseUrl, + remoteHost: faker.internet.url(), authServer: faker.internet.url(), realm: faker.random.word(), - clientId: faker.datatype.uuid() + clientId: faker.datatype.uuid(), + processorNames: [faker.name.findName()] }; export function createEnvironment(): Environment { diff --git a/goofy-client/libs/vorgang-shared/src/lib/vorgang.service.spec.ts b/goofy-client/libs/vorgang-shared/src/lib/vorgang.service.spec.ts index f95f807e9c51a5ec3e46d6777b8edd3da2a05f14..d5096557c75694ea9552b195ef0aeaba52d15dc6 100644 --- a/goofy-client/libs/vorgang-shared/src/lib/vorgang.service.spec.ts +++ b/goofy-client/libs/vorgang-shared/src/lib/vorgang.service.spec.ts @@ -25,6 +25,7 @@ import { HttpErrorResponse } from '@angular/common/http'; import { ApiRootLinkRel, ApiRootResource, ApiRootService } from '@goofy-client/api-root-shared'; import { BinaryFileListResource } from '@goofy-client/binary-file-shared'; import { CommandOrder, CommandResource, CommandService, CreateCommandProps } from '@goofy-client/command-shared'; +import { Environment } from '@goofy-client/environment-shared'; import { NavigationService } from '@goofy-client/navigation-shared'; import { EMPTY_STRING, StateResource, createEmptyStateResource, createStateResource } from '@goofy-client/tech-shared'; import { Mock, mock, useFromMock } from '@goofy-client/test-utils'; @@ -51,17 +52,17 @@ describe('VorgangService', () => { let facade: Mock<VorgangFacade>; let apiRootService: Mock<ApiRootService>; let commandService: Mock<CommandService>; + let envConfig: Environment = <any>{ processorNames: ['dummyProcessorName'] }; beforeEach(() => { navigationService = { ...mock(NavigationService) }; facade = mock(VorgangFacade); apiRootService = mock(ApiRootService); commandService = mock(CommandService); - navigationService.urlChanged = jest.fn(); navigationService.urlChanged.mockReturnValue(of({})); - service = new VorgangService(useFromMock(navigationService), useFromMock(facade), useFromMock(apiRootService), useFromMock(commandService)); + service = new VorgangService(useFromMock(navigationService), useFromMock(facade), useFromMock(apiRootService), useFromMock(commandService), envConfig); }) const vorgangWithEingang: VorgangWithEingangResource = createVorgangWithEingangResource(); @@ -499,7 +500,7 @@ describe('VorgangService', () => { it('should call commandService', () => { service.executeProcessor(vorgangWithEingang); - const expectedProps: CreateCommandProps = { resource: vorgangWithEingang, linkRel: VorgangWithEingangLinkRel.EXECUTE_PROCESSOR, command: { order: CommandOrder.EXECUTE_PROCESSOR, body: null }}; + const expectedProps: CreateCommandProps = { resource: vorgangWithEingang, linkRel: VorgangWithEingangLinkRel.EXECUTE_PROCESSOR, command: { order: CommandOrder.EXECUTE_PROCESSOR, body: { processorNames: ['dummyProcessorName']} }}; expect(commandService.createCommandByOrder).toHaveBeenCalledWith(expectedProps); }) }) diff --git a/goofy-client/libs/vorgang-shared/src/lib/vorgang.service.ts b/goofy-client/libs/vorgang-shared/src/lib/vorgang.service.ts index e7a33cf2698c3acdeea44f247bb9cd25778ded09..bc5d1ea187b1ddfff41be226126c75dcfb7e5623 100644 --- a/goofy-client/libs/vorgang-shared/src/lib/vorgang.service.ts +++ b/goofy-client/libs/vorgang-shared/src/lib/vorgang.service.ts @@ -21,10 +21,11 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { Injectable } from '@angular/core'; +import { Inject, Injectable } from '@angular/core'; import { ApiRootService } from '@goofy-client/api-root-shared'; import { BinaryFileListResource } from '@goofy-client/binary-file-shared'; import { CommandOrder, CommandResource, CommandService, CreateCommandProps } from '@goofy-client/command-shared'; +import { ENVIRONMENT_CONFIG, Environment } from '@goofy-client/environment-shared'; import { NavigationService } from '@goofy-client/navigation-shared'; import { StateResource, createEmptyStateResource, doIfLoadingRequired, isNotNull } from '@goofy-client/tech-shared'; import { ResourceUri, getUrl, hasLink } from '@ngxp/rest'; @@ -42,7 +43,12 @@ export class VorgangService { public static readonly VORGANG_WITH_EINGANG_URL: string = 'vorgangWithEingangUrl'; - constructor(private navigationService: NavigationService, private facade: VorgangFacade, private apiRootService: ApiRootService, private commandService: CommandService) { } + constructor( + private navigationService: NavigationService, + private facade: VorgangFacade, + private apiRootService: ApiRootService, + private commandService: CommandService, + @Inject(ENVIRONMENT_CONFIG) private envConfig: Environment) { } public getVorgangWithEingang(): Observable<StateResource<VorgangWithEingangResource>> { return combineLatest([this.facade.getVorgangWithEingang(), this.apiRootService.getApiRoot()]).pipe( @@ -160,6 +166,6 @@ export class VorgangService { } private createExecuteProcessorCommandProps(vorgangWithEingang: VorgangWithEingangResource): CreateCommandProps { - return { resource: vorgangWithEingang, linkRel: VorgangWithEingangLinkRel.EXECUTE_PROCESSOR, command: createExecuteProcessorCommand() }; + return { resource: vorgangWithEingang, linkRel: VorgangWithEingangLinkRel.EXECUTE_PROCESSOR, command: createExecuteProcessorCommand(this.envConfig.processorNames) }; } } diff --git a/goofy-client/libs/vorgang-shared/src/lib/vorgang.util.spec.ts b/goofy-client/libs/vorgang-shared/src/lib/vorgang.util.spec.ts index de2fa7f2de46d79f63537f6bab05ef0abe1ea5ab..64851923696696f476b984243c567b40d6a9e3fd 100644 --- a/goofy-client/libs/vorgang-shared/src/lib/vorgang.util.spec.ts +++ b/goofy-client/libs/vorgang-shared/src/lib/vorgang.util.spec.ts @@ -134,9 +134,19 @@ describe('VorgangUtil', () => { describe('create createExecuteProcessCommand', () => { it('should have order', () => { - const command: CreateCommand = createExecuteProcessorCommand(); + const processorNames: string[] = ['dummyProcessorName']; + + const command: CreateCommand = createExecuteProcessorCommand(processorNames); expect(command.order).toBe(CommandOrder.EXECUTE_PROCESSOR); }) + + it('should have processorNames', () => { + const processorNames: string[] = ['dummyProcessorName']; + + const command: CreateCommand = createExecuteProcessorCommand(processorNames); + + expect(command.body.processorNames).toBe(processorNames); + }) }) }) \ No newline at end of file diff --git a/goofy-client/libs/vorgang-shared/src/lib/vorgang.util.ts b/goofy-client/libs/vorgang-shared/src/lib/vorgang.util.ts index a32e1815957a773186b77b9082b76ba20724c322..29da08c2f2ad053320c14160b6a547efa818eef5 100644 --- a/goofy-client/libs/vorgang-shared/src/lib/vorgang.util.ts +++ b/goofy-client/libs/vorgang-shared/src/lib/vorgang.util.ts @@ -94,6 +94,6 @@ export function isAssignUserCommand(order: CommandOrder): boolean { return order === CommandOrder.ASSIGN_USER; } -export function createExecuteProcessorCommand(): CreateCommand { - return { order: CommandOrder.EXECUTE_PROCESSOR, body: null }; //TODO OZG-4514 +export function createExecuteProcessorCommand(processorNames: string[]): CreateCommand { + return { order: CommandOrder.EXECUTE_PROCESSOR, body: { processorNames } }; } \ No newline at end of file