diff --git a/alfa-client/libs/command-shared/src/lib/command.model.ts b/alfa-client/libs/command-shared/src/lib/command.model.ts index 86fbc485c7b5143be1ab69d70e04644bafb1328b..d93097c851859299d3310f8a1edd27c5e9bea514 100644 --- a/alfa-client/libs/command-shared/src/lib/command.model.ts +++ b/alfa-client/libs/command-shared/src/lib/command.model.ts @@ -99,3 +99,5 @@ export interface CreateCommandProps { snackBarMessage?: string; snackBarErrorMessage?: string; } + +export type CreateCommandPropsWithoutResource = Omit<CreateCommandProps, 'resource'>; diff --git a/alfa-client/libs/command-shared/test/command.ts b/alfa-client/libs/command-shared/test/command.ts index ff7aae6c8ba99ae02f921c49b9a789c675e404bd..05fec9de4806f6473cf2d4204ee196ed71db5da0 100644 --- a/alfa-client/libs/command-shared/test/command.ts +++ b/alfa-client/libs/command-shared/test/command.ts @@ -35,6 +35,7 @@ import { CommandStatus, CreateCommand, CreateCommandProps, + CreateCommandPropsWithoutResource, } from '../src/lib/command.model'; export function createCommand(): Command { @@ -85,8 +86,11 @@ export function createCreateCommand(order: CommandOrder = CommandOrder.VORGANG_A } export function createCreateCommandProps(): CreateCommandProps { + return { ...createCreateCommandPropsWithoutResource(), resource: createCommandResource() }; +} + +export function createCreateCommandPropsWithoutResource(): CreateCommandPropsWithoutResource { return { - resource: createCommandResource(), linkRel: faker.internet.url(), command: createCreateCommand(), snackBarMessage: faker.word.sample(5), diff --git a/alfa-client/libs/forwarding-shared/src/lib/forwarding.service.spec.ts b/alfa-client/libs/forwarding-shared/src/lib/forwarding.service.spec.ts index 32c7dcbe9469d168c5b4911268a5316a5ac21a9f..fc179766649daf312ed6f0f1680e8dd59a791fef 100644 --- a/alfa-client/libs/forwarding-shared/src/lib/forwarding.service.spec.ts +++ b/alfa-client/libs/forwarding-shared/src/lib/forwarding.service.spec.ts @@ -21,7 +21,7 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { CommandOrder, CommandResource, CommandService, CreateCommandProps } from '@alfa-client/command-shared'; +import { CommandOrder, CommandResource, CommandService, CreateCommandPropsWithoutResource } from '@alfa-client/command-shared'; import { NavigationService } from '@alfa-client/navigation-shared'; import { EMPTY_STRING, @@ -43,7 +43,7 @@ import { faker } from '@faker-js/faker/.'; import { ResourceUri } from '@ngxp/rest'; import { hot } from 'jest-marbles'; import { CommandLinkRel } from 'libs/command-shared/src/lib/command.linkrel'; -import { createCommandResource, createCreateCommandProps } from 'libs/command-shared/test/command'; +import { createCommandResource, createCreateCommandPropsWithoutResource } from 'libs/command-shared/test/command'; import { createVorgangForwardRequest, createVorgangResource, @@ -359,33 +359,26 @@ describe('ForwardingService', () => { describe('forward', () => { const forwardingToUri: ResourceUri = faker.internet.url(); - const vorgangResource: VorgangWithEingangResource = createVorgangWithEingangResource(); - const createCommandProps: CreateCommandProps = createCreateCommandProps(); + + const createCommandProps: CreateCommandPropsWithoutResource = createCreateCommandPropsWithoutResource(); const commandResource: CommandResource = createCommandResource(); const commandStateResource: StateResource<CommandResource> = createStateResource(commandResource); beforeEach(() => { - vorgangService.selectVorgangWithEingang.mockReturnValue(of(createStateResource(vorgangResource))); + vorgangService.createCommand.mockReturnValue(of(commandStateResource)); service._buildForwardCreateCommandProps = jest.fn().mockReturnValue(createCommandProps); - commandService.createCommandByProps.mockReturnValue(of(commandStateResource)); - }); - - it('should call vorgang service to get vorgang with eingang', () => { - service.forward(forwardingToUri).subscribe(); - - expect(vorgangService.selectVorgangWithEingang).toHaveBeenCalled(); }); it('should call build forward create command', () => { service.forward(forwardingToUri).subscribe(); - expect(service._buildForwardCreateCommandProps).toHaveBeenCalledWith(vorgangResource, forwardingToUri); + expect(service._buildForwardCreateCommandProps).toHaveBeenCalledWith(forwardingToUri); }); - it('should call command service to create command', () => { + it('should call vorgang service to create command', () => { service.forward(forwardingToUri).subscribe(); - expect(commandService.createCommandByProps).toHaveBeenCalledWith(createCommandProps); + expect(vorgangService.createCommand).toHaveBeenCalledWith(createCommandProps, true); }); it('should return response from command service', () => { @@ -397,16 +390,15 @@ describe('ForwardingService', () => { describe('build forward command props', () => { const forwardingToUri: ResourceUri = faker.internet.url(); - const vorgangResource: VorgangWithEingangResource = createVorgangWithEingangResource(); it('should contains linkrel', () => { - const commandProps: CreateCommandProps = service._buildForwardCreateCommandProps(vorgangResource, forwardingToUri); + const commandProps: CreateCommandPropsWithoutResource = service._buildForwardCreateCommandProps(forwardingToUri); expect(commandProps.linkRel).toBe(VorgangWithEingangLinkRel.FORWARD_BY_OZGCLOUD); }); it('should contains command', () => { - const commandProps: CreateCommandProps = service._buildForwardCreateCommandProps(vorgangResource, forwardingToUri); + const commandProps: CreateCommandPropsWithoutResource = service._buildForwardCreateCommandProps(forwardingToUri); expect(commandProps.command).toEqual({ order: CommandOrder.VORGANG_FORWARD, @@ -415,15 +407,9 @@ describe('ForwardingService', () => { }); it('should contains empty snackbar message', () => { - const commandProps: CreateCommandProps = service._buildForwardCreateCommandProps(vorgangResource, forwardingToUri); + const commandProps: CreateCommandPropsWithoutResource = service._buildForwardCreateCommandProps(forwardingToUri); expect(commandProps.snackBarMessage).toBe(EMPTY_STRING); }); - - it('should contains resource', () => { - const commandProps: CreateCommandProps = service._buildForwardCreateCommandProps(vorgangResource, forwardingToUri); - - expect(commandProps.resource).toBe(vorgangResource); - }); }); }); diff --git a/alfa-client/libs/forwarding-shared/src/lib/forwarding.service.ts b/alfa-client/libs/forwarding-shared/src/lib/forwarding.service.ts index 032a0569f57ad920f08a3db64238636d93c2a67f..fc1013d6c5b3d70a0d8dec41b1f5a68953a92dea 100644 --- a/alfa-client/libs/forwarding-shared/src/lib/forwarding.service.ts +++ b/alfa-client/libs/forwarding-shared/src/lib/forwarding.service.ts @@ -26,7 +26,7 @@ import { CommandResource, CommandService, CreateCommand, - CreateCommandProps, + CreateCommandPropsWithoutResource, isDone, isPending, } from '@alfa-client/command-shared'; @@ -37,7 +37,6 @@ import { createEmptyStateResource, createStateResource, hasStateResourceError, - mapToResource, } from '@alfa-client/tech-shared'; import { ForwardRequest, @@ -52,7 +51,7 @@ import { Params } from '@angular/router'; import { ResourceUri } from '@ngxp/rest'; import { isNil } from 'lodash-es'; import { BehaviorSubject, Observable, Subscription } from 'rxjs'; -import { first, map, startWith, switchMap, tap } from 'rxjs/operators'; +import { first, map, startWith, tap } from 'rxjs/operators'; import { ForwardingLinkRel } from './forwarding.linkrel'; import { ForwardingListResource, ForwardingResource } from './forwarding.model'; import { ForwardingRepository } from './forwarding.repository'; @@ -181,23 +180,14 @@ export class ForwardingService implements OnDestroy { } public forward(forwardingToUri: ResourceUri): Observable<StateResource<CommandResource>> { - return this.selectVorgangWithEingang().pipe( - switchMap((vorgang: VorgangWithEingangResource) => { - return this.commandService.createCommandByProps(this._buildForwardCreateCommandProps(vorgang, forwardingToUri)); - }), - ); - } - - private selectVorgangWithEingang(): Observable<VorgangWithEingangResource> { - return this.vorgangService.selectVorgangWithEingang().pipe(first(), mapToResource()); + return this.vorgangService.createCommand(this._buildForwardCreateCommandProps(forwardingToUri), true); } - _buildForwardCreateCommandProps(vorgang: VorgangWithEingangResource, forwardingToUri: ResourceUri): CreateCommandProps { - return <any>{ + _buildForwardCreateCommandProps(forwardingToUri: ResourceUri): CreateCommandPropsWithoutResource { + return { linkRel: VorgangWithEingangLinkRel.FORWARD_BY_OZGCLOUD, command: this.createBuildForwardCommand(forwardingToUri), snackBarMessage: EMPTY_STRING, - resource: vorgang, }; } diff --git a/alfa-client/libs/vorgang-shared/src/lib/vorgang.service.spec.ts b/alfa-client/libs/vorgang-shared/src/lib/vorgang.service.spec.ts index 841db70f825511dbd592a67f7a614955ff11f515..5e9995262ed38703521d02d10ee078a330163cbd 100644 --- a/alfa-client/libs/vorgang-shared/src/lib/vorgang.service.spec.ts +++ b/alfa-client/libs/vorgang-shared/src/lib/vorgang.service.spec.ts @@ -23,18 +23,26 @@ */ import { ApiRootLinkRel, ApiRootResource, ApiRootService } from '@alfa-client/api-root-shared'; import { BinaryFileListResource } from '@alfa-client/binary-file-shared'; -import { CommandOrder, CommandResource, CommandService, CreateCommandProps } from '@alfa-client/command-shared'; +import { + CommandOrder, + CommandResource, + CommandService, + CreateCommandProps, + CreateCommandPropsWithoutResource, +} from '@alfa-client/command-shared'; import { Environment } from '@alfa-client/environment-shared'; import { NavigationService } from '@alfa-client/navigation-shared'; import { EMPTY_STRING, StateResource, createEmptyStateResource, createStateResource } from '@alfa-client/tech-shared'; import { Mock, mock, useFromMock } from '@alfa-client/test-utils'; import { HttpErrorResponse } from '@angular/common/http'; +import { faker } from '@faker-js/faker'; import { ResourceUri, getUrl } from '@ngxp/rest'; import { cold, hot } from 'jest-marbles'; import { createApiRootResource } from 'libs/api-root-shared/test/api-root'; import { createBinaryFileListResource } from 'libs/binary-file-shared/test/binary-file'; import { CommandLinkRel } from 'libs/command-shared/src/lib/command.linkrel'; -import { createCommandResource } from 'libs/command-shared/test/command'; +import { createCommandResource, createCreateCommandPropsWithoutResource } from 'libs/command-shared/test/command'; +import { singleColdCompleted } from 'libs/tech-shared/test/marbles'; import { createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang'; import { Observable, of } from 'rxjs'; import { VorgangFacade } from './+state/vorgang.facade'; @@ -42,9 +50,6 @@ import { VorgangWithEingangLinkRel } from './vorgang.linkrel'; import { AdditionalActions, VorgangResource, VorgangWithEingangResource } from './vorgang.model'; import { VorgangService } from './vorgang.service'; -import { faker } from '@faker-js/faker'; - -import { singleColdCompleted } from 'libs/tech-shared/test/marbles'; import * as VorgangNavigationUtil from './vorgang-navigation.util'; describe('VorgangService', () => { @@ -537,4 +542,43 @@ describe('VorgangService', () => { expect(vorgangWithEingangStateResource$).toBeObservable(singleColdCompleted(vorgangStateResource)); }); }); + + describe('create command', () => { + const vorgangResource: VorgangWithEingangResource = createVorgangWithEingangResource(); + + const createCommandProps: CreateCommandPropsWithoutResource = createCreateCommandPropsWithoutResource(); + const commandResource: CommandResource = createCommandResource([CommandLinkRel.EFFECTED_RESOURCE]); + const commandStateResource: StateResource<CommandResource> = createStateResource(commandResource); + + beforeEach(() => { + facade.getVorgangWithEingang.mockReturnValue(of(createStateResource(vorgangResource))); + commandService.createCommandByProps.mockReturnValue(of(commandStateResource)); + }); + + it('should call facade to get vorgang with eingang', () => { + service.createCommand(createCommandProps).subscribe(); + + expect(facade.getVorgangWithEingang).toHaveBeenCalled(); + }); + + it('should call command service to create command', () => { + service.createCommand(createCommandProps).subscribe(); + + expect(commandService.createCommandByProps).toHaveBeenCalledWith({ ...createCommandProps, resource: vorgangResource }); + }); + + it('should return response from command service', () => { + const forwardCommand$: Observable<StateResource<CommandResource>> = service.createCommand(createCommandProps); + + expect(forwardCommand$).toBeObservable(singleColdCompleted(commandStateResource)); + }); + + it('should call reload if command is done and reload flag is true', () => { + service.reloadVorgang = jest.fn(); + + service.createCommand(createCommandProps, true).subscribe(); + + expect(service.reloadVorgang).toHaveBeenCalled(); + }); + }); }); diff --git a/alfa-client/libs/vorgang-shared/src/lib/vorgang.service.ts b/alfa-client/libs/vorgang-shared/src/lib/vorgang.service.ts index 27fbe8ff8a03361c403cd38d034cacac177ef7ec..7e43262e9757d58e030c4bbe2900aae791255e96 100644 --- a/alfa-client/libs/vorgang-shared/src/lib/vorgang.service.ts +++ b/alfa-client/libs/vorgang-shared/src/lib/vorgang.service.ts @@ -28,15 +28,17 @@ import { CommandResource, CommandService, CreateCommandProps, + CreateCommandPropsWithoutResource, getEffectedResourceUrl, + tapOnCommandSuccessfullyDone, } from '@alfa-client/command-shared'; import { ENVIRONMENT_CONFIG, Environment } from '@alfa-client/environment-shared'; import { NavigationService } from '@alfa-client/navigation-shared'; -import { StateResource, createEmptyStateResource, doIfLoadingRequired, isNotNull } from '@alfa-client/tech-shared'; +import { StateResource, createEmptyStateResource, doIfLoadingRequired, isNotNull, mapToResource } from '@alfa-client/tech-shared'; import { Inject, Injectable } from '@angular/core'; import { ResourceUri, hasLink } from '@ngxp/rest'; import { Observable, combineLatest } from 'rxjs'; -import { filter, map, startWith, tap, withLatestFrom } from 'rxjs/operators'; +import { filter, first, map, startWith, switchMap, tap, withLatestFrom } from 'rxjs/operators'; import { VorgangFacade } from './+state/vorgang.facade'; import { buildLinkRelFromPathSegments } from './vorgang-navigation.util'; import { VorgangWithEingangLinkRel } from './vorgang.linkrel'; @@ -142,10 +144,6 @@ export class VorgangService { return this.facade.getAssignUserCommand(); } - public reloadVorgang(commandResource: CommandResource): void { - this.facade.loadVorgangWithEingang(getEffectedResourceUrl(commandResource)); - } - public getBackButtonUrl(): Observable<string> { return this.facade.getBackButtonUrl(); } @@ -199,7 +197,27 @@ export class VorgangService { return this.commandService.createCommand(vorgang, VorgangWithEingangLinkRel.SET_AKTENZEICHEN, createCommand); } + public createCommand( + createCommandProps: CreateCommandPropsWithoutResource, + reloadResource: boolean = false, + ): Observable<StateResource<CommandResource>> { + return this.selectVorgangWithEingang().pipe( + first(), + mapToResource(), + switchMap((vorgang: VorgangWithEingangResource) => + this.commandService.createCommandByProps({ ...createCommandProps, resource: vorgang }), + ), + tapOnCommandSuccessfullyDone((commandStateResource: StateResource<CommandResource>) => { + if (reloadResource) this.reloadVorgang(commandStateResource.resource); + }), + ); + } + public selectVorgangWithEingang(): Observable<StateResource<VorgangWithEingangResource>> { return this.facade.getVorgangWithEingang(); } + + public reloadVorgang(commandResource: CommandResource): void { + this.facade.loadVorgangWithEingang(getEffectedResourceUrl(commandResource)); + } }