import { Namespace, Context, SubjectSet } from "@ory/keto-definitions" class User implements Namespace {} class System implements Namespace { related: { super_admins: User[] authenticated_users: User[] } permits = { manage_all: (ctx: Context): boolean => this.related.super_admins.includes(ctx.subject) } } class Tenant implements Namespace { related: { owners: (User | SubjectSet)[] admins: (User | SubjectSet)[] members: (User | SubjectSet | SubjectSet | SubjectSet)[] parents: Tenant[] developer_console_viewer: (User | SubjectSet)[] developer_console_grant_manager: (User | SubjectSet)[] } permits = { view: (ctx: Context): boolean => this.related.members.includes(ctx.subject) || this.related.admins.includes(ctx.subject) || this.related.owners.includes(ctx.subject) || this.related.parents.traverse((p) => p.permits.view(ctx)), manage: (ctx: Context): boolean => this.related.admins.includes(ctx.subject) || this.related.owners.includes(ctx.subject) || this.related.parents.traverse((p) => p.permits.manage(ctx)), manage_admins: (ctx: Context): boolean => this.related.owners.includes(ctx.subject) || this.related.parents.traverse((p) => p.permits.manage_admins(ctx)), create_subtenant: (ctx: Context): boolean => this.permits.manage(ctx), view_dev_console: (ctx: Context): boolean => this.related.developer_console_viewer.includes(ctx.subject) || this.permits.grant_dev_permissions(ctx) || this.permits.manage(ctx) || this.related.parents.traverse((p) => p.permits.view_dev_console(ctx)), grant_dev_permissions: (ctx: Context): boolean => this.related.developer_console_grant_manager.includes(ctx.subject) || this.permits.manage_admins(ctx) || this.related.parents.traverse((p) => p.permits.grant_dev_permissions(ctx)) } } class RelyingParty implements Namespace { related: { admins: (User | SubjectSet | SubjectSet | SubjectSet)[] parents: Tenant[] access: (User | SubjectSet | SubjectSet | SubjectSet)[] creator: (User | SubjectSet)[] config_editor: (User | SubjectSet)[] secret_viewer: (User | SubjectSet)[] secret_rotator: (User | SubjectSet)[] jwks_viewer: (User | SubjectSet)[] jwks_operator: (User | SubjectSet)[] consent_viewer: (User | SubjectSet)[] consent_revoker: (User | SubjectSet)[] relationship_viewer: (User | SubjectSet)[] audit_viewer: (User | SubjectSet)[] status_operator: (User | SubjectSet)[] } permits = { view: (ctx: Context): boolean => this.related.admins.includes(ctx.subject) || this.related.config_editor.includes(ctx.subject) || this.related.secret_viewer.includes(ctx.subject) || this.related.secret_rotator.includes(ctx.subject) || this.related.jwks_viewer.includes(ctx.subject) || this.related.jwks_operator.includes(ctx.subject) || this.related.consent_viewer.includes(ctx.subject) || this.related.consent_revoker.includes(ctx.subject) || this.related.relationship_viewer.includes(ctx.subject) || this.related.audit_viewer.includes(ctx.subject) || this.related.status_operator.includes(ctx.subject) || this.related.parents.traverse((t) => t.permits.view(ctx)) || this.related.parents.traverse((t) => t.permits.view_dev_console(ctx)), manage: (ctx: Context): boolean => this.related.admins.includes(ctx.subject) || this.related.parents.traverse((t) => t.permits.manage(ctx)), create: (ctx: Context): boolean => this.related.creator.includes(ctx.subject) || this.related.parents.traverse((t) => t.permits.grant_dev_permissions(ctx)) || this.permits.manage(ctx), edit_config: (ctx: Context): boolean => this.related.config_editor.includes(ctx.subject) || this.permits.manage(ctx), view_secret: (ctx: Context): boolean => this.related.secret_viewer.includes(ctx.subject) || this.permits.rotate_secret(ctx) || this.permits.manage(ctx), rotate_secret: (ctx: Context): boolean => this.related.secret_rotator.includes(ctx.subject) || this.permits.manage(ctx), view_jwks: (ctx: Context): boolean => this.related.jwks_viewer.includes(ctx.subject) || this.permits.operate_jwks(ctx) || this.permits.manage(ctx), operate_jwks: (ctx: Context): boolean => this.related.jwks_operator.includes(ctx.subject) || this.permits.manage(ctx), view_consents: (ctx: Context): boolean => this.related.consent_viewer.includes(ctx.subject) || this.permits.revoke_consents(ctx) || this.permits.manage(ctx), revoke_consents: (ctx: Context): boolean => this.related.consent_revoker.includes(ctx.subject) || this.permits.manage(ctx), view_relationships: (ctx: Context): boolean => this.related.relationship_viewer.includes(ctx.subject) || this.related.parents.traverse((t) => t.permits.grant_dev_permissions(ctx)) || this.permits.manage(ctx), view_audit_logs: (ctx: Context): boolean => this.related.audit_viewer.includes(ctx.subject) || this.permits.manage(ctx), change_status: (ctx: Context): boolean => this.related.status_operator.includes(ctx.subject) || this.permits.manage(ctx), access: (ctx: Context): boolean => this.related.access.includes(ctx.subject) || this.permits.manage(ctx) } }