import { inject } from '@angular/core'; import { ActivatedRouteSnapshot, CanActivateFn, Router, RouterStateSnapshot, Routes, UrlTree, } from '@angular/router'; import { AuthGuardData, createAuthGuard } from 'keycloak-angular'; import { Login } from './components/login/login'; import { MissingPage } from './components/missing-page/missing-page'; import { Claim } from './generated-api/api'; export const roles = { UserAdmin: 'useradmin', MemberAdmin: 'memberadmin', }; function requireRoles( roles: string[] = [], any: boolean = false, ): CanActivateFn { const isAllowed = async ( _: ActivatedRouteSnapshot, __: RouterStateSnapshot, authData: AuthGuardData, ): Promise => { const { authenticated, grantedRoles } = authData; const allRoles = Object.values(grantedRoles).flat(); const hasRequiredRoles = any ? roles.some(role => allRoles.includes(role)) : roles.every(role => allRoles.includes(role)); if (authenticated && hasRequiredRoles) { return true; } const router = inject(Router); return router.parseUrl('/login'); }; return createAuthGuard(isAllowed); } export const routes: Routes = [ { path: 'login', component: Login }, { path: '', loadComponent: () => import('./components/home/home').then(mod => mod.Home), canActivate: [requireRoles()], }, { path: 'home', loadComponent: () => import('./components/home/home').then(mod => mod.Home), canActivate: [requireRoles()], }, { path: 'test', loadComponent: () => import('./components/test/test').then(mod => mod.Test), }, { path: 'list', loadComponent: () => import('./components/view-members/view-members').then( mod => mod.ViewMembers, ), canActivate: [requireRoles([Claim.Memberadmin])], }, { path: '**', component: MissingPage }, ];