Skip to content
Snippets Groups Projects
Commit 1b5b882a authored by OZGCloud's avatar OZGCloud
Browse files

OZG-4461 OZG-4509 add processorNames to command request

parent 8bc5fbcb
No related branches found
No related tags found
No related merge requests found
Showing
with 122 additions and 28 deletions
...@@ -25,30 +25,44 @@ package de.ozgcloud.alfa; ...@@ -25,30 +25,44 @@ package de.ozgcloud.alfa;
import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; 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.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import de.ozgcloud.alfa.vorgang.VorgangProperties;
import de.ozgcloud.alfa.vorgang.VorgangProperties.VorgangProperty;
@RestController @RestController
@RequestMapping("/api/environment") @RequestMapping(EnvironmentController.PREFIX)
public class EnvironmentController { public class EnvironmentController {
static final String PREFIX = "/api/environment";
@Autowired @Autowired
private OAuth2Properties oAuth2Properties; private OAuth2Properties oAuth2Properties;
@Value("${goofy.production}") @Autowired
private boolean production = true; private GoofyProperties goofyProperties;
@Autowired
private VorgangProperties vorgangProperties;
@GetMapping @GetMapping
public FrontendEnvironment getFrontendEnvironment() { public FrontendEnvironment getFrontendEnvironment() {
return FrontendEnvironment.builder() return FrontendEnvironment.builder()
.production(production) .production(goofyProperties.isProduction())
.remoteHost(linkTo(RootController.class).toUri().toString()) .remoteHost(linkTo(RootController.class).toUri().toString())
.authServer(oAuth2Properties.getAuthServerUrl()) .authServer(oAuth2Properties.getAuthServerUrl())
.clientId(oAuth2Properties.getResource()) .clientId(oAuth2Properties.getResource())
.realm(oAuth2Properties.getRealm()) .realm(oAuth2Properties.getRealm())
.processorNames(getProcessorNames())
.build(); .build();
} }
private List<String> getProcessorNames() {
return vorgangProperties.getAnalogButtonProcessor().stream().map(VorgangProperty::getFormId).toList();
}
} }
\ No newline at end of file
...@@ -23,6 +23,8 @@ ...@@ -23,6 +23,8 @@
*/ */
package de.ozgcloud.alfa; package de.ozgcloud.alfa;
import java.util.List;
import lombok.Builder; import lombok.Builder;
import lombok.Getter; import lombok.Getter;
...@@ -35,4 +37,5 @@ public class FrontendEnvironment { ...@@ -35,4 +37,5 @@ public class FrontendEnvironment {
private String authServer; private String authServer;
private String realm; private String realm;
private String clientId; private String clientId;
private List<String> processorNames;
} }
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;
}
...@@ -31,6 +31,7 @@ import de.ozgcloud.alfa.loeschanforderung.DeleteLoeschAnforderung; ...@@ -31,6 +31,7 @@ import de.ozgcloud.alfa.loeschanforderung.DeleteLoeschAnforderung;
import de.ozgcloud.alfa.loeschanforderung.LoeschAnforderung; import de.ozgcloud.alfa.loeschanforderung.LoeschAnforderung;
import de.ozgcloud.alfa.postfach.PostfachMail; import de.ozgcloud.alfa.postfach.PostfachMail;
import de.ozgcloud.alfa.vorgang.AssignUserCommandBody; import de.ozgcloud.alfa.vorgang.AssignUserCommandBody;
import de.ozgcloud.alfa.vorgang.ExecuteProcessorBody;
import de.ozgcloud.alfa.vorgang.forwarding.RedirectRequest; import de.ozgcloud.alfa.vorgang.forwarding.RedirectRequest;
import de.ozgcloud.alfa.wiedervorlage.Wiedervorlage; import de.ozgcloud.alfa.wiedervorlage.Wiedervorlage;
...@@ -44,7 +45,8 @@ import de.ozgcloud.alfa.wiedervorlage.Wiedervorlage; ...@@ -44,7 +45,8 @@ import de.ozgcloud.alfa.wiedervorlage.Wiedervorlage;
@Type(value = Kommentar.class, name = "KOMMENTAR"), @Type(value = Kommentar.class, name = "KOMMENTAR"),
@Type(value = LoeschAnforderung.class, name = "LOESCH_ANFORDERUNG"), @Type(value = LoeschAnforderung.class, name = "LOESCH_ANFORDERUNG"),
@Type(value = DeleteLoeschAnforderung.class, name = "DELETE_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 { public interface CommandBody {
} }
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
...@@ -14,7 +14,7 @@ import lombok.Setter; ...@@ -14,7 +14,7 @@ import lombok.Setter;
@Setter @Setter
@Configuration @Configuration
@ConfigurationProperties(prefix = VorgangProperties.PREFIX) @ConfigurationProperties(prefix = VorgangProperties.PREFIX)
class VorgangProperties { public class VorgangProperties {
static final String PREFIX = "ozgcloud.vorgang"; static final String PREFIX = "ozgcloud.vorgang";
...@@ -31,7 +31,7 @@ class VorgangProperties { ...@@ -31,7 +31,7 @@ class VorgangProperties {
@Builder @Builder
@Setter @Setter
@Getter @Getter
static class VorgangProperty { public static class VorgangProperty {
private String formId; private String formId;
private String formEngineName; private String formEngineName;
......
...@@ -27,6 +27,8 @@ import static org.mockito.Mockito.*; ...@@ -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.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import java.util.List;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks; import org.mockito.InjectMocks;
...@@ -35,16 +37,21 @@ import org.springframework.test.web.servlet.MockMvc; ...@@ -35,16 +37,21 @@ import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.setup.MockMvcBuilders; 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; import lombok.SneakyThrows;
class EnvironmentControllerTest { class EnvironmentControllerTest {
private final String PATH = "/api/environment";
@InjectMocks @InjectMocks
private EnvironmentController controller; private EnvironmentController controller;
@Mock @Mock
private OAuth2Properties oAuth2Properties; private OAuth2Properties oAuth2Properties;
@Mock
private GoofyProperties goofyProperties;
@Mock
private VorgangProperties vorgangProperties;
private MockMvc mockMvc; private MockMvc mockMvc;
...@@ -53,31 +60,47 @@ class EnvironmentControllerTest { ...@@ -53,31 +60,47 @@ class EnvironmentControllerTest {
mockMvc = MockMvcBuilders.standaloneSetup(controller).build(); mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
} }
@SneakyThrows
@Test @Test
void shouldReturnOk() throws Exception { void shouldReturnOk() {
var response = doRequest(); var response = doRequest();
response.andExpect(status().isOk()); response.andExpect(status().isOk());
} }
@SneakyThrows
@Test @Test
void shouldHaveProductionTrueAsDefault() throws Exception { void shouldHaveProductionTrueAsDefault() {
when(goofyProperties.isProduction()).thenReturn(true);
var response = doRequest(); var response = doRequest();
response.andExpect(jsonPath("$.production").value(true)); response.andExpect(jsonPath("$.production").value(true));
} }
@SneakyThrows
@Test @Test
void shouldHaveClientId() throws Exception { void shouldHaveClientId() {
var client = "goofy"; var client = "goofy";
when(oAuth2Properties.getResource()).thenReturn(client); when(oAuth2Properties.getResource()).thenReturn(client);
var response = doRequest(); var response = doRequest();
response.andExpect(jsonPath("$.clientId").value(client)); 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 @SneakyThrows
private ResultActions doRequest() { private ResultActions doRequest() {
return mockMvc.perform(get(PATH)); return mockMvc.perform(get(EnvironmentController.PREFIX));
} }
} }
\ No newline at end of file
...@@ -28,5 +28,6 @@ export interface Environment { ...@@ -28,5 +28,6 @@ export interface Environment {
remoteHost: ResourceUri, remoteHost: ResourceUri,
authServer: string, authServer: string,
realm: string, realm: string,
clientId: string clientId: string,
processorNames: string[]
} }
...@@ -25,14 +25,13 @@ import { faker } from '@faker-js/faker'; ...@@ -25,14 +25,13 @@ import { faker } from '@faker-js/faker';
import { cloneDeep } from 'lodash-es'; import { cloneDeep } from 'lodash-es';
import { Environment } from '../src/lib/environment.model'; import { Environment } from '../src/lib/environment.model';
const baseUrl = faker.internet.url();
const environment: Environment = { const environment: Environment = {
production: false, production: false,
remoteHost: baseUrl, remoteHost: faker.internet.url(),
authServer: faker.internet.url(), authServer: faker.internet.url(),
realm: faker.random.word(), realm: faker.random.word(),
clientId: faker.datatype.uuid() clientId: faker.datatype.uuid(),
processorNames: [faker.name.findName()]
}; };
export function createEnvironment(): Environment { export function createEnvironment(): Environment {
......
...@@ -25,6 +25,7 @@ import { HttpErrorResponse } from '@angular/common/http'; ...@@ -25,6 +25,7 @@ import { HttpErrorResponse } from '@angular/common/http';
import { ApiRootLinkRel, ApiRootResource, ApiRootService } from '@goofy-client/api-root-shared'; import { ApiRootLinkRel, ApiRootResource, ApiRootService } from '@goofy-client/api-root-shared';
import { BinaryFileListResource } from '@goofy-client/binary-file-shared'; import { BinaryFileListResource } from '@goofy-client/binary-file-shared';
import { CommandOrder, CommandResource, CommandService, CreateCommandProps } from '@goofy-client/command-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 { NavigationService } from '@goofy-client/navigation-shared';
import { EMPTY_STRING, StateResource, createEmptyStateResource, createStateResource } from '@goofy-client/tech-shared'; import { EMPTY_STRING, StateResource, createEmptyStateResource, createStateResource } from '@goofy-client/tech-shared';
import { Mock, mock, useFromMock } from '@goofy-client/test-utils'; import { Mock, mock, useFromMock } from '@goofy-client/test-utils';
...@@ -51,17 +52,17 @@ describe('VorgangService', () => { ...@@ -51,17 +52,17 @@ describe('VorgangService', () => {
let facade: Mock<VorgangFacade>; let facade: Mock<VorgangFacade>;
let apiRootService: Mock<ApiRootService>; let apiRootService: Mock<ApiRootService>;
let commandService: Mock<CommandService>; let commandService: Mock<CommandService>;
let envConfig: Environment = <any>{ processorNames: ['dummyProcessorName'] };
beforeEach(() => { beforeEach(() => {
navigationService = { ...mock(NavigationService) }; navigationService = { ...mock(NavigationService) };
facade = mock(VorgangFacade); facade = mock(VorgangFacade);
apiRootService = mock(ApiRootService); apiRootService = mock(ApiRootService);
commandService = mock(CommandService); commandService = mock(CommandService);
navigationService.urlChanged = jest.fn(); navigationService.urlChanged = jest.fn();
navigationService.urlChanged.mockReturnValue(of({})); 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(); const vorgangWithEingang: VorgangWithEingangResource = createVorgangWithEingangResource();
...@@ -499,7 +500,7 @@ describe('VorgangService', () => { ...@@ -499,7 +500,7 @@ describe('VorgangService', () => {
it('should call commandService', () => { it('should call commandService', () => {
service.executeProcessor(vorgangWithEingang); 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); expect(commandService.createCommandByOrder).toHaveBeenCalledWith(expectedProps);
}) })
}) })
......
...@@ -21,10 +21,11 @@ ...@@ -21,10 +21,11 @@
* Die sprachspezifischen Genehmigungen und Beschränkungen * Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen. * 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 { ApiRootService } from '@goofy-client/api-root-shared';
import { BinaryFileListResource } from '@goofy-client/binary-file-shared'; import { BinaryFileListResource } from '@goofy-client/binary-file-shared';
import { CommandOrder, CommandResource, CommandService, CreateCommandProps } from '@goofy-client/command-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 { NavigationService } from '@goofy-client/navigation-shared';
import { StateResource, createEmptyStateResource, doIfLoadingRequired, isNotNull } from '@goofy-client/tech-shared'; import { StateResource, createEmptyStateResource, doIfLoadingRequired, isNotNull } from '@goofy-client/tech-shared';
import { ResourceUri, getUrl, hasLink } from '@ngxp/rest'; import { ResourceUri, getUrl, hasLink } from '@ngxp/rest';
...@@ -42,7 +43,12 @@ export class VorgangService { ...@@ -42,7 +43,12 @@ export class VorgangService {
public static readonly VORGANG_WITH_EINGANG_URL: string = 'vorgangWithEingangUrl'; 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>> { public getVorgangWithEingang(): Observable<StateResource<VorgangWithEingangResource>> {
return combineLatest([this.facade.getVorgangWithEingang(), this.apiRootService.getApiRoot()]).pipe( return combineLatest([this.facade.getVorgangWithEingang(), this.apiRootService.getApiRoot()]).pipe(
...@@ -160,6 +166,6 @@ export class VorgangService { ...@@ -160,6 +166,6 @@ export class VorgangService {
} }
private createExecuteProcessorCommandProps(vorgangWithEingang: VorgangWithEingangResource): CreateCommandProps { 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) };
} }
} }
...@@ -134,9 +134,19 @@ describe('VorgangUtil', () => { ...@@ -134,9 +134,19 @@ describe('VorgangUtil', () => {
describe('create createExecuteProcessCommand', () => { describe('create createExecuteProcessCommand', () => {
it('should have order', () => { it('should have order', () => {
const command: CreateCommand = createExecuteProcessorCommand(); const processorNames: string[] = ['dummyProcessorName'];
const command: CreateCommand = createExecuteProcessorCommand(processorNames);
expect(command.order).toBe(CommandOrder.EXECUTE_PROCESSOR); 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
...@@ -94,6 +94,6 @@ export function isAssignUserCommand(order: CommandOrder): boolean { ...@@ -94,6 +94,6 @@ export function isAssignUserCommand(order: CommandOrder): boolean {
return order === CommandOrder.ASSIGN_USER; return order === CommandOrder.ASSIGN_USER;
} }
export function createExecuteProcessorCommand(): CreateCommand { export function createExecuteProcessorCommand(processorNames: string[]): CreateCommand {
return { order: CommandOrder.EXECUTE_PROCESSOR, body: null }; //TODO OZG-4514 return { order: CommandOrder.EXECUTE_PROCESSOR, body: { processorNames } };
} }
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment