Files
EpicNext-Cms/src/lib/admin/authorization-policy.ts
T
openhands df38dccbf1
Local Build and Deploy / deploy (push) Failing after 46s
style: format code biome
2026-07-13 21:57:41 +02:00

41 lines
1.1 KiB
TypeScript

export interface AuthorizationActor {
id: number;
username: string;
rank: number;
}
export type AuthorizationDenialReason =
| "invalid_rank"
| "permission_denied"
| "no_ranks";
export type AuthorizationDecision =
| { allowed: true; superAdmin: boolean }
| { allowed: false; reason: AuthorizationDenialReason };
export function isDynamicSuperAdmin(
rank: number,
highestRank: number | null,
): boolean {
return (
Number.isInteger(rank) &&
rank > 0 &&
highestRank !== null &&
rank === highestRank
);
}
export function decideAuthorization(input: {
actor: AuthorizationActor;
highestRank: number | null;
permission?: string;
hasPermission: boolean;
}): AuthorizationDecision {
if (!Number.isInteger(input.actor.rank) || input.actor.rank <= 0)
return { allowed: false, reason: "invalid_rank" };
if (input.highestRank === null) return { allowed: false, reason: "no_ranks" };
if (isDynamicSuperAdmin(input.actor.rank, input.highestRank))
return { allowed: true, superAdmin: true };
if (!input.permission || input.hasPermission)
return { allowed: true, superAdmin: false };
return { allowed: false, reason: "permission_denied" };
}