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