import { Namespace, Context, SubjectSet } from "@ory/keto-definitions" class User implements Namespace {} class System implements Namespace { related: { super_admins: User[] authenticated_users: User[] // ๐ŸŒŸ ์‹ ๊ทœ ๊ธ€๋กœ๋ฒŒ ๋ฉ”๋‰ด ๊ถŒํ•œ (Admin Control) ์ •์˜ overview_viewers: User[] tenants_viewers: User[] org_chart_viewers: User[] worksmobile_viewers: User[] ory_ssot_viewers: User[] data_integrity_viewers: User[] users_viewers: User[] permissions_direct_viewers: User[] auth_guard_viewers: User[] api_keys_viewers: User[] audit_logs_viewers: User[] } permits = { manage_all: (ctx: Context): boolean => this.related.super_admins.includes(ctx.subject), // ๐ŸŒŸ ๊ธ€๋กœ๋ฒŒ ๋ฉ”๋‰ด ํ—ˆ๊ฐ€ ๊ทœ์น™ (Permit Rules) - Super Admin์€ ์–ธ์ œ๋‚˜ ๋ฌด์กฐ๊ฑด ํŒจ์Šค access_overview: (ctx: Context): boolean => this.related.overview_viewers.includes(ctx.subject) || this.permits.manage_all(ctx), access_tenants: (ctx: Context): boolean => this.related.tenants_viewers.includes(ctx.subject) || this.permits.manage_all(ctx), access_org_chart: (ctx: Context): boolean => this.related.org_chart_viewers.includes(ctx.subject) || this.permits.manage_all(ctx), access_worksmobile: (ctx: Context): boolean => this.related.worksmobile_viewers.includes(ctx.subject) || this.permits.manage_all(ctx), access_ory_ssot: (ctx: Context): boolean => this.related.ory_ssot_viewers.includes(ctx.subject) || this.permits.manage_all(ctx), access_data_integrity: (ctx: Context): boolean => this.related.data_integrity_viewers.includes(ctx.subject) || this.permits.manage_all(ctx), access_users: (ctx: Context): boolean => this.related.users_viewers.includes(ctx.subject) || this.permits.manage_all(ctx), access_permissions_direct: (ctx: Context): boolean => this.related.permissions_direct_viewers.includes(ctx.subject) || this.permits.manage_all(ctx), access_auth_guard: (ctx: Context): boolean => this.related.auth_guard_viewers.includes(ctx.subject) || this.permits.manage_all(ctx), access_api_keys: (ctx: Context): boolean => this.related.api_keys_viewers.includes(ctx.subject) || this.permits.manage_all(ctx), access_audit_logs: (ctx: Context): boolean => this.related.audit_logs_viewers.includes(ctx.subject) || this.permits.manage_all(ctx) } } 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)[] // ๐ŸŒŸ ์‹ ๊ทœ ์ง์ ‘ ๊ด€๊ณ„ (Direct Relations) ์ •์˜ profile_viewers: (User | SubjectSet)[] profile_managers: (User | SubjectSet)[] permissions_viewers: (User | SubjectSet)[] permissions_managers: (User | SubjectSet)[] organization_viewers: (User | SubjectSet)[] organization_managers: (User | SubjectSet)[] schema_viewers: (User | SubjectSet)[] schema_managers: (User | SubjectSet)[] } permits = { // 1. ํ”„๋กœํ•„ (Profile) ํƒญ ํ—ˆ๊ฐ€ ๊ทœ์น™ view_profile: (ctx: Context): boolean => this.related.profile_viewers.includes(ctx.subject) || this.permits.manage_profile(ctx) || this.permits.view(ctx), // ๋ฉค๋ฒ„/๊ด€๋ฆฌ์ž/์†Œ์œ ์ž๋Š” ๊ธฐ๋ณธ ์กฐํšŒ ๊ฐ€๋Šฅ manage_profile: (ctx: Context): boolean => this.related.profile_managers.includes(ctx.subject) || this.permits.manage(ctx), // ๊ด€๋ฆฌ์ž/์†Œ์œ ์ž๋Š” ๊ธฐ๋ณธ ์ˆ˜์ • ๊ฐ€๋Šฅ // 2. ๊ถŒํ•œ ๊ด€๋ฆฌ (Permissions) ํƒญ ํ—ˆ๊ฐ€ ๊ทœ์น™ view_permissions: (ctx: Context): boolean => this.related.permissions_viewers.includes(ctx.subject) || this.permits.manage_permissions(ctx) || this.permits.view(ctx), manage_permissions: (ctx: Context): boolean => this.related.permissions_managers.includes(ctx.subject) || this.permits.manage_admins(ctx), // ์†Œ์œ ์ž๋Š” ๊ธฐ๋ณธ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ // 3. ์กฐ์ง ๊ด€๋ฆฌ (Organization) ํƒญ ํ—ˆ๊ฐ€ ๊ทœ์น™ view_organization: (ctx: Context): boolean => this.related.organization_viewers.includes(ctx.subject) || this.permits.manage_organization(ctx) || this.permits.view(ctx), manage_organization: (ctx: Context): boolean => this.related.organization_managers.includes(ctx.subject) || this.permits.manage(ctx), // 4. ์‚ฌ์šฉ์ž ์Šคํ‚ค๋งˆ (Schema) ํƒญ ํ—ˆ๊ฐ€ ๊ทœ์น™ view_schema: (ctx: Context): boolean => this.related.schema_viewers.includes(ctx.subject) || this.permits.manage_schema(ctx) || this.permits.view(ctx), manage_schema: (ctx: Context): boolean => this.related.schema_managers.includes(ctx.subject) || this.permits.manage(ctx), // --- ๊ธฐ์กด ๋งˆ์Šคํ„ฐ ๋ฐ ์ƒ์† ๊ทœ์น™ ๋ณด์กด --- 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) } }