From a06124ab4e50ea4d5304e0070b167956908bd5df Mon Sep 17 00:00:00 2001 From: Dan Percic Date: Wed, 24 May 2023 14:25:24 +0300 Subject: [PATCH] RED-6713: remove stored tenant on logout --- src/lib/tenants/services/tenants.service.ts | 24 ++++++++++++++++++++ src/lib/users/services/iqser-user.service.ts | 9 +++++--- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/lib/tenants/services/tenants.service.ts b/src/lib/tenants/services/tenants.service.ts index bda98ba..4ea4223 100644 --- a/src/lib/tenants/services/tenants.service.ts +++ b/src/lib/tenants/services/tenants.service.ts @@ -155,6 +155,30 @@ export class TenantsService { return trueStored; } + removeStored(email: string) { + if (!email) { + this.#logger.warn('[TENANTS] Email is null, skip storing'); + return; + } + + const storedTenants = this.getStoredTenants(); + const activeTenant = this.activeTenant(); + const existing = storedTenants.find(s => s.email === email && s.tenant.tenantId === activeTenant?.tenantId); + if (!existing) { + this.#logger.info('[TENANTS] No stored tenant for ', email); + return; + } + + const serializableTenants = storedTenants + .filter(s => s !== existing) + .map(s => ({ + tenantId: s.tenant.tenantId, + email: s.email, + })); + this.#storageReference.setItem(STORED_TENANTS_KEY, JSON.stringify(serializableTenants)); + this.#logger.info('[TENANTS] Stored tenants at logout: ', storedTenants); + } + #setActiveTenantId(tenantId: string) { this.#logger.info('[TENANTS] Set current tenant id: ', tenantId); this.#activeTenantId.set(tenantId); diff --git a/src/lib/users/services/iqser-user.service.ts b/src/lib/users/services/iqser-user.service.ts index 804e416..70ec2d7 100644 --- a/src/lib/users/services/iqser-user.service.ts +++ b/src/lib/users/services/iqser-user.service.ts @@ -2,7 +2,7 @@ import { inject, Injectable } from '@angular/core'; import { KeycloakService } from 'keycloak-angular'; import { BehaviorSubject, firstValueFrom, Observable, throwError } from 'rxjs'; import { catchError, tap } from 'rxjs/operators'; -import { List, mapEach } from '../../utils'; +import { BASE_HREF, List, mapEach } from '../../utils'; import { QueryParam, Toaster } from '../../services'; import { CacheApiService } from '../../caching'; import { EntitiesService } from '../../listing'; @@ -16,7 +16,7 @@ import { IqserUser } from '../iqser-user.model'; import { IqserPermissionsService, IqserRolesService } from '../../permissions'; import { HttpErrorResponse, HttpStatusCode } from '@angular/common/http'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; -import { KeycloakStatusService } from '../../tenants'; +import { KeycloakStatusService, TenantsService } from '../../tenants'; @Injectable() export abstract class IqserUserService< @@ -35,6 +35,8 @@ export abstract class IqserUserService< protected readonly _keycloakStatusService = inject(KeycloakStatusService); protected readonly _permissionsService = inject(IqserPermissionsService, { optional: true }); protected readonly _rolesService = inject(IqserRolesService, { optional: true }); + protected readonly _tenantsService = inject(TenantsService); + protected readonly _baseHref = inject(BASE_HREF); constructor() { super(); @@ -58,9 +60,10 @@ export abstract class IqserUserService< async logout() { try { + this._tenantsService.removeStored(this.currentUser?.email ?? ''); await this._keycloakService.loadUserProfile(true); await this._cacheApiService.wipeCaches(); - await this._keycloakService.logout(this._keycloakStatusService.createLoginUrl()); + await this._keycloakService.logout(window.location.origin + this._baseHref); } catch (e) { console.log('Logout failed: ', e); await this.redirectToLogin();