Files
Taekwondo-Admin/packages/frontend/src/app/app.routes.ts
T
2025-12-07 12:51:57 +01:00

75 lines
2.1 KiB
TypeScript

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<boolean | UrlTree> => {
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<CanActivateFn>(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 },
];