74 lines
2.2 KiB
TypeScript
74 lines
2.2 KiB
TypeScript
import { RouteCatalog } from './RouteCatalog';
|
|
|
|
/**
|
|
* RouteAccessPolicy - Determines access requirements for routes
|
|
*
|
|
* Responsibilities:
|
|
* - Check if a route is public
|
|
* - Check if a route is an auth page
|
|
* - Determine required roles for a route
|
|
* - Get home path for a specific role
|
|
*
|
|
* Design: Uses ONLY RouteCatalog patterns/matchers, no hardcoded arrays/strings
|
|
*/
|
|
export class RouteAccessPolicy {
|
|
constructor(private catalog: RouteCatalog) {}
|
|
|
|
/**
|
|
* Check if a logical pathname is publicly accessible
|
|
* @param logicalPathname - The path to check
|
|
* @returns true if the route is public (no auth required)
|
|
*/
|
|
isPublic(logicalPathname: string): boolean {
|
|
// Get the route ID for this path
|
|
const routeId = this.catalog.getRouteIdByPath(logicalPathname);
|
|
|
|
if (!routeId) {
|
|
// No route found, not public
|
|
return false;
|
|
}
|
|
|
|
// Check if this route ID is in the public routes list
|
|
const publicRouteIds = this.catalog.listPublicRoutes();
|
|
return publicRouteIds.includes(routeId);
|
|
}
|
|
|
|
/**
|
|
* Check if a logical pathname is an auth page
|
|
* @param logicalPathname - The path to check
|
|
* @returns true if the route is an auth page
|
|
*/
|
|
isAuthPage(logicalPathname: string): boolean {
|
|
return this.catalog.isAuthPage(logicalPathname);
|
|
}
|
|
|
|
/**
|
|
* Get required roles for a logical pathname
|
|
* @param logicalPathname - The path to check
|
|
* @returns Array of required roles, or null if no specific role required
|
|
*/
|
|
requiredRoles(logicalPathname: string): string[] | null {
|
|
// Use catalog's role-based access method
|
|
const roles = this.catalog.getRequiredRoles(logicalPathname);
|
|
console.log(`[RouteAccessPolicy] requiredRoles for ${logicalPathname}:`, roles);
|
|
return roles;
|
|
}
|
|
|
|
/**
|
|
* Get the home path for a specific role
|
|
* @param role - The role name
|
|
* @returns The logical path for that role's home page
|
|
*/
|
|
roleHome(role: string): string {
|
|
return this.catalog.getRoleHome(role);
|
|
}
|
|
|
|
/**
|
|
* Get the route ID for a specific role's home page
|
|
* @param role - The role name
|
|
* @returns The route ID for that role's home page
|
|
*/
|
|
roleHomeRouteId(role: string): string {
|
|
return this.catalog.getRoleHomeRouteId(role);
|
|
}
|
|
} |