adorable-sandwich-72048
03/28/2025, 7:34 AMimport { Context, Namespace } from "@ory/keto-namespace-types";
class OrganizationUnit implements Namespace {
related: {
direct_members: User[];
group_members: Group[];
};
permits = {
isMember: (ctx: Context): boolean =>
this.related.direct_members.includes(ctx.subject) ||
this.related.group_members.traverse((group) =>
group.permits.isMember(ctx)
),
};
}
class Group implements Namespace {
related: {
members: User[];
};
permits = {
isMember: (ctx: Context): boolean =>
this.related.members.includes(ctx.subject),
};
}
class User implements Namespace {}
class Resource implements Namespace {
related: {
viewers: OrganizationUnit[];
contributors: OrganizationUnit[];
};
permits = {
view: (ctx: Context): boolean =>
this.related.viewers.traverse((ou) => ou.permits.isMember(ctx)),
edit: (ctx: Context): boolean =>
this.related.contributors.traverse((ou) => ou.permits.isMember(ctx)),
};
}
class ResourceType implements Namespace {
related: {
resources: Resource[];
};
}
adorable-sandwich-72048
03/28/2025, 7:36 AM