mirror of
https://github.com/alkimake/paperclip.git
synced 2026-06-20 12:30:38 +09:00
60 lines
1.9 KiB
TypeScript
60 lines
1.9 KiB
TypeScript
|
|
import { PERMISSION_KEYS } from "@paperclipai/shared";
|
||
|
|
import type { HumanCompanyMembershipRole } from "@paperclipai/shared";
|
||
|
|
|
||
|
|
const HUMAN_COMPANY_MEMBERSHIP_ROLES: HumanCompanyMembershipRole[] = [
|
||
|
|
"owner",
|
||
|
|
"admin",
|
||
|
|
"operator",
|
||
|
|
"viewer",
|
||
|
|
];
|
||
|
|
|
||
|
|
export function normalizeHumanRole(
|
||
|
|
value: unknown,
|
||
|
|
fallback: HumanCompanyMembershipRole = "operator"
|
||
|
|
): HumanCompanyMembershipRole {
|
||
|
|
if (value === "member") return "operator";
|
||
|
|
return HUMAN_COMPANY_MEMBERSHIP_ROLES.includes(value as HumanCompanyMembershipRole)
|
||
|
|
? (value as HumanCompanyMembershipRole)
|
||
|
|
: fallback;
|
||
|
|
}
|
||
|
|
|
||
|
|
export function grantsForHumanRole(
|
||
|
|
role: HumanCompanyMembershipRole
|
||
|
|
): Array<{
|
||
|
|
permissionKey: (typeof PERMISSION_KEYS)[number];
|
||
|
|
scope: Record<string, unknown> | null;
|
||
|
|
}> {
|
||
|
|
switch (role) {
|
||
|
|
case "owner":
|
||
|
|
return [
|
||
|
|
{ permissionKey: "agents:create", scope: null },
|
||
|
|
{ permissionKey: "users:invite", scope: null },
|
||
|
|
{ permissionKey: "users:manage_permissions", scope: null },
|
||
|
|
{ permissionKey: "tasks:assign", scope: null },
|
||
|
|
{ permissionKey: "joins:approve", scope: null },
|
||
|
|
];
|
||
|
|
case "admin":
|
||
|
|
return [
|
||
|
|
{ permissionKey: "agents:create", scope: null },
|
||
|
|
{ permissionKey: "users:invite", scope: null },
|
||
|
|
{ permissionKey: "tasks:assign", scope: null },
|
||
|
|
{ permissionKey: "joins:approve", scope: null },
|
||
|
|
];
|
||
|
|
case "operator":
|
||
|
|
return [{ permissionKey: "tasks:assign", scope: null }];
|
||
|
|
case "viewer":
|
||
|
|
return [];
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
export function resolveHumanInviteRole(
|
||
|
|
defaultsPayload: Record<string, unknown> | null | undefined
|
||
|
|
): HumanCompanyMembershipRole {
|
||
|
|
if (!defaultsPayload || typeof defaultsPayload !== "object") return "operator";
|
||
|
|
const scoped = defaultsPayload.human;
|
||
|
|
if (!scoped || typeof scoped !== "object" || Array.isArray(scoped)) {
|
||
|
|
return "operator";
|
||
|
|
}
|
||
|
|
return normalizeHumanRole((scoped as Record<string, unknown>).role, "operator");
|
||
|
|
}
|