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 a64cb0dd5f581ff2a55b66d3ab9e56f22223841a..86fbc485c7b5143be1ab69d70e04644bafb1328b 100644 --- a/alfa-client/libs/command-shared/src/lib/command.model.ts +++ b/alfa-client/libs/command-shared/src/lib/command.model.ts @@ -73,6 +73,7 @@ export enum CommandOrder { VORGANG_ZURUECKHOLEN = 'VORGANG_ZURUECKHOLEN', VORGANG_BEARBEITEN = 'VORGANG_BEARBEITEN', VORGANG_BESCHEIDEN = 'VORGANG_BESCHEIDEN', + VORGANG_FORWARD = 'VORGANG_FORWARD', VORGANG_ZURUECKSTELLEN = 'VORGANG_ZURUECKSTELLEN', VORGANG_ABSCHLIESSEN = 'VORGANG_ABSCHLIESSEN', VORGANG_WIEDEREROEFFNEN = 'VORGANG_WIEDEREROEFFNEN', 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 f36d739ff6533b5fa17fa448dfecf9211238c7fe..32c7dcbe9469d168c5b4911268a5316a5ac21a9f 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,9 +21,15 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { CommandOrder, CommandResource, CommandService } from '@alfa-client/command-shared'; +import { CommandOrder, CommandResource, CommandService, CreateCommandProps } from '@alfa-client/command-shared'; import { NavigationService } from '@alfa-client/navigation-shared'; -import { StateResource, createEmptyStateResource, createErrorStateResource, createStateResource } from '@alfa-client/tech-shared'; +import { + EMPTY_STRING, + StateResource, + createEmptyStateResource, + createErrorStateResource, + createStateResource, +} from '@alfa-client/tech-shared'; import { Mock, mock, useFromMock } from '@alfa-client/test-utils'; import { CreateForwardCommand, @@ -33,9 +39,11 @@ import { VorgangWithEingangLinkRel, VorgangWithEingangResource, } from '@alfa-client/vorgang-shared'; +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 } from 'libs/command-shared/test/command'; +import { createCommandResource, createCreateCommandProps } from 'libs/command-shared/test/command'; import { createVorgangForwardRequest, createVorgangResource, @@ -43,7 +51,7 @@ import { } from 'libs/vorgang-shared/test/vorgang'; import { Observable, of } from 'rxjs'; import { createApiError } from '../../../tech-shared/test/error'; -import { multipleCold } from '../../../tech-shared/test/marbles'; +import { multipleCold, singleColdCompleted } from '../../../tech-shared/test/marbles'; import { createForwardingListResource, createForwardingResource } from '../../test/forwarding'; import { ForwardingLinkRel } from './forwarding.linkrel'; import { ForwardingListResource, ForwardingResource } from './forwarding.model'; @@ -348,4 +356,74 @@ describe('ForwardingService', () => { expect(service.setList).toHaveBeenCalledWith(list); }); }); + + describe('forward', () => { + const forwardingToUri: ResourceUri = faker.internet.url(); + const vorgangResource: VorgangWithEingangResource = createVorgangWithEingangResource(); + const createCommandProps: CreateCommandProps = createCreateCommandProps(); + const commandResource: CommandResource = createCommandResource(); + const commandStateResource: StateResource<CommandResource> = createStateResource(commandResource); + + beforeEach(() => { + vorgangService.selectVorgangWithEingang.mockReturnValue(of(createStateResource(vorgangResource))); + 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); + }); + + it('should call command service to create command', () => { + service.forward(forwardingToUri).subscribe(); + + expect(commandService.createCommandByProps).toHaveBeenCalledWith(createCommandProps); + }); + + it('should return response from command service', () => { + const forwardCommand$: Observable<StateResource<CommandResource>> = service.forward(forwardingToUri); + + expect(forwardCommand$).toBeObservable(singleColdCompleted(commandStateResource)); + }); + }); + + 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); + + expect(commandProps.linkRel).toBe(VorgangWithEingangLinkRel.FORWARD_BY_OZGCLOUD); + }); + + it('should contains command', () => { + const commandProps: CreateCommandProps = service._buildForwardCreateCommandProps(vorgangResource, forwardingToUri); + + expect(commandProps.command).toEqual({ + order: CommandOrder.VORGANG_FORWARD, + body: { organisationEinheitId: forwardingToUri }, + }); + }); + + it('should contains empty snackbar message', () => { + const commandProps: CreateCommandProps = service._buildForwardCreateCommandProps(vorgangResource, 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 3440dd55eaec83add48a0f56d3e2905304f60343..032a0569f57ad920f08a3db64238636d93c2a67f 100644 --- a/alfa-client/libs/forwarding-shared/src/lib/forwarding.service.ts +++ b/alfa-client/libs/forwarding-shared/src/lib/forwarding.service.ts @@ -21,9 +21,24 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { CommandResource, CommandService, CreateCommand, isDone, isPending } from '@alfa-client/command-shared'; +import { + CommandOrder, + CommandResource, + CommandService, + CreateCommand, + CreateCommandProps, + isDone, + isPending, +} from '@alfa-client/command-shared'; import { NavigationService } from '@alfa-client/navigation-shared'; -import { StateResource, createEmptyStateResource, createStateResource, hasStateResourceError } from '@alfa-client/tech-shared'; +import { + EMPTY_STRING, + StateResource, + createEmptyStateResource, + createStateResource, + hasStateResourceError, + mapToResource, +} from '@alfa-client/tech-shared'; import { ForwardRequest, VorgangResource, @@ -34,9 +49,10 @@ import { } from '@alfa-client/vorgang-shared'; import { Injectable, OnDestroy } from '@angular/core'; 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, tap } from 'rxjs/operators'; +import { first, map, startWith, switchMap, tap } from 'rxjs/operators'; import { ForwardingLinkRel } from './forwarding.linkrel'; import { ForwardingListResource, ForwardingResource } from './forwarding.model'; import { ForwardingRepository } from './forwarding.repository'; @@ -164,6 +180,31 @@ export class ForwardingService implements OnDestroy { this.forwardingList$.next(createStateResource(list)); } + 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()); + } + + _buildForwardCreateCommandProps(vorgang: VorgangWithEingangResource, forwardingToUri: ResourceUri): CreateCommandProps { + return <any>{ + linkRel: VorgangWithEingangLinkRel.FORWARD_BY_OZGCLOUD, + command: this.createBuildForwardCommand(forwardingToUri), + snackBarMessage: EMPTY_STRING, + resource: vorgang, + }; + } + + private createBuildForwardCommand(forwardingToUri: ResourceUri): CreateCommand { + return { order: CommandOrder.VORGANG_FORWARD, body: { organisationEinheitId: forwardingToUri } }; + } + ngOnDestroy(): void { this.unsubscribe(); } 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 0aa3ead988609bc5416e593f13cfdf6e44bd8a6e..841db70f825511dbd592a67f7a614955ff11f515 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 @@ -39,11 +39,12 @@ import { createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorga import { Observable, of } from 'rxjs'; import { VorgangFacade } from './+state/vorgang.facade'; import { VorgangWithEingangLinkRel } from './vorgang.linkrel'; -import { AdditionalActions, VorgangWithEingangResource } from './vorgang.model'; +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', () => { @@ -515,4 +516,25 @@ describe('VorgangService', () => { }); }); }); + + describe('select vorgang with eingang', () => { + const vorgangStateResource: StateResource<VorgangResource> = createStateResource(createVorgangWithEingangResource()); + + beforeEach(() => { + facade.getVorgangWithEingang.mockReturnValue(of(vorgangStateResource)); + }); + + it('should call facade to get vorgang with eingang', () => { + service.selectVorgangWithEingang(); + + expect(facade.getVorgangWithEingang).toHaveBeenCalled(); + }); + + it('should return value', () => { + const vorgangWithEingangStateResource$: Observable<StateResource<VorgangWithEingangResource>> = + service.selectVorgangWithEingang(); + + expect(vorgangWithEingangStateResource$).toBeObservable(singleColdCompleted(vorgangStateResource)); + }); + }); }); 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 1af6e12ff7877e9e221d05730199423689663082..27fbe8ff8a03361c403cd38d034cacac177ef7ec 100644 --- a/alfa-client/libs/vorgang-shared/src/lib/vorgang.service.ts +++ b/alfa-client/libs/vorgang-shared/src/lib/vorgang.service.ts @@ -198,4 +198,8 @@ export class VorgangService { const createCommand = { order: CommandOrder.SET_AKTENZEICHEN, body: { aktenzeichen } }; return this.commandService.createCommand(vorgang, VorgangWithEingangLinkRel.SET_AKTENZEICHEN, createCommand); } + + public selectVorgangWithEingang(): Observable<StateResource<VorgangWithEingangResource>> { + return this.facade.getVorgangWithEingang(); + } }