From f8a1cefe11c4a00feac8aee01317bd73f1fde7e4 Mon Sep 17 00:00:00 2001
From: OZGCloud <ozgcloud@mgm-tp.com>
Date: Fri, 17 May 2024 17:42:34 +0200
Subject: [PATCH] OZG-5012 move resource service creation/configuration to
 module

---
 .../lib/admin-settings-resource.service.ts    | 32 +++++++++
 .../src/lib/admin-settings.module.ts          | 22 +++++-
 .../src/lib/admin-settings.service.spec.ts    | 69 +++++--------------
 .../src/lib/admin-settings.service.ts         | 37 ++--------
 .../configuration-resource.service.ts         | 26 +++++++
 .../configuration.service.spec.ts             | 41 ++++-------
 .../configuration/configuration.service.ts    | 29 ++------
 .../lib/postfach/postfach-resource.service.ts |  2 +-
 .../src/lib/postfach/postfach.service.ts      |  6 +-
 .../src/lib/bescheid.service.ts               |  1 +
 10 files changed, 125 insertions(+), 140 deletions(-)
 create mode 100644 alfa-client/libs/admin-settings/src/lib/admin-settings-resource.service.ts
 create mode 100644 alfa-client/libs/admin-settings/src/lib/configuration/configuration-resource.service.ts

diff --git a/alfa-client/libs/admin-settings/src/lib/admin-settings-resource.service.ts b/alfa-client/libs/admin-settings/src/lib/admin-settings-resource.service.ts
new file mode 100644
index 0000000000..80f52d0a1e
--- /dev/null
+++ b/alfa-client/libs/admin-settings/src/lib/admin-settings-resource.service.ts
@@ -0,0 +1,32 @@
+import {
+  ListResourceServiceConfig,
+  ResourceListService,
+  ResourceRepository,
+} from '@alfa-client/tech-shared';
+import { Resource } from '@ngxp/rest';
+import { SettingListLinkRel } from './admin-settings.linkrel';
+import { SettingItemResource, SettingListResource } from './admin-settings.model';
+import { ConfigurationResource } from './configuration/configuration.model';
+import { ConfigurationService } from './configuration/configuration.service';
+
+export class SettingListResourceService extends ResourceListService<
+  Resource,
+  SettingListResource,
+  SettingItemResource
+> {}
+
+export function createSettingListResourceService(
+  repository: ResourceRepository,
+  configurationService: ConfigurationService,
+) {
+  return new ResourceListService(buildConfig(configurationService), repository);
+}
+function buildConfig(
+  configurationService: ConfigurationService,
+): ListResourceServiceConfig<ConfigurationResource> {
+  return {
+    baseResource: configurationService.get(),
+    createLinkRel: SettingListLinkRel.CREATE,
+    listLinkRel: SettingListLinkRel.LIST,
+  };
+}
diff --git a/alfa-client/libs/admin-settings/src/lib/admin-settings.module.ts b/alfa-client/libs/admin-settings/src/lib/admin-settings.module.ts
index 6cf1530cea..2825dda0c7 100644
--- a/alfa-client/libs/admin-settings/src/lib/admin-settings.module.ts
+++ b/alfa-client/libs/admin-settings/src/lib/admin-settings.module.ts
@@ -5,7 +5,15 @@ import { NgModule } from '@angular/core';
 import { ReactiveFormsModule } from '@angular/forms';
 import { RouterModule } from '@angular/router';
 import KcAdminClient from '@keycloak/keycloak-admin-client';
+import {
+  SettingListResourceService,
+  createSettingListResourceService,
+} from './admin-settings-resource.service';
 import { SettingsService } from './admin-settings.service';
+import {
+  ConfigurationResourceService,
+  createConfigurationResourceService,
+} from './configuration/configuration-resource.service';
 import { ConfigurationService } from './configuration/configuration.service';
 import { NavigationComponent } from './navigation/navigation.component';
 import { OrganisationseinheitContainerComponent } from './organisationseinheit/organisationseinheit-container/organisationseinheit-container.component';
@@ -17,7 +25,7 @@ import { PostfachFormComponent } from './postfach/postfach-container/postfach-fo
 import { PostfachNavigationItemComponent } from './postfach/postfach-navigation-item/postfach-navigation-item.component';
 import {
   PostfachResourceService,
-  postfachResourceServiceFactory,
+  createPostfachResourceService,
 } from './postfach/postfach-resource.service';
 import { PostfachService } from './postfach/postfach.service';
 import { MoreItemButtonComponent } from './shared/more-menu/more-item-button/more-item-button.component';
@@ -68,9 +76,19 @@ import { TextFieldComponent } from './shared/text-field/text-field.component';
     },
     {
       provide: PostfachResourceService,
-      useFactory: postfachResourceServiceFactory,
+      useFactory: createPostfachResourceService,
       deps: [ResourceRepository, SettingsService],
     },
+    {
+      provide: ConfigurationResourceService,
+      useFactory: createConfigurationResourceService,
+      deps: [ResourceRepository, SettingsService],
+    },
+    {
+      provide: SettingListResourceService,
+      useFactory: createSettingListResourceService,
+      deps: [ResourceRepository, ConfigurationService],
+    },
   ],
 })
 export class AdminSettingsModule {}
diff --git a/alfa-client/libs/admin-settings/src/lib/admin-settings.service.spec.ts b/alfa-client/libs/admin-settings/src/lib/admin-settings.service.spec.ts
index aef5af45a7..0dae05ec7a 100644
--- a/alfa-client/libs/admin-settings/src/lib/admin-settings.service.spec.ts
+++ b/alfa-client/libs/admin-settings/src/lib/admin-settings.service.spec.ts
@@ -1,69 +1,32 @@
-import { Mock, mock, useFromMock } from '@alfa-client/test-utils';
-import { SettingsService } from './admin-settings.service';
-import { SettingListResource } from './admin-settings.model';
 import {
+  StateResource,
   createEmptyStateResource,
   createStateResource,
-  ListResourceServiceConfig,
-  ResourceRepository,
-  StateResource,
 } from '@alfa-client/tech-shared';
+import { Mock, mock, useFromMock } from '@alfa-client/test-utils';
 import { Observable, of } from 'rxjs';
-import { PostfachResource } from './postfach/postfach.model';
-import { createSettingItemResource, createPostfachResource } from '../../test/postfach/postfach';
-import { createSettingsListResource } from '../../test/admin-settings';
-import { ConfigurationService } from './configuration/configuration.service';
-import { createConfigurationResource } from '../../test/configuration/configuration';
-import { ConfigurationResource } from './configuration/configuration.model';
 import { singleCold } from '../../../tech-shared/test/marbles';
-import { SettingListLinkRel } from './admin-settings.linkrel';
+import { createSettingsListResource } from '../../test/admin-settings';
+import { createPostfachResource, createSettingItemResource } from '../../test/postfach/postfach';
+import { SettingListResourceService } from './admin-settings-resource.service';
+import { SettingListResource } from './admin-settings.model';
+import { SettingsService } from './admin-settings.service';
+import { PostfachResource } from './postfach/postfach.model';
 
 describe('SettingsService', () => {
   let service: SettingsService;
-  let configurationService: Mock<ConfigurationService>;
-  let repository: Mock<ResourceRepository>;
-
-  const configurationStateResource$: Observable<StateResource<ConfigurationResource>> = of(
-    createStateResource(createConfigurationResource()),
-  );
+  let settingListResourceService: Mock<SettingListResourceService>;
 
   beforeEach(() => {
-    configurationService = mock(ConfigurationService);
-    configurationService.getConfigurationResource.mockReturnValue(configurationStateResource$);
-
-    repository = mock(ResourceRepository);
+    settingListResourceService = mock(SettingListResourceService);
 
-    service = new SettingsService(useFromMock(configurationService), useFromMock(repository));
+    service = new SettingsService(useFromMock(settingListResourceService));
   });
 
   it('should create', () => {
     expect(service).toBeTruthy();
   });
 
-  it('should create resourceService', () => {
-    expect(service.resourceService).toBeTruthy();
-  });
-
-  describe('build config', () => {
-    it('should have baseResource', () => {
-      const config: ListResourceServiceConfig<ConfigurationResource> = service.buildConfig();
-
-      expect(config.baseResource).toBe(configurationStateResource$);
-    });
-
-    it('should have createLinkRel', () => {
-      const config: ListResourceServiceConfig<ConfigurationResource> = service.buildConfig();
-
-      expect(config.createLinkRel).toBe(SettingListLinkRel.CREATE);
-    });
-
-    it('should have istLinKRel', () => {
-      const config: ListResourceServiceConfig<ConfigurationResource> = service.buildConfig();
-
-      expect(config.listLinkRel).toBe(SettingListLinkRel.LIST);
-    });
-  });
-
   describe('get Postfach', () => {
     const postfachResource = createPostfachResource();
     const postfachStateResource: StateResource<PostfachResource> =
@@ -73,13 +36,13 @@ describe('SettingsService', () => {
     );
 
     beforeEach(() => {
-      service.resourceService.getList = jest.fn().mockReturnValue(of(settingsListResource));
+      settingListResourceService.getList = jest.fn().mockReturnValue(of(settingsListResource));
     });
 
     it('should call resource service', () => {
       service.getPostfach();
 
-      expect(service.resourceService.getList).toHaveBeenCalled();
+      expect(settingListResourceService.getList).toHaveBeenCalled();
     });
 
     it('should return null for non postfach resource', () => {
@@ -87,7 +50,7 @@ describe('SettingsService', () => {
         createSettingsListResource([createSettingItemResource()]),
       );
 
-      service.resourceService.getList = jest
+      settingListResourceService.getList = jest
         .fn()
         .mockReturnValue(singleCold(emptySettingsListResource));
 
@@ -96,7 +59,9 @@ describe('SettingsService', () => {
     });
 
     it('should return item resource as postfach resource', () => {
-      service.resourceService.getList = jest.fn().mockReturnValue(singleCold(settingsListResource));
+      settingListResourceService.getList = jest
+        .fn()
+        .mockReturnValue(singleCold(settingsListResource));
 
       const postfach: Observable<StateResource<PostfachResource>> = service.getPostfach();
 
diff --git a/alfa-client/libs/admin-settings/src/lib/admin-settings.service.ts b/alfa-client/libs/admin-settings/src/lib/admin-settings.service.ts
index d87daa538d..10697e4a4b 100644
--- a/alfa-client/libs/admin-settings/src/lib/admin-settings.service.ts
+++ b/alfa-client/libs/admin-settings/src/lib/admin-settings.service.ts
@@ -1,40 +1,15 @@
-import { Injectable } from '@angular/core';
-import { ResourceListService } from 'libs/tech-shared/src/lib/resource/list-resource.service';
-import { SettingItemResource, SettingListResource } from './admin-settings.model';
-import { ResourceRepository } from 'libs/tech-shared/src/lib/resource/resource.repository';
-import { ListResourceServiceConfig } from 'libs/tech-shared/src/lib/resource/resource.model';
-import { map, Observable } from 'rxjs';
 import { StateResource } from '@alfa-client/tech-shared';
-import { PostfachResource } from './postfach/postfach.model';
-import { ConfigurationService } from './configuration/configuration.service';
-import { ConfigurationResource } from './configuration/configuration.model';
+import { Injectable } from '@angular/core';
+import { Observable, map } from 'rxjs';
+import { SettingListResourceService } from './admin-settings-resource.service';
 import { getPostfachResource } from './admin-settings.util';
-import { SettingListLinkRel } from './admin-settings.linkrel';
+import { PostfachResource } from './postfach/postfach.model';
 
 @Injectable()
 export class SettingsService {
-  resourceService: ResourceListService<
-    ConfigurationResource,
-    SettingListResource,
-    SettingItemResource
-  >;
-
-  constructor(
-    private configurationService: ConfigurationService,
-    repository: ResourceRepository,
-  ) {
-    this.resourceService = new ResourceListService(this.buildConfig(), repository);
-  }
-
-  buildConfig(): ListResourceServiceConfig<ConfigurationResource> {
-    return {
-      baseResource: this.configurationService.getConfigurationResource(),
-      createLinkRel: SettingListLinkRel.CREATE,
-      listLinkRel: SettingListLinkRel.LIST,
-    };
-  }
+  constructor(private settingListResourceService: SettingListResourceService) {}
 
   public getPostfach(): Observable<StateResource<PostfachResource>> {
-    return this.resourceService.getList().pipe(map(getPostfachResource));
+    return this.settingListResourceService.getList().pipe(map(getPostfachResource));
   }
 }
diff --git a/alfa-client/libs/admin-settings/src/lib/configuration/configuration-resource.service.ts b/alfa-client/libs/admin-settings/src/lib/configuration/configuration-resource.service.ts
new file mode 100644
index 0000000000..f73458583b
--- /dev/null
+++ b/alfa-client/libs/admin-settings/src/lib/configuration/configuration-resource.service.ts
@@ -0,0 +1,26 @@
+import { ApiRootLinkRel, ApiRootResource, ApiRootService } from '@alfa-client/api-root-shared';
+import {
+  ApiResourceService,
+  ResourceRepository,
+  ResourceServiceConfig,
+} from '@alfa-client/tech-shared';
+import { ConfigurationResource } from './configuration.model';
+
+export class ConfigurationResourceService extends ApiResourceService<
+  ApiRootResource,
+  ConfigurationResource
+> {}
+
+export function createConfigurationResourceService(
+  repository: ResourceRepository,
+  apiRootService: ApiRootService,
+) {
+  return new ApiResourceService(buildConfig(apiRootService), repository);
+}
+
+function buildConfig(apiRootService: ApiRootService): ResourceServiceConfig<ApiRootResource> {
+  return {
+    resource: apiRootService.getApiRoot(),
+    getLinkRel: ApiRootLinkRel.CONFIGURATION,
+  };
+}
diff --git a/alfa-client/libs/admin-settings/src/lib/configuration/configuration.service.spec.ts b/alfa-client/libs/admin-settings/src/lib/configuration/configuration.service.spec.ts
index 0df242498f..df7a4250f9 100644
--- a/alfa-client/libs/admin-settings/src/lib/configuration/configuration.service.spec.ts
+++ b/alfa-client/libs/admin-settings/src/lib/configuration/configuration.service.spec.ts
@@ -1,60 +1,47 @@
-import { ApiRootService, ApiRootResource } from '@alfa-client/api-root-shared';
-import { ResourceRepository, StateResource, createStateResource } from '@alfa-client/tech-shared';
+import { StateResource, createStateResource } from '@alfa-client/tech-shared';
 import { Mock, mock, useFromMock } from '@alfa-client/test-utils';
-import { createApiRootResource } from 'libs/api-root-shared/test/api-root';
-import { Observable, of } from 'rxjs';
-import { ConfigurationResource } from './configuration.model';
-import { ConfigurationService } from './configuration.service';
+import { Observable } from 'rxjs';
 import { singleCold, singleHot } from '../../../../tech-shared/test/marbles';
 import { createConfigurationResource } from '../../../test/configuration/configuration';
+import { ConfigurationResourceService } from './configuration-resource.service';
+import { ConfigurationResource } from './configuration.model';
+import { ConfigurationService } from './configuration.service';
 
 describe('ConfigurationService', () => {
   let service: ConfigurationService;
-  let apiRootService: Mock<ApiRootService>;
-  let repository: Mock<ResourceRepository>;
-
-  const apiRootStateResource$: Observable<StateResource<ApiRootResource>> = of(
-    createStateResource(createApiRootResource()),
-  );
+  let configurationResourceService: Mock<ConfigurationResourceService>;
 
   beforeEach(() => {
-    apiRootService = mock(ApiRootService);
-    apiRootService.getApiRoot.mockReturnValue(apiRootStateResource$);
-
-    repository = mock(ResourceRepository);
+    configurationResourceService = mock(ConfigurationResourceService);
 
-    service = new ConfigurationService(useFromMock(apiRootService), useFromMock(repository));
+    service = new ConfigurationService(useFromMock(configurationResourceService));
   });
 
   it('should create', () => {
     expect(service).toBeTruthy();
   });
 
-  it('should create resourceService', () => {
-    expect(service.resourceService).toBeTruthy();
-  });
-
-  describe('get configuration resource', () => {
+  describe('get', () => {
     const configurationResource: ConfigurationResource = createConfigurationResource();
     const configurationStateResource: StateResource<ConfigurationResource> =
       createStateResource(configurationResource);
 
     beforeEach(() => {
-      service.resourceService.get = jest
+      configurationResourceService.get = jest
         .fn()
         .mockReturnValue(singleHot(configurationStateResource));
     });
     it('should call resourceService', () => {
-      service.resourceService.get = jest.fn();
+      configurationResourceService.get = jest.fn();
 
-      service.getConfigurationResource();
+      service.get();
 
-      expect(service.resourceService.get).toHaveBeenCalled();
+      expect(configurationResourceService.get).toHaveBeenCalled();
     });
 
     it('should return value', () => {
       const loadedConfigurationResource: Observable<StateResource<ConfigurationResource>> =
-        service.getConfigurationResource();
+        service.get();
 
       expect(loadedConfigurationResource).toBeObservable(singleCold(configurationStateResource));
     });
diff --git a/alfa-client/libs/admin-settings/src/lib/configuration/configuration.service.ts b/alfa-client/libs/admin-settings/src/lib/configuration/configuration.service.ts
index a05704eabd..6c0ed41b4b 100644
--- a/alfa-client/libs/admin-settings/src/lib/configuration/configuration.service.ts
+++ b/alfa-client/libs/admin-settings/src/lib/configuration/configuration.service.ts
@@ -1,33 +1,14 @@
-import { ApiRootLinkRel, ApiRootResource, ApiRootService } from '@alfa-client/api-root-shared';
-import {
-  ApiResourceService,
-  ResourceRepository,
-  ResourceServiceConfig,
-  StateResource,
-} from '@alfa-client/tech-shared';
+import { StateResource } from '@alfa-client/tech-shared';
 import { Injectable } from '@angular/core';
 import { Observable } from 'rxjs';
+import { ConfigurationResourceService } from './configuration-resource.service';
 import { ConfigurationResource } from './configuration.model';
 
 @Injectable()
 export class ConfigurationService {
-  resourceService: ApiResourceService<ApiRootResource, ConfigurationResource>;
+  constructor(private configurationResourceService: ConfigurationResourceService) {}
 
-  constructor(
-    private apiRootService: ApiRootService,
-    repository: ResourceRepository,
-  ) {
-    this.resourceService = new ApiResourceService(this.buildConfig(), repository);
-  }
-
-  buildConfig(): ResourceServiceConfig<ApiRootResource> {
-    return {
-      resource: this.apiRootService.getApiRoot(),
-      getLinkRel: ApiRootLinkRel.CONFIGURATION,
-    };
-  }
-
-  public getConfigurationResource(): Observable<StateResource<ConfigurationResource>> {
-    return this.resourceService.get();
+  public get(): Observable<StateResource<ConfigurationResource>> {
+    return this.configurationResourceService.get();
   }
 }
diff --git a/alfa-client/libs/admin-settings/src/lib/postfach/postfach-resource.service.ts b/alfa-client/libs/admin-settings/src/lib/postfach/postfach-resource.service.ts
index 4f84f805d1..07f664fc22 100644
--- a/alfa-client/libs/admin-settings/src/lib/postfach/postfach-resource.service.ts
+++ b/alfa-client/libs/admin-settings/src/lib/postfach/postfach-resource.service.ts
@@ -12,7 +12,7 @@ export class PostfachResourceService extends ApiResourceService<
   PostfachResource
 > {}
 
-export function postfachResourceServiceFactory(
+export function createPostfachResourceService(
   repository: ResourceRepository,
   settingService: SettingsService,
 ) {
diff --git a/alfa-client/libs/admin-settings/src/lib/postfach/postfach.service.ts b/alfa-client/libs/admin-settings/src/lib/postfach/postfach.service.ts
index 4aaad195e8..24eb2f3b5b 100644
--- a/alfa-client/libs/admin-settings/src/lib/postfach/postfach.service.ts
+++ b/alfa-client/libs/admin-settings/src/lib/postfach/postfach.service.ts
@@ -7,14 +7,14 @@ import { Postfach, PostfachResource, PostfachSettingsItem } from './postfach.mod
 
 @Injectable()
 export class PostfachService {
-  constructor(private resourceService: PostfachResourceService) {}
+  constructor(private postfachResourceService: PostfachResourceService) {}
 
   public get(): Observable<StateResource<PostfachResource>> {
-    return this.resourceService.get();
+    return this.postfachResourceService.get();
   }
 
   public save(postfach: Postfach): Observable<StateResource<PostfachResource | HttpError>> {
-    return this.resourceService.save(this.buildPostfachSettingItem(postfach));
+    return this.postfachResourceService.save(this.buildPostfachSettingItem(postfach));
   }
 
   private buildPostfachSettingItem(postfach: Postfach): PostfachSettingsItem {
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 adc5321126..2a1800665c 100644
--- a/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.ts
+++ b/alfa-client/libs/bescheid-shared/src/lib/bescheid.service.ts
@@ -123,6 +123,7 @@ export class BescheidService {
       resource: this.vorgangService.getVorgangWithEingang(),
       getLinkRel: VorgangWithEingangLinkRel.BESCHEID_DRAFT,
       delete: { linkRel: BescheidLinkRel.DELETE, order: CommandOrder.DELETE_BESCHEID },
+      edit: { linkRel: BescheidLinkRel.UPDATE, order: CommandOrder.UPDATE_BESCHEID },
     };
   }
 
-- 
GitLab