From b827a6f0a09279c1a60d1264ebcf00319166b94b Mon Sep 17 00:00:00 2001 From: Nino Date: Wed, 12 Nov 2025 12:40:59 +0100 Subject: [PATCH] fix(isa-app): Fixes Auth and TabID Errors on Startup Refs: #5472, #5473 --- apps/isa-app/src/app/app-routing.module.ts | 8 ++++-- apps/isa-app/src/app/app.module.ts | 5 +++- apps/isa-app/src/core/auth/auth.service.ts | 1 + libs/core/tabs/src/index.ts | 1 + libs/core/tabs/src/lib/has-tab-id.guard.ts | 31 ++++++++++++++++++++++ 5 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 libs/core/tabs/src/lib/has-tab-id.guard.ts diff --git a/apps/isa-app/src/app/app-routing.module.ts b/apps/isa-app/src/app/app-routing.module.ts index 8657590e7..dc720f9ce 100644 --- a/apps/isa-app/src/app/app-routing.module.ts +++ b/apps/isa-app/src/app/app-routing.module.ts @@ -29,7 +29,11 @@ import { ActivateProcessIdWithConfigKeyGuard, } from './guards/activate-process-id.guard'; import { MatomoRouteData } from 'ngx-matomo-client'; -import { tabResolverFn, processResolverFn } from '@isa/core/tabs'; +import { + tabResolverFn, + processResolverFn, + hasTabIdGuard, +} from '@isa/core/tabs'; import { provideScrollPositionRestoration } from '@isa/utils/scroll-position'; const routes: Routes = [ @@ -182,7 +186,7 @@ const routes: Routes = [ path: ':tabId', component: MainComponent, resolve: { process: processResolverFn, tab: tabResolverFn }, - canActivate: [IsAuthenticatedGuard], + canActivate: [IsAuthenticatedGuard, hasTabIdGuard], children: [ { path: 'reward', diff --git a/apps/isa-app/src/app/app.module.ts b/apps/isa-app/src/app/app.module.ts index 9f0a46ba6..e0e96751e 100644 --- a/apps/isa-app/src/app/app.module.ts +++ b/apps/isa-app/src/app/app.module.ts @@ -131,7 +131,10 @@ export function _appInitializerFactory(config: Config, injector: Injector) { const auth = injector.get(AuthService); try { - await auth.init(); + const authenticated = await auth.init(); + if (!authenticated) { + throw new Error('User is not authenticated'); + } } catch { statusElement.innerHTML = 'Authentifizierung wird durchgeführt...'; logger.info('Performing login'); diff --git a/apps/isa-app/src/core/auth/auth.service.ts b/apps/isa-app/src/core/auth/auth.service.ts index d136efc3f..4c67d8826 100644 --- a/apps/isa-app/src/core/auth/auth.service.ts +++ b/apps/isa-app/src/core/auth/auth.service.ts @@ -97,6 +97,7 @@ export class AuthService { this.#logger.info('AuthService initialized', () => ({ authenticated })); this.#initialized.next(true); + return authenticated; } isAuthenticated() { diff --git a/libs/core/tabs/src/index.ts b/libs/core/tabs/src/index.ts index 6c92492ac..fabdf9f3a 100644 --- a/libs/core/tabs/src/index.ts +++ b/libs/core/tabs/src/index.ts @@ -7,3 +7,4 @@ export * from './lib/tab-navigation.service'; export * from './lib/tab-navigation.constants'; export * from './lib/tab-config'; export * from './lib/helpers'; +export * from './lib/has-tab-id.guard'; diff --git a/libs/core/tabs/src/lib/has-tab-id.guard.ts b/libs/core/tabs/src/lib/has-tab-id.guard.ts new file mode 100644 index 000000000..10f1a57e7 --- /dev/null +++ b/libs/core/tabs/src/lib/has-tab-id.guard.ts @@ -0,0 +1,31 @@ +import { inject } from '@angular/core'; +import { CanActivateFn, Router } from '@angular/router'; +import { logger } from '@isa/core/logging'; + +export const hasTabIdGuard: CanActivateFn = (route) => { + const router = inject(Router); + const log = logger(() => ({ + context: 'hasTabIdGuard', + url: route.url.map((s) => s.path).join('/'), + params: JSON.stringify(route.params), + queryParams: JSON.stringify(route.queryParams), + })); + const tabId = route.params['tabId']; + const isValidTabId = tabId && !isNaN(parseInt(tabId)) && parseInt(tabId) > 0; + + if (isValidTabId) { + log.debug('Valid tabId - allowing navigation', () => ({ + tabId, + parsedValue: parseInt(tabId), + })); + return true; + } + + log.warn('Invalid or missing tabId - redirecting to dashboard', () => ({ + tabId, + isNaN: isNaN(parseInt(tabId)), + parsedValue: parseInt(tabId), + redirectTo: '/kunde/dashboard', + })); + return router.parseUrl('/kunde/dashboard'); +};