diff --git a/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.ts b/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.ts index 2a1800665cfb6541b228b87795b565fdd99e1a6a..51939bd89281d0a5e4c2971c026cebf8f6ef34ce 100644 --- a/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.ts +++ b/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.ts @@ -50,7 +50,7 @@ import { import { ResourceRepository } from '../../../tech-shared/src/lib/resource/resource.repository'; import { ResourceService } from '../../../tech-shared/src/lib/resource/resource.service'; import { BescheidFacade } from './+state/bescheid.facade'; -import { BescheidLinkRel } from './bescheid.linkrel'; +import { BescheidLinkRel, BescheidListLinkRel } from './bescheid.linkrel'; import { Bescheid, BescheidListResource, @@ -131,6 +131,7 @@ export class BescheidService { return { baseResource: this.vorgangService.getVorgangWithEingang(), listLinkRel: VorgangWithEingangLinkRel.BESCHEIDE, + listResourceListLinkRel: BescheidListLinkRel.BESCHEID_LIST, }; } diff --git a/alfa-client/libs/tech-shared/src/lib/resource/list-resource.service.itcase.spec.ts b/alfa-client/libs/tech-shared/src/lib/resource/list-resource.service.itcase.spec.ts index 3d0235dc49cbf3cd0cef473247ec788dcebb6578..9e8d68e04cac794472b2a4142bf9d8888c31a452 100644 --- a/alfa-client/libs/tech-shared/src/lib/resource/list-resource.service.itcase.spec.ts +++ b/alfa-client/libs/tech-shared/src/lib/resource/list-resource.service.itcase.spec.ts @@ -21,6 +21,7 @@ describe.skip('ResourceListService ITCase', () => { let resourceRepository: Mock<ResourceRepository>; const listLinkRel: string = DummyListLinkRel.LIST; + const listResourceListLinkRel: string = DummyListLinkRel.LIST; const createLinkRel: string = DummyLinkRel.DUMMY; const baseResource: StateResource<Resource> = createStateResource(createDummyResource()); @@ -134,6 +135,7 @@ describe.skip('ResourceListService ITCase', () => { return { baseResource, listLinkRel, + listResourceListLinkRel, createLinkRel, }; } diff --git a/alfa-client/libs/tech-shared/src/lib/resource/list-resource.service.spec.ts b/alfa-client/libs/tech-shared/src/lib/resource/list-resource.service.spec.ts index 9d784df21553e873cd3390c0606321166be2767f..9983f8acf61e11a6c642761e7b0d6e8e3351c253 100644 --- a/alfa-client/libs/tech-shared/src/lib/resource/list-resource.service.spec.ts +++ b/alfa-client/libs/tech-shared/src/lib/resource/list-resource.service.spec.ts @@ -12,7 +12,12 @@ import { import { BehaviorSubject, Observable, of } from 'rxjs'; import { singleCold, singleHot } from '../../../test/marbles'; import { ResourceListService } from './list-resource.service'; -import { CreateResourceData, ListItemResource, ListResourceServiceConfig } from './resource.model'; +import { + CreateResourceData, + LinkRelationName, + ListItemResource, + ListResourceServiceConfig, +} from './resource.model'; import { ResourceRepository } from './resource.repository'; import { ListResource, @@ -21,6 +26,8 @@ import { createStateResource, } from './resource.util'; +import { EMPTY_ARRAY } from '../tech.util'; + import * as ResourceUtil from './resource.util'; describe('ListResourceService', () => { @@ -28,8 +35,9 @@ describe('ListResourceService', () => { let config: ListResourceServiceConfig<Resource>; let resourceRepository: Mock<ResourceRepository>; - const listLinkRel: string = DummyListLinkRel.LIST; - const createLinkRel: string = DummyLinkRel.DUMMY; + const listLinkRel: LinkRelationName = DummyListLinkRel.LIST; + const createLinkRel: LinkRelationName = DummyLinkRel.DUMMY; + const listResourceListLinkRel: LinkRelationName = DummyListLinkRel.LIST; const listResource: ListResource = createDummyListResource([listLinkRel, createLinkRel]); const baseResource: Resource = createDummyResource(); @@ -42,6 +50,7 @@ describe('ListResourceService', () => { config = { baseResource: baseResourceSubj, listLinkRel, + listResourceListLinkRel, createLinkRel, }; resourceRepository = mock(ResourceRepository); @@ -475,23 +484,52 @@ describe('ListResourceService', () => { }); describe('get items', () => { + const listResourceItems: ListItemResource[] = [createDummyResource()]; + const stateListResource: StateResource<ListResource> = createStateResource( + createFilledDummyListResource(listResourceItems), + ); + let getListSpy: jest.SpyInstance; + + beforeEach(() => { + getListSpy = service.getList = jest.fn().mockReturnValue(of(stateListResource)); + }); + + it('should get list', () => { + service.getItems(); + + expect(getListSpy).toHaveBeenCalled(); + }); + + it('should call get embedded resources', () => { + const spy = jest.spyOn(ResourceUtil, 'getEmbeddedResources'); + service.getItems().subscribe(); + + expect(spy).toHaveBeenCalledWith(stateListResource, listResourceListLinkRel); + }); + it('should return empty array on empty stateResource', (done) => { - service.listResource.next(createEmptyStateResource()); + service.getList = jest.fn().mockReturnValue(of(createEmptyStateResource())); service.getItems().subscribe((items) => { - expect(items).toEqual([]); + expect(items).toEqual(EMPTY_ARRAY); done(); }); }); it('should return listresource items', (done) => { - const listIems: Resource[] = [createDummyResource()]; - service.listResource.next(createStateResource(createFilledDummyListResource(listIems))); - service.getItems().subscribe((items) => { - expect(items).toEqual(listIems); + expect(items).toEqual(listResourceItems); done(); }); }); + + it('should not emit on loading state resource', () => { + service.getList = jest.fn().mockReturnValue(of(createEmptyStateResource(true))); + + const spy = jest.spyOn(ResourceUtil, 'getEmbeddedResources').mockClear(); + service.getItems().subscribe(); + + expect(spy).not.toHaveBeenCalled(); + }); }); }); diff --git a/alfa-client/libs/tech-shared/src/lib/resource/list-resource.service.ts b/alfa-client/libs/tech-shared/src/lib/resource/list-resource.service.ts index 76cefcf0b5e111f486cc72e3b20e201e8f7962d9..631e1c685eba0e9f96e5a4e1d97e1314a1cb7e9f 100644 --- a/alfa-client/libs/tech-shared/src/lib/resource/list-resource.service.ts +++ b/alfa-client/libs/tech-shared/src/lib/resource/list-resource.service.ts @@ -231,12 +231,14 @@ export class ResourceListService< } public getItems(): Observable<ListItemResource[]> { - return this.listResource - .asObservable() - .pipe( - map((listStateResource: StateResource<T>) => - getEmbeddedResources<ListItemResource>(listStateResource, this.config.listLinkRel), + return this.getList().pipe( + filter((listStateResource: StateResource<T>) => !listStateResource.loading), + map((listStateResource: StateResource<T>) => + getEmbeddedResources<ListItemResource>( + listStateResource, + this.config.listResourceListLinkRel, ), - ); + ), + ); } } diff --git a/alfa-client/libs/tech-shared/src/lib/resource/resource.model.ts b/alfa-client/libs/tech-shared/src/lib/resource/resource.model.ts index e7e4b3264d1648063ce6d8e85ebe27ffcd779f3e..5fa5264f32b11a057af8755641f61d02b001fc46 100644 --- a/alfa-client/libs/tech-shared/src/lib/resource/resource.model.ts +++ b/alfa-client/libs/tech-shared/src/lib/resource/resource.model.ts @@ -5,6 +5,7 @@ import { StateResource } from './resource.util'; export interface ListResourceServiceConfig<B> { baseResource: Observable<StateResource<B>>; listLinkRel: LinkRelationName; + listResourceListLinkRel: LinkRelationName; createLinkRel?: LinkRelationName; } diff --git a/alfa-client/libs/tech-shared/src/lib/resource/resource.service.ts b/alfa-client/libs/tech-shared/src/lib/resource/resource.service.ts index b3c8dca21b0169ec06dec7d66ed6f22625d3c844..b87ef49e8d89a71752b6cd6b793aa6d6a4bb05c0 100644 --- a/alfa-client/libs/tech-shared/src/lib/resource/resource.service.ts +++ b/alfa-client/libs/tech-shared/src/lib/resource/resource.service.ts @@ -156,6 +156,9 @@ export abstract class ResourceService<B extends Resource, T extends Resource> { this.stateResource.next({ ...this.stateResource.value, reload: true }); } + /** + * @deprecated + */ public canEdit(): boolean { return this.hasLinkRel(this.config.edit.linkRel); } @@ -164,10 +167,16 @@ export abstract class ResourceService<B extends Resource, T extends Resource> { return hasLink(this.getResource(), linkRel); } + /** + * @deprecated + */ public getResource(): T { return this.stateResource.value.resource; } + /** + * @deprecated + */ public canDelete(): boolean { return this.hasLinkRel(this.config.delete.linkRel); } @@ -176,6 +185,9 @@ export abstract class ResourceService<B extends Resource, T extends Resource> { throwErrorOn(!this.canDelete(), 'No delete link exists on current stateresource.'); } + /** + * @deprecated + */ public exists(): boolean { return isNotNull(this.stateResource.value.resource); }