From c3770076b056861d11f922c620b8930e03abf6b8 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 14 Aug 2020 14:30:19 +0300 Subject: [PATCH 1/6] feat(core): add ngxsStoragePluginOptions property to CoreModule forRoot options resolves #4839 --- .../packages/core/src/lib/core.module.ts | 20 +++++++++++++++++-- .../packages/core/src/lib/models/common.ts | 2 ++ .../core/src/lib/tokens/options.token.ts | 9 +++------ 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/core.module.ts b/npm/ng-packs/packages/core/src/lib/core.module.ts index 85cf87297f..9daa34901b 100644 --- a/npm/ng-packs/packages/core/src/lib/core.module.ts +++ b/npm/ng-packs/packages/core/src/lib/core.module.ts @@ -4,7 +4,11 @@ import { APP_INITIALIZER, Injector, ModuleWithProviders, NgModule } from '@angul import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { RouterModule } from '@angular/router'; import { NgxsRouterPluginModule } from '@ngxs/router-plugin'; -import { NgxsStoragePluginModule } from '@ngxs/storage-plugin'; +import { + NgxsStoragePluginModule, + NGXS_STORAGE_PLUGIN_OPTIONS, + StorageOption, +} from '@ngxs/storage-plugin'; import { NgxsModule, NGXS_PLUGINS } from '@ngxs/store'; import { OAuthModule, OAuthStorage } from 'angular-oauth2-oidc'; import { AbstractNgModelComponent } from './abstracts/ng-model.component'; @@ -118,7 +122,7 @@ export class BaseCoreModule {} LocalizationModule, NgxsModule.forFeature([ReplaceableComponentsState, ProfileState, SessionState, ConfigState]), NgxsRouterPluginModule.forRoot(), - NgxsStoragePluginModule.forRoot({ key: ['SessionState'] }), + NgxsStoragePluginModule.forRoot(), OAuthModule.forRoot(), ], }) @@ -216,6 +220,18 @@ export class CoreModule { useFactory: noop, }, { provide: OAuthStorage, useFactory: storageFactory }, + { + provide: NGXS_STORAGE_PLUGIN_OPTIONS, + useValue: { + storage: StorageOption.LocalStorage, + serialize: JSON.stringify, + deserialize: JSON.parse, + beforeSerialize: obj => obj, + afterDeserialize: obj => obj, + ...options.ngxsStoragePluginOptions, + key: [...(options.ngxsStoragePluginOptions?.key || []), 'SessionState'], + }, + }, ], }; } diff --git a/npm/ng-packs/packages/core/src/lib/models/common.ts b/npm/ng-packs/packages/core/src/lib/models/common.ts index 85b1138002..b01aed1f26 100644 --- a/npm/ng-packs/packages/core/src/lib/models/common.ts +++ b/npm/ng-packs/packages/core/src/lib/models/common.ts @@ -3,6 +3,7 @@ import { Router } from '@angular/router'; import { Subject } from 'rxjs'; import { eLayoutType } from '../enums/common'; import { Config } from './config'; +import { NgxsStoragePluginOptions } from '@ngxs/storage-plugin'; export namespace ABP { export interface Root { @@ -10,6 +11,7 @@ export namespace ABP { skipGetAppConfiguration?: boolean; sendNullsAsQueryParam?: boolean; cultureNameLocaleFileMap?: Dictionary; + ngxsStoragePluginOptions?: NgxsStoragePluginOptions & { key?: string[] }; } export interface Test { diff --git a/npm/ng-packs/packages/core/src/lib/tokens/options.token.ts b/npm/ng-packs/packages/core/src/lib/tokens/options.token.ts index 4cbb13da76..ac51dbb92e 100644 --- a/npm/ng-packs/packages/core/src/lib/tokens/options.token.ts +++ b/npm/ng-packs/packages/core/src/lib/tokens/options.token.ts @@ -1,15 +1,12 @@ import { InjectionToken } from '@angular/core'; -import { ABP } from '../models/common'; import differentLocales from '../constants/different-locales'; +import { ABP } from '../models/common'; export const CORE_OPTIONS = new InjectionToken('CORE_OPTIONS'); -export function coreOptionsFactory({ - cultureNameLocaleFileMap: localeNameMap = {}, - ...options -}: ABP.Root) { +export function coreOptionsFactory({ cultureNameLocaleFileMap = {}, ...options }: ABP.Root) { return { ...options, - cultureNameLocaleFileMap: { ...differentLocales, ...localeNameMap }, + cultureNameLocaleFileMap: { ...differentLocales, ...cultureNameLocaleFileMap }, } as ABP.Root; } From a8ee1de2a56791ce185b58efa5f06b5300b8a615 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 14 Aug 2020 14:32:24 +0300 Subject: [PATCH 2/6] feat: handle error on OAuthService loading discovery document request --- .../packages/core/src/lib/strategies/auth-flow.strategy.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/npm/ng-packs/packages/core/src/lib/strategies/auth-flow.strategy.ts b/npm/ng-packs/packages/core/src/lib/strategies/auth-flow.strategy.ts index b7aa5601e2..0e86deda69 100644 --- a/npm/ng-packs/packages/core/src/lib/strategies/auth-flow.strategy.ts +++ b/npm/ng-packs/packages/core/src/lib/strategies/auth-flow.strategy.ts @@ -12,6 +12,7 @@ import { GetAppConfiguration } from '../actions/config.actions'; export abstract class AuthFlowStrategy { abstract readonly isInternalAuth: boolean; + protected store: Store; protected oAuthService: OAuthService; protected oAuthConfig: AuthConfig; abstract checkIfInternalAuth(): boolean; @@ -20,12 +21,13 @@ export abstract class AuthFlowStrategy { abstract destroy(): void; private catchError = err => { - // TODO: handle the error + return this.store.dispatch(new RestOccurError(err)); }; constructor(protected injector: Injector) { this.oAuthService = injector.get(OAuthService); this.oAuthConfig = injector.get(CORE_OPTIONS).environment.oAuthConfig; + this.store = injector.get(Store); } async init(): Promise { From dfecca309a5812ec656ec9c7e59895563fe46fcf Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 14 Aug 2020 14:32:57 +0300 Subject: [PATCH 3/6] fix: get core options from the config state in auth-flow.strategy --- .../core/src/lib/strategies/auth-flow.strategy.ts | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/strategies/auth-flow.strategy.ts b/npm/ng-packs/packages/core/src/lib/strategies/auth-flow.strategy.ts index 0e86deda69..9ee2279ec7 100644 --- a/npm/ng-packs/packages/core/src/lib/strategies/auth-flow.strategy.ts +++ b/npm/ng-packs/packages/core/src/lib/strategies/auth-flow.strategy.ts @@ -1,13 +1,13 @@ import { Injector } from '@angular/core'; +import { Router } from '@angular/router'; import { Store } from '@ngxs/store'; import { AuthConfig, OAuthService } from 'angular-oauth2-oidc'; -import { ConfigState } from '../states/config.state'; -import { CORE_OPTIONS } from '../tokens/options.token'; -import { Router } from '@angular/router'; import { Observable, of } from 'rxjs'; -import { RestService } from '../services/rest.service'; import { switchMap } from 'rxjs/operators'; import { GetAppConfiguration } from '../actions/config.actions'; +import { RestOccurError } from '../actions/rest.actions'; +import { RestService } from '../services/rest.service'; +import { ConfigState } from '../states/config.state'; export abstract class AuthFlowStrategy { abstract readonly isInternalAuth: boolean; @@ -26,8 +26,8 @@ export abstract class AuthFlowStrategy { constructor(protected injector: Injector) { this.oAuthService = injector.get(OAuthService); - this.oAuthConfig = injector.get(CORE_OPTIONS).environment.oAuthConfig; this.store = injector.get(Store); + this.oAuthConfig = this.store.selectSnapshot(ConfigState.getDeep('environment.oAuthConfig')); } async init(): Promise { @@ -76,10 +76,9 @@ export class AuthPasswordFlowStrategy extends AuthFlowStrategy { } logout() { - const store = this.injector.get(Store); const rest = this.injector.get(RestService); - const issuer = store.selectSnapshot(ConfigState.getDeep('environment.oAuthConfig.issuer')); + const issuer = this.store.selectSnapshot(ConfigState.getDeep('environment.oAuthConfig.issuer')); return rest .request( { @@ -92,7 +91,7 @@ export class AuthPasswordFlowStrategy extends AuthFlowStrategy { .pipe( switchMap(() => { this.oAuthService.logOut(); - return store.dispatch(new GetAppConfiguration()); + return this.store.dispatch(new GetAppConfiguration()); }), ); } From 743745e1621c0d8bf710cce3df8463f6d7136fc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levent=20Arman=20=C3=96zak?= Date: Fri, 14 Aug 2020 15:24:43 +0300 Subject: [PATCH 4/6] Update auth-flow.strategy.ts --- .../packages/core/src/lib/strategies/auth-flow.strategy.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/strategies/auth-flow.strategy.ts b/npm/ng-packs/packages/core/src/lib/strategies/auth-flow.strategy.ts index 2ff1241e9a..9f1ec80486 100644 --- a/npm/ng-packs/packages/core/src/lib/strategies/auth-flow.strategy.ts +++ b/npm/ng-packs/packages/core/src/lib/strategies/auth-flow.strategy.ts @@ -20,9 +20,7 @@ export abstract class AuthFlowStrategy { abstract logout(): Observable; abstract destroy(): void; - private catchError = err => { - return this.store.dispatch(new RestOccurError(err)); - }; + private catchError = err => this.store.dispatch(new RestOccurError(err)); constructor(protected injector: Injector) { this.store = injector.get(Store); From f5cdbe415930ec566fc7108747f3f62c19c8fb54 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 14 Aug 2020 15:25:50 +0300 Subject: [PATCH 5/6] fix: ci error --- npm/ng-packs/packages/core/src/lib/core.module.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/core.module.ts b/npm/ng-packs/packages/core/src/lib/core.module.ts index 9daa34901b..c74591d204 100644 --- a/npm/ng-packs/packages/core/src/lib/core.module.ts +++ b/npm/ng-packs/packages/core/src/lib/core.module.ts @@ -226,8 +226,8 @@ export class CoreModule { storage: StorageOption.LocalStorage, serialize: JSON.stringify, deserialize: JSON.parse, - beforeSerialize: obj => obj, - afterDeserialize: obj => obj, + beforeSerialize: ngxsStoragePluginSerialize, + afterDeserialize: ngxsStoragePluginSerialize, ...options.ngxsStoragePluginOptions, key: [...(options.ngxsStoragePluginOptions?.key || []), 'SessionState'], }, @@ -236,3 +236,7 @@ export class CoreModule { }; } } + +export function ngxsStoragePluginSerialize(data) { + return data; +} From dbd1944beda3614bed482a3b8ab5f030069eedd3 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 14 Aug 2020 15:28:01 +0300 Subject: [PATCH 6/6] refactor: improve code readability --- .../core/src/lib/strategies/auth-flow.strategy.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/strategies/auth-flow.strategy.ts b/npm/ng-packs/packages/core/src/lib/strategies/auth-flow.strategy.ts index 9f1ec80486..19fa4f509c 100644 --- a/npm/ng-packs/packages/core/src/lib/strategies/auth-flow.strategy.ts +++ b/npm/ng-packs/packages/core/src/lib/strategies/auth-flow.strategy.ts @@ -3,7 +3,7 @@ import { Router } from '@angular/router'; import { Store } from '@ngxs/store'; import { AuthConfig, OAuthService } from 'angular-oauth2-oidc'; import { Observable, of } from 'rxjs'; -import { switchMap } from 'rxjs/operators'; +import { switchMap, tap } from 'rxjs/operators'; import { GetAppConfiguration } from '../actions/config.actions'; import { RestOccurError } from '../actions/rest.actions'; import { RestService } from '../services/rest.service'; @@ -87,10 +87,8 @@ export class AuthPasswordFlowStrategy extends AuthFlowStrategy { issuer, ) .pipe( - switchMap(() => { - this.oAuthService.logOut(); - return this.store.dispatch(new GetAppConfiguration()); - }), + tap(() => this.oAuthService.logOut()), + switchMap(() => this.store.dispatch(new GetAppConfiguration())), ); }