From 122c72ec522e72e24c8fe9fa6a3d59c636807e66 Mon Sep 17 00:00:00 2001
From: Florent Poittevin <florent.poittevin@unige.ch>
Date: Wed, 10 Jul 2019 10:52:30 +0200
Subject: [PATCH] Fix submission policy on org unit

---
 .../relation-2-tiers.state.ts                 |  6 +--
 .../core/stores/resource/resource.state.ts    | 15 +++---
 .../organizational-unit.state.ts              | 13 ++---
 src/app/stores/app.action.ts                  |  4 ++
 src/app/stores/app.state.ts                   | 53 ++++++++++++-------
 5 files changed, 53 insertions(+), 38 deletions(-)

diff --git a/src/app/core/stores/relation-2-tiers/relation-2-tiers.state.ts b/src/app/core/stores/relation-2-tiers/relation-2-tiers.state.ts
index 0d1164ba0..cc65fb416 100644
--- a/src/app/core/stores/relation-2-tiers/relation-2-tiers.state.ts
+++ b/src/app/core/stores/relation-2-tiers/relation-2-tiers.state.ts
@@ -1,10 +1,10 @@
 import {ApiService} from "@app/core/http/api.service";
+import {BaseResourceState} from "@app/core/models/stores/base-resource.state";
 import {NotificationService} from "@app/core/services/notification.service";
-import {Relation2TiersAction} from "@app/core/stores/relation-2-tiers/relation-2-tiers.action";
-import {Relation2TiersNameSpace} from "@app/core/stores/relation-2-tiers/relation-2-tiers-namespace.model";
 import {Relation2TiersActionHelper} from "@app/core/stores/relation-2-tiers/relation-2-tiers-action.helper";
+import {Relation2TiersNameSpace} from "@app/core/stores/relation-2-tiers/relation-2-tiers-namespace.model";
+import {Relation2TiersAction} from "@app/core/stores/relation-2-tiers/relation-2-tiers.action";
 import {StoreUtil} from "@app/core/utils/stores/store.util";
-import {BaseResourceState} from "@app/core/models/stores/base-resource.state";
 import {RegisterDefaultAction} from "@app/shared/decorators/store.decorator";
 import {ApiResourceNameEnum} from "@app/shared/enums/api-resource-name.enum";
 import {ResourceApiEnum} from "@app/shared/enums/api.enum";
diff --git a/src/app/core/stores/resource/resource.state.ts b/src/app/core/stores/resource/resource.state.ts
index c992e685a..d28344633 100644
--- a/src/app/core/stores/resource/resource.state.ts
+++ b/src/app/core/stores/resource/resource.state.ts
@@ -12,6 +12,7 @@ import {ModelAttributeEnum} from "@app/shared/enums/model-attribute.enum";
 import {StateEnum} from "@app/shared/enums/state.enum";
 import {CollectionTypedModel} from "@app/shared/models/collection-typed.model";
 import {QueryParametersModel} from "@app/shared/models/query-parameters.model";
+import {StateModel} from "@app/shared/models/state.model";
 import {Navigate} from "@ngxs/router-plugin";
 import {StateContext, Store} from "@ngxs/store";
 import {Observable} from "rxjs";
@@ -35,12 +36,12 @@ export const defaultResourceStateInitValue: ResourceStateModel<any> = {
 export abstract class ResourceState<T> {
   protected readonly state: StateEnum;
   protected readonly resourceNameSpace: ResourceNameSpace;
-  protected readonly urlResource: ResourceApiEnum;
+  private _urlResource: ResourceApiEnum;
 
   protected constructor(protected apiService: ApiService,
                         protected store: Store,
                         protected notificationService: NotificationService) {
-    this.urlResource = this.defineUrlResource();
+    this.store.select((state: StateModel) => state[StateEnum.application].isApplicationInitialized).subscribe(() => this._urlResource = this.defineUrlResource());
     this.state = this.defineState();
     this.resourceNameSpace = this.defineResourceNameSpace();
     StoreUtil.initState(ResourceState, this.constructor, this.resourceNameSpace);
@@ -69,7 +70,7 @@ export abstract class ResourceState<T> {
 
     const queryParameters = StoreUtil.getQueryParametersToApply(action.queryParameters, ctx);
 
-    return this.apiService.get<T>(this.urlResource, queryParameters)
+    return this.apiService.get<T>(this._urlResource, queryParameters)
       .pipe(
         tap((collection: CollectionTypedModel<T>) => {
           ctx.dispatch(ResourceActionHelper.getAllSuccess<T>(this.resourceNameSpace, collection));
@@ -107,7 +108,7 @@ export abstract class ResourceState<T> {
       current: null,
     });
 
-    return this.apiService.getById<T>(this.urlResource, action.id)
+    return this.apiService.getById<T>(this._urlResource, action.id)
       .pipe(
         tap((model: T) => {
           ctx.dispatch(ResourceActionHelper.getByIdSuccess(this.resourceNameSpace, model));
@@ -140,7 +141,7 @@ export abstract class ResourceState<T> {
       isLoading: true,
     });
 
-    return this.apiService.post<T>(this.urlResource, action.model)
+    return this.apiService.post<T>(this._urlResource, action.model)
       .pipe(
         tap(() => {
           ctx.dispatch(ResourceActionHelper.createSuccess(this.resourceNameSpace));
@@ -176,7 +177,7 @@ export abstract class ResourceState<T> {
       isLoading: true,
     });
 
-    return this.apiService.patchById<T>(this.urlResource, action.model[ModelAttributeEnum.resId], action.model)
+    return this.apiService.patchById<T>(this._urlResource, action.model[ModelAttributeEnum.resId], action.model)
       .pipe(
         tap(() => {
           ctx.dispatch(ResourceActionHelper.updateSuccess(this.resourceNameSpace));
@@ -212,7 +213,7 @@ export abstract class ResourceState<T> {
       isLoading: true,
     });
 
-    return this.apiService.deleteById<T>(this.urlResource, action.resId)
+    return this.apiService.deleteById<T>(this._urlResource, action.resId)
       .pipe(
         tap(() => {
           ctx.dispatch(ResourceActionHelper.deleteSuccess(this.resourceNameSpace));
diff --git a/src/app/shared/stores/organizational-unit/organizational-unit.state.ts b/src/app/shared/stores/organizational-unit/organizational-unit.state.ts
index f6da7d7b8..0df67145c 100644
--- a/src/app/shared/stores/organizational-unit/organizational-unit.state.ts
+++ b/src/app/shared/stores/organizational-unit/organizational-unit.state.ts
@@ -1,31 +1,28 @@
-import {StateModel} from "@app/shared/models/state.model";
-import {AppStateModel} from "@app/stores/app.state";
-
 import {ApiService} from "@app/core/http/api.service";
 import {NotificationService} from "@app/core/services/notification.service";
+import {Relation2TiersActionHelper} from "@app/core/stores/relation-2-tiers/relation-2-tiers-action.helper";
+import {defaultResourceStateInitValue, ResourceState, ResourceStateModel} from "@app/core/stores/resource/resource.state";
 import {DepositStateModel} from "@app/deposit/stores/deposit.state";
 import {OrganizationalUnitsModel} from "@app/generated-api";
-import {ResourceNameSpace} from "../../../core/stores/resource/resource.namespace";
-import {ResourceState, ResourceStateModel, defaultResourceStateInitValue} from "@app/core/stores/resource/resource.state";
 import {OverrideDefaultAction} from "@app/shared/decorators/store.decorator";
 import {AccessResourceApiEnum, AdminResourceApiEnum, ResourceApiEnum} from "@app/shared/enums/api.enum";
 import {ModelAttributeEnum} from "@app/shared/enums/model-attribute.enum";
 import {StateEnum} from "@app/shared/enums/state.enum";
-import {QueryParametersModel} from "@app/shared/models/query-parameters.model";
+import {StateModel} from "@app/shared/models/state.model";
+import {OrgUnitAction, orgUnitActionNameSpace} from "@app/shared/stores/organizational-unit/organizational-unit.action";
 import {orgUnitSubmissionPolicyActionNameSpace} from "@app/shared/stores/organizational-unit/submission-policy/organizational-unit-submission-policy.action";
 import {
   OrganizationalUnitSubmissionPolicyState,
   OrganizationalUnitSubmissionPolicyStateModel,
 } from "@app/shared/stores/organizational-unit/submission-policy/organizational-unit-submission-policy.state";
-import {OrgUnitAction, orgUnitActionNameSpace} from "@app/shared/stores/organizational-unit/organizational-unit.action";
 import {PreservationPolicyAction} from "@app/shared/stores/preservation-policy/preservation-policy.action";
 import {SubmissionPolicyAction} from "@app/shared/stores/submission-policy/submission-policy.action";
-import {Relation2TiersActionHelper} from "@app/core/stores/relation-2-tiers/relation-2-tiers-action.helper";
 import {Action, State, StateContext, Store} from "@ngxs/store";
 
 import _ from "lodash";
 import {Observable} from "rxjs";
 import {tap} from "rxjs/internal/operators/tap";
+import {ResourceNameSpace} from "../../../core/stores/resource/resource.namespace";
 
 export interface OrganizationalUnitStateModel extends ResourceStateModel<OrganizationalUnitsModel> {
   [StateEnum.organizationalUnitSubResourceSubmissionPolicy]?: OrganizationalUnitSubmissionPolicyStateModel;
diff --git a/src/app/stores/app.action.ts b/src/app/stores/app.action.ts
index 60160b996..7d6add5ff 100644
--- a/src/app/stores/app.action.ts
+++ b/src/app/stores/app.action.ts
@@ -4,6 +4,10 @@ export class InitApplication {
   static readonly type: string = "[App] Init Application";
 }
 
+export class InitApplicationSuccess {
+  static readonly type: string = "[App] Init Application Success";
+}
+
 export class SetDefaultLanguage {
   static readonly type: string = "[App] Set Default Language";
 }
diff --git a/src/app/stores/app.state.ts b/src/app/stores/app.state.ts
index 009b87283..3ccc3dcf3 100644
--- a/src/app/stores/app.state.ts
+++ b/src/app/stores/app.state.ts
@@ -1,57 +1,70 @@
+import {OAuth2Service} from "@app/core/auth/oauth2.service";
+import {LanguagesEnum} from "@app/shared/enums/languages.enum";
+import {RoutesEnum} from "@app/shared/enums/routes.enum";
+import {SessionStorageEnum} from "@app/shared/enums/session-storage.enum";
+import {StateEnum} from "@app/shared/enums/state.enum";
+import {UserPreferencesUtil} from "@app/shared/utils/user-preferences.util";
 import {
   ChangeAppLanguage,
   InitApplication,
+  InitApplicationSuccess,
   Login,
   LoginFail,
   LoginSuccess,
   Logout,
   SetDefaultLanguage,
-  SetMomentLocal
+  SetMomentLocal,
 } from "@app/stores/app.action";
-import {LanguagesEnum} from "@app/shared/enums/languages.enum";
-import {RoutesEnum} from "@app/shared/enums/routes.enum";
-import {SessionStorageEnum} from "@app/shared/enums/session-storage.enum";
-import {StateEnum} from "@app/shared/enums/state.enum";
-import {UserPreferencesUtil} from "@app/shared/utils/user-preferences.util";
 import {TranslateService} from "@ngx-translate/core";
 import {Navigate} from "@ngxs/router-plugin";
-import {Action, State, StateContext, Store} from "@ngxs/store";
+import {Action, Actions, ofActionCompleted, State, StateContext, Store} from "@ngxs/store";
 import * as moment from "moment";
 import {Observable} from "rxjs";
+import {merge} from "rxjs/internal/observable/merge";
+import {zip} from "rxjs/internal/observable/zip";
 import {tap} from "rxjs/operators";
-import {OAuth2Service} from "@app/core/auth/oauth2.service";
-import {BaseState} from "@app/core/models/stores/base.state";
 import {environment} from "../../environments/environment";
 
 
-export interface AppStateModel extends BaseState {
-  appLanguage: LanguagesEnum;
+export interface AppStateModel {
+  isApplicationInitialized: boolean;
   isLoggedIn: boolean;
+  appLanguage: LanguagesEnum;
 }
 
 @State<AppStateModel>({
   name: StateEnum.application,
   defaults: {
-    appLanguage: UserPreferencesUtil.getPreferredLanguage(),
-    isLoading: false,
+    isApplicationInitialized: false,
     isLoggedIn: false,
+    appLanguage: UserPreferencesUtil.getPreferredLanguage(),
   },
 })
 export class AppState {
   constructor(private store: Store,
               private translate: TranslateService,
-              private oauthService: OAuth2Service) {
+              private oauthService: OAuth2Service,
+              private actions$: Actions) {
     this.oauthService.setupAutomaticRefreshToken();
   }
 
-
   @Action(InitApplication)
   initApplication(ctx: StateContext<AppStateModel>): void {
-    ctx.dispatch([
-      new Login(),
-      new SetDefaultLanguage(),
-      new SetMomentLocal(),
-    ]);
+    zip(
+      merge(this.actions$.pipe(ofActionCompleted(LoginSuccess)), this.actions$.pipe(ofActionCompleted(LoginFail))),
+      ctx.dispatch([
+        new Login(),
+        new SetDefaultLanguage(),
+        new SetMomentLocal(),
+      ]),
+    ).subscribe(() => ctx.dispatch(new InitApplicationSuccess()));
+  }
+
+  @Action(InitApplicationSuccess)
+  initApplicationSuccess(ctx: StateContext<AppStateModel>): void {
+    ctx.patchState({
+      isApplicationInitialized: true,
+    });
   }
 
   @Action(SetDefaultLanguage)
-- 
GitLab