37 lines
925 B
TypeScript
37 lines
925 B
TypeScript
export type CapabilityRequirement =
|
|
| { mode: "all"; slugs: readonly string[] }
|
|
| { mode: "any"; slugs: readonly string[] };
|
|
|
|
export interface HousekeepingActor {
|
|
id: number;
|
|
username: string;
|
|
rank: number;
|
|
}
|
|
|
|
export interface HousekeepingCapabilityContext {
|
|
actor: HousekeepingActor;
|
|
isSuperAdmin: boolean;
|
|
has(slug: string): boolean;
|
|
hasAny(...slugs: string[]): boolean;
|
|
hasAll(...slugs: string[]): boolean;
|
|
}
|
|
|
|
function createCapabilityRequirement(
|
|
mode: CapabilityRequirement["mode"],
|
|
slugs: readonly string[],
|
|
): CapabilityRequirement {
|
|
if (slugs.length === 0) {
|
|
throw new Error("capability requirement is empty");
|
|
}
|
|
|
|
return { mode, slugs };
|
|
}
|
|
|
|
export function anyCapability(...slugs: string[]): CapabilityRequirement {
|
|
return createCapabilityRequirement("any", slugs);
|
|
}
|
|
|
|
export function allCapabilities(...slugs: string[]): CapabilityRequirement {
|
|
return createCapabilityRequirement("all", slugs);
|
|
}
|