From 7d0c9d2f52449442f6f9a89a9d0b9630442e1be3 Mon Sep 17 00:00:00 2001
From: OZGCloud <ozgcloud@mgm-tp.com>
Date: Wed, 29 May 2024 20:24:28 +0200
Subject: [PATCH] OZG-5012 adjust resource change handling; simplify
 getResource function

---
 .../src/lib/bescheid.service.spec.ts          | 26 ++++++++++++++
 .../src/lib/bescheid.service.ts               | 12 +++----
 .../src/lib/resource/resource.service.spec.ts | 35 ++++++++++---------
 .../src/lib/resource/resource.service.ts      |  8 +++--
 4 files changed, 54 insertions(+), 27 deletions(-)

diff --git a/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.spec.ts b/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.spec.ts
index 844c5769fd..66e7b66d41 100644
--- a/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.spec.ts
+++ b/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.spec.ts
@@ -1246,6 +1246,32 @@ describe('BescheidService', () => {
     });
   });
 
+  describe('get resource', () => {
+    const bescheidResource: BescheidResource = createBescheidResource();
+    const bescheidStateResource: StateResource<BescheidResource> =
+      createStateResource(bescheidResource);
+
+    it('should call bescheid draft service', () => {
+      service.bescheidDraftService.selectResource = jest
+        .fn()
+        .mockReturnValue(of(bescheidStateResource));
+
+      service.getResource();
+
+      expect(service.bescheidDraftService.selectResource).toHaveBeenCalled();
+    });
+
+    it('should return value', () => {
+      service.bescheidDraftService.selectResource = jest
+        .fn()
+        .mockReturnValue(of(bescheidStateResource));
+
+      const bescheidDraft: BescheidResource = service.getResource();
+
+      expect(bescheidDraft).toBe(bescheidResource);
+    });
+  });
+
   describe('getEmpfaenger', () => {
     it('should return Empfänger', () => {
       const vorgangWithEingangResource: VorgangWithEingangResource =
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 42b888cbfa..12e091a11c 100644
--- a/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.ts
+++ b/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.ts
@@ -480,14 +480,10 @@ export class BescheidService {
    */
   getResource(): BescheidResource {
     let resource: StateResource<BescheidResource> = undefined;
-    const selected = this.bescheidDraftService.get().pipe(
-      filter((stateResource: StateResource<BescheidResource>) => !stateResource.loading),
-      take(1),
-    );
-    const sub = selected.subscribe(
-      (stateResource: StateResource<BescheidResource>) => (resource = stateResource),
-    );
-    sub.unsubscribe();
+    this.bescheidDraftService
+      .selectResource()
+      .pipe(take(1))
+      .subscribe((stateResource: StateResource<BescheidResource>) => (resource = stateResource));
 
     return resource.resource;
   }
diff --git a/alfa-client/libs/tech-shared/src/lib/resource/resource.service.spec.ts b/alfa-client/libs/tech-shared/src/lib/resource/resource.service.spec.ts
index d61b71c6e5..1a15c29a58 100644
--- a/alfa-client/libs/tech-shared/src/lib/resource/resource.service.spec.ts
+++ b/alfa-client/libs/tech-shared/src/lib/resource/resource.service.spec.ts
@@ -150,20 +150,20 @@ describe('ResourceService', () => {
   describe('handle config resource changes', () => {
     const stateResource: StateResource<Resource> = createStateResource(createDummyResource());
 
+    it('should update configresource', () => {
+      service.configResource = createDummyResource();
+
+      service.handleResourceChanges(stateResource, configResource);
+
+      expect(service.configResource).toBe(configResource);
+    });
+
     describe('on stable stateresource', () => {
       beforeEach(() => {
         jest.spyOn(ResourceUtil, 'isStateResoureStable').mockReturnValue(true);
         service.updateStateResourceByConfigResource = jest.fn();
       });
 
-      it('should update configresource', () => {
-        service.configResource = createDummyResource();
-
-        service.handleResourceChanges(stateResource, configResource);
-
-        expect(service.configResource).toBe(configResource);
-      });
-
       it('should update stateresource by configresource', () => {
         service.handleResourceChanges(stateResource, configResource);
 
@@ -179,15 +179,6 @@ describe('ResourceService', () => {
         jest.spyOn(ResourceUtil, 'isStateResoureStable').mockReturnValue(false);
       });
 
-      it('should NOT update configresource', () => {
-        const currentConfigResource = createDummyResource();
-        service.configResource = currentConfigResource;
-
-        service.handleResourceChanges(stateResource, configResource);
-
-        expect(service.configResource).toBe(currentConfigResource);
-      });
-
       it('should NOT update stateresource by configresource', () => {
         service.updateStateResourceByConfigResource = jest.fn();
 
@@ -500,6 +491,16 @@ describe('ResourceService', () => {
       expect(existResource$).toBeObservable(singleCold(false));
     });
   });
+
+  describe('select resource', () => {
+    it('should return state resource', () => {
+      service.stateResource.next(dummyStateResource);
+
+      const resource$: Observable<StateResource<Resource>> = service.selectResource();
+
+      expect(resource$).toBeObservable(singleCold(dummyStateResource));
+    });
+  });
 });
 
 export class DummyResourceService<B extends Resource, T extends Resource> extends ResourceService<
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 8a05ace866..a69b290c80 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
@@ -39,7 +39,7 @@ export abstract class ResourceService<B extends Resource, T extends Resource> {
     createEmptyStateResource(),
   );
 
-  configResource: B;
+  configResource: B = null;
 
   constructor(
     protected config: ResourceServiceConfig<B>,
@@ -78,8 +78,8 @@ export abstract class ResourceService<B extends Resource, T extends Resource> {
   }
 
   handleConfigResourceChanges(stateResource: StateResource<T>, configResource: B) {
+    this.configResource = configResource;
     if (isStateResoureStable(stateResource)) {
-      this.configResource = configResource;
       this.updateStateResourceByConfigResource(stateResource, configResource);
     }
   }
@@ -168,4 +168,8 @@ export abstract class ResourceService<B extends Resource, T extends Resource> {
   public existResource(): Observable<boolean> {
     return this.stateResource.asObservable().pipe(mapToResource<T>(), map(isNotNull));
   }
+
+  public selectResource(): Observable<StateResource<T>> {
+    return this.stateResource.asObservable();
+  }
 }
-- 
GitLab