green-jewelry-10349
07/24/2023, 11:58 AMpurple-match-65245
07/24/2023, 12:19 PMgreen-jewelry-10349
07/24/2023, 12:43 PMimport { Namespace, SubjectSet, Context } from "@ory/keto-namespace-types"
class User implements Namespace { }
class Role implements Namespace {
related: {
member: (User | Role)[]
}
}
class Permission implements Namespace {
related: {
allowed: (User | Role | Permission)[]
}
permits = {
create_project: (ctx: Context): boolean => this.related.allowed.includes(ctx.subject),
create_team: (ctx: Context): boolean => this.related.allowed.includes(ctx.subject)
}
}
class Team implements Namespace {
related: {
admin: User[]
member: User[]
}
permits = {
add_member: (ctx: Context): boolean => this.related.admin.includes(ctx.subject),
remove_member: (ctx: Context): boolean => this.related.admin.includes(ctx.subject),
update_admin: (ctx: Context): boolean => this.related.admin.includes(ctx.subject),
edit: (ctx: Context): boolean => this.related.admin.includes(ctx.subject),
delete: (ctx: Context): boolean => this.related.admin.includes(ctx.subject),
view: (ctx: Context): boolean => this.related.admin.includes(ctx.subject) || this.related.member.includes(ctx.subject)
}
}
class Project implements Namespace {
related: {
manager: (User | SubjectSet<Team, "admin">)[],
admin: (User | SubjectSet<Team, "admin">)[],
viewers: (User | SubjectSet<Team, "member"> | SubjectSet<Team, "admin">)[],
}
permits = {
edit: (ctx: Context): boolean => this.permits.create_ticket(ctx),
view: (ctx: Context): boolean => this.permits.create_ticket(ctx) || this.related.viewers.includes(ctx.subject),
delete: (ctx: Context): boolean => this.related.manager.includes(ctx.subject),
create_ticket: (ctx: Context): boolean => this.related.manager.includes(ctx.subject) || this.related.admin.includes(ctx.subject),
}
}
class Ticket implements Namespace {
related: {
manager: (User | SubjectSet<Project, "manager">)[],
admin: (User | SubjectSet<Project, "admin">)[],
supervisor: User[],
engineer: User[],
}
permits = {
edit: (ctx: Context): boolean => this.related.manager.includes(ctx.subject) || this.related.admin.includes(ctx.subject),
delete: (ctx: Context): boolean => this.permits.edit(ctx),
view: (ctx: Context): boolean => this.permits.edit(ctx) || this.related.supervisor.includes(ctx.subject) || this.related.engineer.includes(ctx.subject),
assign: (ctx: Context): boolean => this.permits.edit(ctx),
execute: (ctx: Context): boolean => this.permits.view(ctx),
approve_signoff: (ctx: Context): boolean => this.permits.edit(ctx)
}
}
purple-match-65245
07/24/2023, 12:46 PMPermission
in the platform e.g. Permission:0
then sure that seems reasonablegreen-jewelry-10349
07/24/2023, 12:51 PMpurple-match-65245
07/24/2023, 12:52 PMTeam
, Project
, Ticket
all have multiple instances. Their identifiers probably come from some other database, right?green-jewelry-10349
07/24/2023, 12:53 PMpurple-match-65245
07/24/2023, 12:54 PMPermission
object doesn’t have an ID from the database. There’s just one Permission
instance with some constant ID. Check that object when determining if a user has create_project
or create_team
permissions.green-jewelry-10349
07/24/2023, 12:58 PMgreen-jewelry-10349
07/25/2023, 8:55 AMdecided on one "well known" object for attaching create roles/permissions.
can you help me out please?purple-match-65245
07/25/2023, 8:00 PMOrganization
as an Ory Keto namespace and org_xyz
as the object, and permissions like create_ticket
on that namespace.purple-match-65245
07/25/2023, 8:02 PMPlatform
• Object: the-platform
You’ll need a role on it like ticket_creators
to control who has the create_ticket
permission.green-jewelry-10349
07/26/2023, 1:57 AM