From e1681d886748bb3b4db8d0b129324a315a5840dd Mon Sep 17 00:00:00 2001 From: Lorenz Hilpert Date: Tue, 4 Nov 2025 15:13:21 +0000 Subject: [PATCH] Merged PR 2001: fix(auth): handle empty user state on login fix(auth): handle empty user state on login Resolves error when user state is empty during login process. Refs #5431 Related work items: #5431 --- .../user.storage-provider.ts | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/libs/core/storage/src/lib/storage-providers/user.storage-provider.ts b/libs/core/storage/src/lib/storage-providers/user.storage-provider.ts index 6b7e5c680..a692fbfb7 100644 --- a/libs/core/storage/src/lib/storage-providers/user.storage-provider.ts +++ b/libs/core/storage/src/lib/storage-providers/user.storage-provider.ts @@ -1,15 +1,34 @@ import { inject, Injectable } from '@angular/core'; import { toObservable } from '@angular/core/rxjs-interop'; import { StorageProvider } from './storage-provider'; -import { UserStateService } from '@generated/swagger/isa-api'; -import { filter, firstValueFrom, retry, switchMap, tap, timer } from 'rxjs'; +import { + ResponseArgsOfUserState, + UserStateService, +} from '@generated/swagger/isa-api'; +import { + catchError, + filter, + firstValueFrom, + retry, + switchMap, + tap, + throwError, + timer, +} from 'rxjs'; import { USER_SUB } from '../tokens'; import { Debounce, ValidateParam } from '@isa/common/decorators'; import z from 'zod'; import { logger } from '@isa/core/logging'; +import { HttpErrorResponse } from '@angular/common/http'; type UserState = Record; +const DEFAULT_USER_STATE_RESPONSE: ResponseArgsOfUserState = { + result: { content: '{}' }, + error: false, + message: 'User state not found', +}; + @Injectable({ providedIn: 'root' }) export class UserStorageProvider implements StorageProvider { #logger = logger(() => ({ @@ -22,6 +41,12 @@ export class UserStorageProvider implements StorageProvider { filter((sub) => sub !== 'anonymous'), switchMap(() => this.#userStateService.UserStateGetUserState().pipe( + catchError((error) => { + if (error instanceof HttpErrorResponse && error.status === 404) { + return [DEFAULT_USER_STATE_RESPONSE]; + } + return throwError(() => error); + }), retry({ count: 3, delay: (error, retryCount) => {