File size: 1,570 Bytes
6111b2b | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | import {
SELF_ACCOUNT_QUOTA_SCOPE,
SELF_USAGE_SCOPE,
} from "@/shared/constants/selfServiceScopes";
const MANAGEMENT_SCOPE = "manage";
export interface CreateScopeOptions {
manageEnabled: boolean;
selfUsageEnabled?: boolean;
selfAccountQuotaEnabled?: boolean;
}
export interface PermissionScopeOptions {
manageEnabled: boolean;
selfUsageEnabled: boolean;
selfAccountQuotaEnabled: boolean;
}
export function buildApiKeyCreateScopes(options: CreateScopeOptions): string[] {
const scopes: string[] = [];
const selfUsageEnabled = options.selfUsageEnabled ?? true;
if (options.manageEnabled) scopes.push(MANAGEMENT_SCOPE);
if (selfUsageEnabled) scopes.push(SELF_USAGE_SCOPE);
if (selfUsageEnabled && options.selfAccountQuotaEnabled === true) {
scopes.push(SELF_ACCOUNT_QUOTA_SCOPE);
}
return scopes;
}
export function mergeApiKeyPermissionScopes(
currentScopes: readonly string[] | null | undefined,
options: PermissionScopeOptions
): string[] {
const scopes = new Set((currentScopes ?? []).filter((scope) => typeof scope === "string"));
setScope(scopes, MANAGEMENT_SCOPE, options.manageEnabled);
setScope(scopes, SELF_USAGE_SCOPE, options.selfUsageEnabled);
setScope(
scopes,
SELF_ACCOUNT_QUOTA_SCOPE,
options.selfUsageEnabled && options.selfAccountQuotaEnabled
);
return [...scopes];
}
function setScope(scopes: Set<string>, scope: string, enabled: boolean): void {
if (enabled) {
scopes.add(scope);
} else {
scopes.delete(scope);
}
}
|