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 return this.catalog.getRequiredRoles(logicalPathname); } /** * 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); } }