From 481707426e4e4c52fde8bec89d72318621081fb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Can=20Y=C4=B1lmaz?= <30300440+bariscanyilmaz@users.noreply.github.com> Date: Wed, 8 Mar 2023 15:44:42 +0300 Subject: [PATCH 1/4] create local storage service --- .../packages/core/src/lib/services/index.ts | 1 + .../src/lib/services/local-storage.service.ts | 28 +++++++++++++++++++ .../lib/tests/local-storage.service.spec.ts | 16 +++++++++++ 3 files changed, 45 insertions(+) create mode 100644 npm/ng-packs/packages/core/src/lib/services/local-storage.service.ts create mode 100644 npm/ng-packs/packages/core/src/lib/tests/local-storage.service.spec.ts diff --git a/npm/ng-packs/packages/core/src/lib/services/index.ts b/npm/ng-packs/packages/core/src/lib/services/index.ts index 209d2a881e..fefc9931eb 100644 --- a/npm/ng-packs/packages/core/src/lib/services/index.ts +++ b/npm/ng-packs/packages/core/src/lib/services/index.ts @@ -18,3 +18,4 @@ export * from './routes.service'; export * from './session-state.service'; export * from './subscription.service'; export * from './track-by.service'; +export * from './local-storage.service'; diff --git a/npm/ng-packs/packages/core/src/lib/services/local-storage.service.ts b/npm/ng-packs/packages/core/src/lib/services/local-storage.service.ts new file mode 100644 index 0000000000..15ae8d53a3 --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/services/local-storage.service.ts @@ -0,0 +1,28 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root', +}) +export class AbpLocalStorageService implements Storage { + constructor() {} + [name: string]: any; + get length(): number { + return localStorage.length; + } + + clear(): void { + localStorage.clear(); + } + getItem(key: string): string { + return localStorage.getItem(key); + } + key(index: number): string { + return localStorage.key(index); + } + removeItem(key: string): void { + localStorage.removeItem(key); + } + setItem(key: string, value: string): void { + localStorage.setItem(key, value); + } +} diff --git a/npm/ng-packs/packages/core/src/lib/tests/local-storage.service.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/local-storage.service.spec.ts new file mode 100644 index 0000000000..204c052d21 --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/tests/local-storage.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { AbpLocalStorageService } from '../services/local-storage.service'; + +describe('LocalStorageService', () => { + let service: AbpLocalStorageService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(AbpLocalStorageService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); From d3cfc33c792bd85c5197d2a6abfbea16bfcfc79a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Can=20Y=C4=B1lmaz?= <30300440+bariscanyilmaz@users.noreply.github.com> Date: Wed, 8 Mar 2023 15:47:31 +0300 Subject: [PATCH 2/4] use localstorage service --- .../src/lib/services/session-state.service.ts | 10 +++++++--- .../packages/oauth/src/lib/oauth.module.ts | 6 +++--- .../src/lib/strategies/auth-flow-strategy.ts | 3 +++ .../strategies/auth-password-flow-strategy.ts | 8 ++++---- .../oauth/src/lib/utils/auth-utils.ts | 19 +++++++++++-------- 5 files changed, 28 insertions(+), 18 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/services/session-state.service.ts b/npm/ng-packs/packages/core/src/lib/services/session-state.service.ts index d3bac9a338..36f7c9e94a 100644 --- a/npm/ng-packs/packages/core/src/lib/services/session-state.service.ts +++ b/npm/ng-packs/packages/core/src/lib/services/session-state.service.ts @@ -5,6 +5,7 @@ import { Session } from '../models/session'; import { CurrentTenantDto } from '../proxy/volo/abp/asp-net-core/mvc/multi-tenancy/models'; import { InternalStore } from '../utils/internal-store-utils'; import { ConfigStateService } from './config-state.service'; +import { AbpLocalStorageService } from './local-storage.service'; @Injectable({ providedIn: 'root', @@ -13,16 +14,19 @@ export class SessionStateService { private readonly store = new InternalStore({} as Session.State); private updateLocalStorage = () => { - localStorage.setItem('abpSession', JSON.stringify(this.store.state)); + this.localStorageService.setItem('abpSession', JSON.stringify(this.store.state)); }; - constructor(private configState: ConfigStateService) { + constructor( + private configState: ConfigStateService, + private localStorageService: AbpLocalStorageService, + ) { this.init(); this.setInitialLanguage(); } private init() { - const session = localStorage.getItem('abpSession'); + const session = this.localStorageService.getItem('abpSession'); if (session) { this.store.set(JSON.parse(session)); } diff --git a/npm/ng-packs/packages/oauth/src/lib/oauth.module.ts b/npm/ng-packs/packages/oauth/src/lib/oauth.module.ts index 5680b9582d..ac800e7c8f 100644 --- a/npm/ng-packs/packages/oauth/src/lib/oauth.module.ts +++ b/npm/ng-packs/packages/oauth/src/lib/oauth.module.ts @@ -2,14 +2,14 @@ import { APP_INITIALIZER, ModuleWithProviders, NgModule, Provider } from '@angul import { CommonModule } from '@angular/common'; import { OAuthModule, OAuthStorage } from 'angular-oauth2-oidc'; import { + AbpLocalStorageService, ApiInterceptor, AuthGuard, AuthService, CHECK_AUTHENTICATION_STATE_FN_KEY, noop, - PIPE_TO_LOGIN_FN_KEY + PIPE_TO_LOGIN_FN_KEY, } from '@abp/ng.core'; -import { storageFactory } from './utils/storage.factory'; import { AbpOAuthService } from './services'; import { OAuthConfigurationHandler } from './handlers/oauth-configuration.handler'; import { HTTP_INTERCEPTORS } from '@angular/common/http'; @@ -59,7 +59,7 @@ export class AbpOAuthModule { useFactory: noop, }, OAuthModule.forRoot().providers as Provider[], - { provide: OAuthStorage, useFactory: storageFactory }, + { provide: OAuthStorage, useClass: AbpLocalStorageService }, ], }; } diff --git a/npm/ng-packs/packages/oauth/src/lib/strategies/auth-flow-strategy.ts b/npm/ng-packs/packages/oauth/src/lib/strategies/auth-flow-strategy.ts index 7a07cb8985..c1bf50e0b5 100644 --- a/npm/ng-packs/packages/oauth/src/lib/strategies/auth-flow-strategy.ts +++ b/npm/ng-packs/packages/oauth/src/lib/strategies/auth-flow-strategy.ts @@ -9,6 +9,7 @@ import { import { Observable, of } from 'rxjs'; import { filter, switchMap, tap } from 'rxjs/operators'; import { + AbpLocalStorageService, ConfigStateService, EnvironmentService, HttpErrorReporterService, @@ -29,6 +30,7 @@ export abstract class AuthFlowStrategy { protected oAuthService: OAuthService2; protected oAuthConfig!: AuthConfig; protected sessionState: SessionStateService; + protected localStorageService: AbpLocalStorageService; protected tenantKey: string; abstract checkIfInternalAuth(queryParams?: Params): boolean; @@ -50,6 +52,7 @@ export abstract class AuthFlowStrategy { this.configState = injector.get(ConfigStateService); this.oAuthService = injector.get(OAuthService2); this.sessionState = injector.get(SessionStateService); + this.localStorageService = injector.get(AbpLocalStorageService); this.oAuthConfig = this.environment.getEnvironment().oAuthConfig || {}; this.tenantKey = injector.get(TENANT_KEY); diff --git a/npm/ng-packs/packages/oauth/src/lib/strategies/auth-password-flow-strategy.ts b/npm/ng-packs/packages/oauth/src/lib/strategies/auth-password-flow-strategy.ts index 2e2e278985..fab747fe90 100644 --- a/npm/ng-packs/packages/oauth/src/lib/strategies/auth-password-flow-strategy.ts +++ b/npm/ng-packs/packages/oauth/src/lib/strategies/auth-password-flow-strategy.ts @@ -4,7 +4,7 @@ import { Params, Router } from '@angular/router'; import { from, Observable, pipe } from 'rxjs'; import { HttpHeaders } from '@angular/common/http'; import { AuthFlowStrategy } from './auth-flow-strategy'; -import { pipeToLogin, removeRememberMe, setRememberMe } from '../utils/auth-utils'; +import { pipeToLogin, removeRememberMe } from '../utils/auth-utils'; import { LoginParams } from '@abp/ng.core'; import { clearOAuthStorage } from '../utils/clear-o-auth-storage'; @@ -33,7 +33,7 @@ export class AuthPasswordFlowStrategy extends AuthFlowStrategy { this.refreshToken(); } else { this.oAuthService.logOut(); - removeRememberMe(); + removeRememberMe(this.localStorageService); this.configState.refreshAppState().subscribe(); } }); @@ -74,7 +74,7 @@ export class AuthPasswordFlowStrategy extends AuthFlowStrategy { switchMap(() => this.configState.refreshAppState()), tap(() => { router.navigateByUrl('/'); - removeRememberMe(); + removeRememberMe(this.localStorageService); }), ); } @@ -82,7 +82,7 @@ export class AuthPasswordFlowStrategy extends AuthFlowStrategy { protected refreshToken() { return this.oAuthService.refreshToken().catch(() => { clearOAuthStorage(); - removeRememberMe(); + removeRememberMe(this.localStorageService); }); } } diff --git a/npm/ng-packs/packages/oauth/src/lib/utils/auth-utils.ts b/npm/ng-packs/packages/oauth/src/lib/utils/auth-utils.ts index 24f94fe129..f1dc5b6106 100644 --- a/npm/ng-packs/packages/oauth/src/lib/utils/auth-utils.ts +++ b/npm/ng-packs/packages/oauth/src/lib/utils/auth-utils.ts @@ -7,7 +7,7 @@ import { ConfigStateService, LoginParams, PipeToLoginFn, - SetTokenResponseToStorageFn, + AbpLocalStorageService, } from '@abp/ng.core'; const cookieKey = 'rememberMe'; @@ -19,25 +19,28 @@ export const pipeToLogin: PipeToLoginFn = function ( ) { const configState = injector.get(ConfigStateService); const router = injector.get(Router); - + const localStorage = injector.get(AbpLocalStorageService); return pipe( switchMap(() => configState.refreshAppState()), tap(() => { - setRememberMe(params.rememberMe); + setRememberMe(params.rememberMe, localStorage); if (params.redirectUrl) router.navigate([params.redirectUrl]); }), ); }; -export function setRememberMe(remember: boolean | undefined) { - removeRememberMe(); - localStorage.setItem(storageKey, 'true'); +export function setRememberMe( + remember: boolean | undefined, + localStorageService: AbpLocalStorageService, +) { + removeRememberMe(localStorageService); + localStorageService.setItem(storageKey, 'true'); document.cookie = `${cookieKey}=true; path=/${ remember ? ' ;expires=Fri, 31 Dec 9999 23:59:59 GMT' : '' }`; } -export function removeRememberMe() { - localStorage.removeItem(storageKey); +export function removeRememberMe(localStorageService: AbpLocalStorageService) { + localStorageService.removeItem(storageKey); document.cookie = cookieKey + '= ; path=/; expires = Thu, 01 Jan 1970 00:00:00 GMT'; } From f0120d121fc8c374eaeff8b3141d94cfbd60ea04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Can=20Y=C4=B1lmaz?= <30300440+bariscanyilmaz@users.noreply.github.com> Date: Wed, 8 Mar 2023 18:12:51 +0300 Subject: [PATCH 3/4] implement primitive tests --- .../lib/tests/local-storage.service.spec.ts | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/npm/ng-packs/packages/core/src/lib/tests/local-storage.service.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/local-storage.service.spec.ts index 204c052d21..ad51bbda2b 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/local-storage.service.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/local-storage.service.spec.ts @@ -13,4 +13,40 @@ describe('LocalStorageService', () => { it('should be created', () => { expect(service).toBeTruthy(); }); + + it('should be called getItem', () => { + const spy = jest.spyOn(service, 'getItem'); + service.getItem('test'); + expect(spy).toHaveBeenCalled(); + }); + + it('should be called setItem', () => { + const spy = jest.spyOn(service, 'setItem'); + service.setItem('test', 'value'); + expect(spy).toHaveBeenCalled(); + }); + + it('should be called removeItem', () => { + const spy = jest.spyOn(service, 'removeItem'); + service.removeItem('test'); + expect(spy).toHaveBeenCalled(); + }); + + it('should be called clear', () => { + const spy = jest.spyOn(service, 'clear'); + service.clear(); + expect(spy).toHaveBeenCalled(); + }); + + it('should be called key', () => { + const spy = jest.spyOn(service, 'key'); + service.key(0); + expect(spy).toHaveBeenCalled(); + }); + + it('should be called length', () => { + const spy = jest.spyOn(service, 'length', 'get'); + service.length; + expect(spy).toHaveBeenCalled(); + }); }); From 472f923471baf00397b1b08cbd982de99a4d4b2b Mon Sep 17 00:00:00 2001 From: masumulu28 Date: Fri, 10 Mar 2023 10:28:59 +0300 Subject: [PATCH 4/4] Lint exception fixed in theme-shard --- .../theme-shared/src/lib/directives/visible.directive.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/directives/visible.directive.ts b/npm/ng-packs/packages/theme-shared/src/lib/directives/visible.directive.ts index 9c2c408d0e..9613779472 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/directives/visible.directive.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/directives/visible.directive.ts @@ -8,7 +8,7 @@ export class AbpVisibleDirective implements OnDestroy, OnInit { conditionSubscription: Subscription | undefined; isVisible: boolean | undefined; - @Input('abpVisible') set abpVisible( + @Input() set abpVisible( value: boolean | Promise | Observable | undefined | null, ) { this.condition$ = checkType(value);