@portaidentity/server 1.7.3 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +28 -0
- package/dist/applications/index.d.ts +2 -2
- package/dist/applications/index.d.ts.map +1 -1
- package/dist/applications/index.js +2 -2
- package/dist/applications/index.js.map +1 -1
- package/dist/applications/repository.d.ts +49 -4
- package/dist/applications/repository.d.ts.map +1 -1
- package/dist/applications/repository.js +148 -10
- package/dist/applications/repository.js.map +1 -1
- package/dist/applications/service.d.ts +35 -17
- package/dist/applications/service.d.ts.map +1 -1
- package/dist/applications/service.js +144 -35
- package/dist/applications/service.js.map +1 -1
- package/dist/applications/types.d.ts +1 -1
- package/dist/applications/types.d.ts.map +1 -1
- package/dist/applications/validators.d.ts +14 -0
- package/dist/applications/validators.d.ts.map +1 -0
- package/dist/applications/validators.js +14 -0
- package/dist/applications/validators.js.map +1 -0
- package/dist/auth/effective-branding.d.ts +35 -0
- package/dist/auth/effective-branding.d.ts.map +1 -0
- package/dist/auth/effective-branding.js +81 -0
- package/dist/auth/effective-branding.js.map +1 -0
- package/dist/auth/email-service.d.ts +3 -8
- package/dist/auth/email-service.d.ts.map +1 -1
- package/dist/auth/email-service.js +22 -30
- package/dist/auth/email-service.js.map +1 -1
- package/dist/auth/i18n.d.ts +5 -0
- package/dist/auth/i18n.d.ts.map +1 -1
- package/dist/auth/i18n.js +6 -5
- package/dist/auth/i18n.js.map +1 -1
- package/dist/auth/rate-limiter.d.ts +6 -10
- package/dist/auth/rate-limiter.d.ts.map +1 -1
- package/dist/auth/rate-limiter.js +12 -16
- package/dist/auth/rate-limiter.js.map +1 -1
- package/dist/auth/recovery-job-processor.d.ts.map +1 -1
- package/dist/auth/recovery-job-processor.js +1 -1
- package/dist/auth/recovery-job-processor.js.map +1 -1
- package/dist/auth/template-engine.d.ts +3 -1
- package/dist/auth/template-engine.d.ts.map +1 -1
- package/dist/auth/template-engine.js +1 -1
- package/dist/auth/template-engine.js.map +1 -1
- package/dist/auth/token-repository.d.ts +9 -3
- package/dist/auth/token-repository.d.ts.map +1 -1
- package/dist/auth/token-repository.js +17 -8
- package/dist/auth/token-repository.js.map +1 -1
- package/dist/cli/commands/init.d.ts +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +12 -12
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/error-handler.d.ts +3 -2
- package/dist/cli/error-handler.d.ts.map +1 -1
- package/dist/cli/error-handler.js +9 -2
- package/dist/cli/error-handler.js.map +1 -1
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/clients/index.d.ts +1 -1
- package/dist/clients/index.js +1 -1
- package/dist/clients/repository.d.ts +24 -0
- package/dist/clients/repository.d.ts.map +1 -1
- package/dist/clients/repository.js +39 -0
- package/dist/clients/repository.js.map +1 -1
- package/dist/clients/secret-repository.d.ts +35 -8
- package/dist/clients/secret-repository.d.ts.map +1 -1
- package/dist/clients/secret-repository.js +69 -16
- package/dist/clients/secret-repository.js.map +1 -1
- package/dist/clients/secret-service.d.ts +5 -9
- package/dist/clients/secret-service.d.ts.map +1 -1
- package/dist/clients/secret-service.js +13 -22
- package/dist/clients/secret-service.js.map +1 -1
- package/dist/clients/service.d.ts +10 -13
- package/dist/clients/service.d.ts.map +1 -1
- package/dist/clients/service.js +121 -42
- package/dist/clients/service.js.map +1 -1
- package/dist/clients/types.d.ts +14 -1
- package/dist/clients/types.d.ts.map +1 -1
- package/dist/clients/types.js +1 -0
- package/dist/clients/types.js.map +1 -1
- package/dist/clients/validators.d.ts +83 -1
- package/dist/clients/validators.d.ts.map +1 -1
- package/dist/clients/validators.js +110 -0
- package/dist/clients/validators.js.map +1 -1
- package/dist/config/index.d.ts +1 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +1 -0
- package/dist/config/index.js.map +1 -1
- package/dist/config/schema.d.ts +1 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +23 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/custom-claims/repository.d.ts +14 -9
- package/dist/custom-claims/repository.d.ts.map +1 -1
- package/dist/custom-claims/repository.js +38 -11
- package/dist/custom-claims/repository.js.map +1 -1
- package/dist/custom-claims/service.d.ts +11 -6
- package/dist/custom-claims/service.d.ts.map +1 -1
- package/dist/custom-claims/service.js +43 -20
- package/dist/custom-claims/service.js.map +1 -1
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/admin-permissions.d.ts +12 -7
- package/dist/lib/admin-permissions.d.ts.map +1 -1
- package/dist/lib/admin-permissions.js +26 -16
- package/dist/lib/admin-permissions.js.map +1 -1
- package/dist/lib/audit-log.d.ts +2 -2
- package/dist/lib/audit-log.d.ts.map +1 -1
- package/dist/lib/audit-log.js +1 -1
- package/dist/lib/audit-log.js.map +1 -1
- package/dist/lib/authority-revocation.d.ts +18 -0
- package/dist/lib/authority-revocation.d.ts.map +1 -0
- package/dist/lib/authority-revocation.js +37 -0
- package/dist/lib/authority-revocation.js.map +1 -0
- package/dist/lib/branding-assets.d.ts +35 -5
- package/dist/lib/branding-assets.d.ts.map +1 -1
- package/dist/lib/branding-assets.js +33 -26
- package/dist/lib/branding-assets.js.map +1 -1
- package/dist/lib/bulk-operations.d.ts +1 -1
- package/dist/lib/bulk-operations.d.ts.map +1 -1
- package/dist/lib/bulk-operations.js +1 -13
- package/dist/lib/bulk-operations.js.map +1 -1
- package/dist/lib/cursor.d.ts +2 -0
- package/dist/lib/cursor.d.ts.map +1 -1
- package/dist/lib/cursor.js +2 -7
- package/dist/lib/cursor.js.map +1 -1
- package/dist/lib/database.d.ts.map +1 -1
- package/dist/lib/database.js +5 -0
- package/dist/lib/database.js.map +1 -1
- package/dist/lib/deletion-cleanup.d.ts +43 -0
- package/dist/lib/deletion-cleanup.d.ts.map +1 -0
- package/dist/lib/deletion-cleanup.js +207 -0
- package/dist/lib/deletion-cleanup.js.map +1 -0
- package/dist/lib/image-validator.d.ts +3 -1
- package/dist/lib/image-validator.d.ts.map +1 -1
- package/dist/lib/image-validator.js +32 -19
- package/dist/lib/image-validator.js.map +1 -1
- package/dist/lib/log-format.d.ts +20 -0
- package/dist/lib/log-format.d.ts.map +1 -0
- package/dist/lib/log-format.js +22 -0
- package/dist/lib/log-format.js.map +1 -0
- package/dist/lib/logger.d.ts +3 -1
- package/dist/lib/logger.d.ts.map +1 -1
- package/dist/lib/logger.js +21 -4
- package/dist/lib/logger.js.map +1 -1
- package/dist/lib/redis.d.ts.map +1 -1
- package/dist/lib/redis.js +3 -0
- package/dist/lib/redis.js.map +1 -1
- package/dist/lib/session-tracking.d.ts +73 -11
- package/dist/lib/session-tracking.d.ts.map +1 -1
- package/dist/lib/session-tracking.js +76 -32
- package/dist/lib/session-tracking.js.map +1 -1
- package/dist/lib/signing-key-crypto.d.ts.map +1 -1
- package/dist/lib/signing-key-crypto.js +4 -5
- package/dist/lib/signing-key-crypto.js.map +1 -1
- package/dist/lib/signing-keys.d.ts +3 -4
- package/dist/lib/signing-keys.d.ts.map +1 -1
- package/dist/lib/signing-keys.js +66 -41
- package/dist/lib/signing-keys.js.map +1 -1
- package/dist/lib/super-admin-protection.d.ts +5 -5
- package/dist/lib/super-admin-protection.d.ts.map +1 -1
- package/dist/lib/super-admin-protection.js +6 -9
- package/dist/lib/super-admin-protection.js.map +1 -1
- package/dist/lib/system-config-catalog.d.ts +268 -0
- package/dist/lib/system-config-catalog.d.ts.map +1 -0
- package/dist/lib/system-config-catalog.js +90 -0
- package/dist/lib/system-config-catalog.js.map +1 -0
- package/dist/lib/system-config.d.ts +30 -33
- package/dist/lib/system-config.d.ts.map +1 -1
- package/dist/lib/system-config.js +78 -93
- package/dist/lib/system-config.js.map +1 -1
- package/dist/lib/with-timeout.d.ts +32 -0
- package/dist/lib/with-timeout.d.ts.map +1 -0
- package/dist/lib/with-timeout.js +45 -0
- package/dist/lib/with-timeout.js.map +1 -0
- package/dist/middleware/admin-auth.d.ts +6 -5
- package/dist/middleware/admin-auth.d.ts.map +1 -1
- package/dist/middleware/admin-auth.js +30 -20
- package/dist/middleware/admin-auth.js.map +1 -1
- package/dist/middleware/admin-cors.d.ts +3 -3
- package/dist/middleware/admin-cors.js +3 -3
- package/dist/middleware/admin-mutation-audit.d.ts +3 -2
- package/dist/middleware/admin-mutation-audit.d.ts.map +1 -1
- package/dist/middleware/admin-mutation-audit.js +12 -5
- package/dist/middleware/admin-mutation-audit.js.map +1 -1
- package/dist/middleware/admin-rate-limiter.d.ts +7 -8
- package/dist/middleware/admin-rate-limiter.d.ts.map +1 -1
- package/dist/middleware/admin-rate-limiter.js +7 -8
- package/dist/middleware/admin-rate-limiter.js.map +1 -1
- package/dist/middleware/client-secret-hash.d.ts +10 -29
- package/dist/middleware/client-secret-hash.d.ts.map +1 -1
- package/dist/middleware/client-secret-hash.js +161 -59
- package/dist/middleware/client-secret-hash.js.map +1 -1
- package/dist/middleware/health.d.ts +17 -0
- package/dist/middleware/health.d.ts.map +1 -1
- package/dist/middleware/health.js +25 -21
- package/dist/middleware/health.js.map +1 -1
- package/dist/middleware/ready.d.ts.map +1 -1
- package/dist/middleware/ready.js +1 -12
- package/dist/middleware/ready.js.map +1 -1
- package/dist/middleware/require-existing-organization.d.ts +18 -0
- package/dist/middleware/require-existing-organization.d.ts.map +1 -0
- package/dist/middleware/require-existing-organization.js +38 -0
- package/dist/middleware/require-existing-organization.js.map +1 -0
- package/dist/middleware/require-permission.d.ts.map +1 -1
- package/dist/middleware/require-permission.js +35 -1
- package/dist/middleware/require-permission.js.map +1 -1
- package/dist/middleware/require-user-organization.d.ts.map +1 -1
- package/dist/middleware/require-user-organization.js +4 -2
- package/dist/middleware/require-user-organization.js.map +1 -1
- package/dist/middleware/security-headers.d.ts +18 -0
- package/dist/middleware/security-headers.d.ts.map +1 -1
- package/dist/middleware/security-headers.js +32 -1
- package/dist/middleware/security-headers.js.map +1 -1
- package/dist/middleware/tenant-resolver.d.ts +1 -2
- package/dist/middleware/tenant-resolver.d.ts.map +1 -1
- package/dist/middleware/tenant-resolver.js +1 -5
- package/dist/middleware/tenant-resolver.js.map +1 -1
- package/dist/middleware/token-rate-limiter.d.ts +37 -16
- package/dist/middleware/token-rate-limiter.d.ts.map +1 -1
- package/dist/middleware/token-rate-limiter.js +126 -54
- package/dist/middleware/token-rate-limiter.js.map +1 -1
- package/dist/oidc/account-finder.d.ts +5 -5
- package/dist/oidc/account-finder.d.ts.map +1 -1
- package/dist/oidc/account-finder.js +31 -23
- package/dist/oidc/account-finder.js.map +1 -1
- package/dist/oidc/adapter-factory.d.ts.map +1 -1
- package/dist/oidc/adapter-factory.js +83 -3
- package/dist/oidc/adapter-factory.js.map +1 -1
- package/dist/oidc/configuration.d.ts +3 -8
- package/dist/oidc/configuration.d.ts.map +1 -1
- package/dist/oidc/configuration.js +67 -50
- package/dist/oidc/configuration.js.map +1 -1
- package/dist/oidc/provider.d.ts.map +1 -1
- package/dist/oidc/provider.js +7 -0
- package/dist/oidc/provider.js.map +1 -1
- package/dist/oidc/redis-adapter.d.ts +2 -3
- package/dist/oidc/redis-adapter.d.ts.map +1 -1
- package/dist/oidc/redis-adapter.js +54 -46
- package/dist/oidc/redis-adapter.js.map +1 -1
- package/dist/organizations/branding-url.d.ts +17 -0
- package/dist/organizations/branding-url.d.ts.map +1 -0
- package/dist/organizations/branding-url.js +38 -0
- package/dist/organizations/branding-url.js.map +1 -0
- package/dist/organizations/index.d.ts +2 -2
- package/dist/organizations/index.d.ts.map +1 -1
- package/dist/organizations/index.js +1 -1
- package/dist/organizations/index.js.map +1 -1
- package/dist/organizations/repository.d.ts +22 -32
- package/dist/organizations/repository.d.ts.map +1 -1
- package/dist/organizations/repository.js +64 -45
- package/dist/organizations/repository.js.map +1 -1
- package/dist/organizations/service.d.ts +14 -46
- package/dist/organizations/service.d.ts.map +1 -1
- package/dist/organizations/service.js +60 -112
- package/dist/organizations/service.js.map +1 -1
- package/dist/organizations/types.d.ts +1 -15
- package/dist/organizations/types.d.ts.map +1 -1
- package/dist/organizations/validators.d.ts +41 -0
- package/dist/organizations/validators.d.ts.map +1 -0
- package/dist/organizations/validators.js +48 -0
- package/dist/organizations/validators.js.map +1 -0
- package/dist/portability/apply.d.ts +15 -0
- package/dist/portability/apply.d.ts.map +1 -0
- package/dist/portability/apply.js +274 -0
- package/dist/portability/apply.js.map +1 -0
- package/dist/portability/authorization.d.ts +30 -0
- package/dist/portability/authorization.d.ts.map +1 -0
- package/dist/portability/authorization.js +130 -0
- package/dist/portability/authorization.js.map +1 -0
- package/dist/portability/cleanup.d.ts +29 -0
- package/dist/portability/cleanup.d.ts.map +1 -0
- package/dist/portability/cleanup.js +167 -0
- package/dist/portability/cleanup.js.map +1 -0
- package/dist/portability/export.d.ts +18 -0
- package/dist/portability/export.d.ts.map +1 -0
- package/dist/portability/export.js +125 -0
- package/dist/portability/export.js.map +1 -0
- package/dist/portability/import-repository.d.ts +204 -0
- package/dist/portability/import-repository.d.ts.map +1 -0
- package/dist/portability/import-repository.js +348 -0
- package/dist/portability/import-repository.js.map +1 -0
- package/dist/portability/import-user-client-writers.d.ts +40 -0
- package/dist/portability/import-user-client-writers.d.ts.map +1 -0
- package/dist/portability/import-user-client-writers.js +171 -0
- package/dist/portability/import-user-client-writers.js.map +1 -0
- package/dist/portability/index.d.ts +8 -0
- package/dist/portability/index.d.ts.map +1 -0
- package/dist/portability/index.js +8 -0
- package/dist/portability/index.js.map +1 -0
- package/dist/portability/plan-support.d.ts +137 -0
- package/dist/portability/plan-support.d.ts.map +1 -0
- package/dist/portability/plan-support.js +337 -0
- package/dist/portability/plan-support.js.map +1 -0
- package/dist/portability/plan.d.ts +34 -0
- package/dist/portability/plan.d.ts.map +1 -0
- package/dist/portability/plan.js +450 -0
- package/dist/portability/plan.js.map +1 -0
- package/dist/portability/repository.d.ts +95 -0
- package/dist/portability/repository.d.ts.map +1 -0
- package/dist/portability/repository.js +390 -0
- package/dist/portability/repository.js.map +1 -0
- package/dist/portability/schema.d.ts +591 -0
- package/dist/portability/schema.d.ts.map +1 -0
- package/dist/portability/schema.js +459 -0
- package/dist/portability/schema.js.map +1 -0
- package/dist/portability/types.d.ts +382 -0
- package/dist/portability/types.d.ts.map +1 -0
- package/dist/portability/types.js +19 -0
- package/dist/portability/types.js.map +1 -0
- package/dist/rbac/errors.d.ts +4 -0
- package/dist/rbac/errors.d.ts.map +1 -1
- package/dist/rbac/errors.js +7 -0
- package/dist/rbac/errors.js.map +1 -1
- package/dist/rbac/index.d.ts +3 -3
- package/dist/rbac/index.d.ts.map +1 -1
- package/dist/rbac/index.js +3 -3
- package/dist/rbac/index.js.map +1 -1
- package/dist/rbac/mapping-repository.d.ts +84 -9
- package/dist/rbac/mapping-repository.d.ts.map +1 -1
- package/dist/rbac/mapping-repository.js +222 -55
- package/dist/rbac/mapping-repository.js.map +1 -1
- package/dist/rbac/permission-repository.d.ts +36 -19
- package/dist/rbac/permission-repository.d.ts.map +1 -1
- package/dist/rbac/permission-repository.js +93 -35
- package/dist/rbac/permission-repository.js.map +1 -1
- package/dist/rbac/permission-service.d.ts +18 -19
- package/dist/rbac/permission-service.d.ts.map +1 -1
- package/dist/rbac/permission-service.js +100 -57
- package/dist/rbac/permission-service.js.map +1 -1
- package/dist/rbac/role-repository.d.ts +29 -24
- package/dist/rbac/role-repository.d.ts.map +1 -1
- package/dist/rbac/role-repository.js +66 -43
- package/dist/rbac/role-repository.js.map +1 -1
- package/dist/rbac/role-service.d.ts +35 -32
- package/dist/rbac/role-service.d.ts.map +1 -1
- package/dist/rbac/role-service.js +210 -96
- package/dist/rbac/role-service.js.map +1 -1
- package/dist/rbac/slugs.d.ts +16 -27
- package/dist/rbac/slugs.d.ts.map +1 -1
- package/dist/rbac/slugs.js +36 -59
- package/dist/rbac/slugs.js.map +1 -1
- package/dist/rbac/types.d.ts +2 -4
- package/dist/rbac/types.d.ts.map +1 -1
- package/dist/rbac/types.js.map +1 -1
- package/dist/rbac/user-role-service.d.ts +23 -24
- package/dist/rbac/user-role-service.d.ts.map +1 -1
- package/dist/rbac/user-role-service.js +117 -61
- package/dist/rbac/user-role-service.js.map +1 -1
- package/dist/routes/applications.d.ts +4 -2
- package/dist/routes/applications.d.ts.map +1 -1
- package/dist/routes/applications.js +57 -19
- package/dist/routes/applications.js.map +1 -1
- package/dist/routes/audit.js +1 -1
- package/dist/routes/audit.js.map +1 -1
- package/dist/routes/branding.d.ts +3 -3
- package/dist/routes/branding.d.ts.map +1 -1
- package/dist/routes/branding.js +44 -16
- package/dist/routes/branding.js.map +1 -1
- package/dist/routes/bulk.d.ts +0 -5
- package/dist/routes/bulk.d.ts.map +1 -1
- package/dist/routes/bulk.js +3 -5
- package/dist/routes/bulk.js.map +1 -1
- package/dist/routes/clients.d.ts +4 -4
- package/dist/routes/clients.d.ts.map +1 -1
- package/dist/routes/clients.js +113 -52
- package/dist/routes/clients.js.map +1 -1
- package/dist/routes/config.d.ts +17 -12
- package/dist/routes/config.d.ts.map +1 -1
- package/dist/routes/config.js +165 -64
- package/dist/routes/config.js.map +1 -1
- package/dist/routes/custom-claims.d.ts.map +1 -1
- package/dist/routes/custom-claims.js +8 -2
- package/dist/routes/custom-claims.js.map +1 -1
- package/dist/routes/exports.d.ts +2 -1
- package/dist/routes/exports.d.ts.map +1 -1
- package/dist/routes/exports.js +57 -1
- package/dist/routes/exports.js.map +1 -1
- package/dist/routes/imports.d.ts +2 -2
- package/dist/routes/imports.d.ts.map +1 -1
- package/dist/routes/imports.js +95 -40
- package/dist/routes/imports.js.map +1 -1
- package/dist/routes/interactions.d.ts.map +1 -1
- package/dist/routes/interactions.js +113 -87
- package/dist/routes/interactions.js.map +1 -1
- package/dist/routes/invitation.d.ts.map +1 -1
- package/dist/routes/invitation.js +28 -27
- package/dist/routes/invitation.js.map +1 -1
- package/dist/routes/keys.d.ts.map +1 -1
- package/dist/routes/keys.js +26 -13
- package/dist/routes/keys.js.map +1 -1
- package/dist/routes/magic-link.d.ts.map +1 -1
- package/dist/routes/magic-link.js +5 -17
- package/dist/routes/magic-link.js.map +1 -1
- package/dist/routes/organizations.d.ts +1 -2
- package/dist/routes/organizations.d.ts.map +1 -1
- package/dist/routes/organizations.js +43 -104
- package/dist/routes/organizations.js.map +1 -1
- package/dist/routes/password-reset.d.ts.map +1 -1
- package/dist/routes/password-reset.js +13 -35
- package/dist/routes/password-reset.js.map +1 -1
- package/dist/routes/permissions.d.ts +1 -1
- package/dist/routes/permissions.d.ts.map +1 -1
- package/dist/routes/permissions.js +58 -17
- package/dist/routes/permissions.js.map +1 -1
- package/dist/routes/public-branding.d.ts +16 -0
- package/dist/routes/public-branding.d.ts.map +1 -0
- package/dist/routes/public-branding.js +52 -0
- package/dist/routes/public-branding.js.map +1 -0
- package/dist/routes/roles.d.ts +1 -1
- package/dist/routes/roles.d.ts.map +1 -1
- package/dist/routes/roles.js +63 -21
- package/dist/routes/roles.js.map +1 -1
- package/dist/routes/sessions.d.ts.map +1 -1
- package/dist/routes/sessions.js +23 -12
- package/dist/routes/sessions.js.map +1 -1
- package/dist/routes/two-factor.d.ts.map +1 -1
- package/dist/routes/two-factor.js +91 -38
- package/dist/routes/two-factor.js.map +1 -1
- package/dist/routes/user-roles.d.ts.map +1 -1
- package/dist/routes/user-roles.js +56 -9
- package/dist/routes/user-roles.js.map +1 -1
- package/dist/routes/users.d.ts +4 -8
- package/dist/routes/users.d.ts.map +1 -1
- package/dist/routes/users.js +108 -265
- package/dist/routes/users.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +53 -37
- package/dist/server.js.map +1 -1
- package/dist/two-factor/errors.d.ts +9 -0
- package/dist/two-factor/errors.d.ts.map +1 -1
- package/dist/two-factor/errors.js +12 -0
- package/dist/two-factor/errors.js.map +1 -1
- package/dist/two-factor/index.d.ts +5 -4
- package/dist/two-factor/index.d.ts.map +1 -1
- package/dist/two-factor/index.js +4 -4
- package/dist/two-factor/index.js.map +1 -1
- package/dist/two-factor/repository.d.ts +17 -6
- package/dist/two-factor/repository.d.ts.map +1 -1
- package/dist/two-factor/repository.js +37 -9
- package/dist/two-factor/repository.js.map +1 -1
- package/dist/two-factor/service.d.ts.map +1 -1
- package/dist/two-factor/service.js +26 -19
- package/dist/two-factor/service.js.map +1 -1
- package/dist/two-factor/totp.d.ts +13 -2
- package/dist/two-factor/totp.d.ts.map +1 -1
- package/dist/two-factor/totp.js +20 -7
- package/dist/two-factor/totp.js.map +1 -1
- package/dist/two-factor/types.d.ts +3 -0
- package/dist/two-factor/types.d.ts.map +1 -1
- package/dist/two-factor/types.js +5 -0
- package/dist/two-factor/types.js.map +1 -1
- package/dist/users/gdpr.d.ts +2 -40
- package/dist/users/gdpr.d.ts.map +1 -1
- package/dist/users/gdpr.js +3 -110
- package/dist/users/gdpr.js.map +1 -1
- package/dist/users/index.d.ts +5 -4
- package/dist/users/index.d.ts.map +1 -1
- package/dist/users/index.js +5 -4
- package/dist/users/index.js.map +1 -1
- package/dist/users/repository.d.ts +49 -3
- package/dist/users/repository.d.ts.map +1 -1
- package/dist/users/repository.js +169 -18
- package/dist/users/repository.js.map +1 -1
- package/dist/users/service.d.ts +19 -51
- package/dist/users/service.d.ts.map +1 -1
- package/dist/users/service.js +72 -122
- package/dist/users/service.js.map +1 -1
- package/dist/users/types.d.ts +4 -5
- package/dist/users/types.d.ts.map +1 -1
- package/dist/users/types.js.map +1 -1
- package/dist/users/validators.d.ts +28 -0
- package/dist/users/validators.d.ts.map +1 -0
- package/dist/users/validators.js +25 -0
- package/dist/users/validators.js.map +1 -0
- package/locales/default/en/errors.json +2 -1
- package/migrations/024_application_client_correction.sql +39 -0
- package/migrations/025_record_deletion_lifecycle.sql +26 -0
- package/migrations/026_simplify_user_lifecycle.sql +33 -0
- package/migrations/027_branding_asset_size_limits.sql +19 -0
- package/migrations/028_totp_replay_protection.sql +17 -0
- package/migrations/029_public_session_identifiers.sql +16 -0
- package/migrations/030_global_configuration_catalog.sql +39 -0
- package/migrations/031_monotonic_updated_at.sql +28 -0
- package/migrations/032_client_require_consent.sql +15 -0
- package/package.json +2 -2
- package/dist/lib/data-import-plan.d.ts +0 -50
- package/dist/lib/data-import-plan.d.ts.map +0 -1
- package/dist/lib/data-import-plan.js +0 -235
- package/dist/lib/data-import-plan.js.map +0 -1
- package/dist/lib/data-import.d.ts +0 -276
- package/dist/lib/data-import.d.ts.map +0 -1
- package/dist/lib/data-import.js +0 -1694
- package/dist/lib/data-import.js.map +0 -1
|
@@ -24,40 +24,79 @@ import type { Role, Permission, UserRole } from './types.js';
|
|
|
24
24
|
* already-assigned permissions are silently skipped. This allows
|
|
25
25
|
* callers to assign without checking for existing assignments first.
|
|
26
26
|
*
|
|
27
|
+
* @param applicationId - Authoritative parent application UUID
|
|
27
28
|
* @param roleId - Role UUID
|
|
28
29
|
* @param permissionIds - Array of permission UUIDs to assign
|
|
30
|
+
* @returns Permission IDs inserted by this request
|
|
29
31
|
*/
|
|
30
|
-
export declare function assignPermissionsToRole(roleId: string, permissionIds: string[]): Promise<
|
|
32
|
+
export declare function assignPermissionsToRole(applicationId: string, roleId: string, permissionIds: string[]): Promise<string[]>;
|
|
31
33
|
/**
|
|
32
34
|
* Remove multiple permissions from a role.
|
|
33
35
|
*
|
|
34
36
|
* Silently succeeds if any of the permission IDs are not currently
|
|
35
37
|
* assigned to the role.
|
|
36
38
|
*
|
|
39
|
+
* @param applicationId - Authoritative parent application UUID
|
|
37
40
|
* @param roleId - Role UUID
|
|
38
41
|
* @param permissionIds - Array of permission UUIDs to remove
|
|
42
|
+
* @returns Permission IDs removed by this request
|
|
39
43
|
*/
|
|
40
|
-
export declare function removePermissionsFromRole(roleId: string, permissionIds: string[]): Promise<
|
|
44
|
+
export declare function removePermissionsFromRole(applicationId: string, roleId: string, permissionIds: string[]): Promise<string[]>;
|
|
45
|
+
/** Records locked for one application-scoped role-permission mutation. */
|
|
46
|
+
export interface LockedRolePermissionTargets {
|
|
47
|
+
/** Role selected through the route application, or null when it is not a child. */
|
|
48
|
+
readonly role: Role | null;
|
|
49
|
+
/** Requested permissions that belong to the same application, ordered by UUID. */
|
|
50
|
+
readonly permissions: readonly Permission[];
|
|
51
|
+
/** Requested permission IDs currently assigned to the role, ordered by UUID. */
|
|
52
|
+
readonly assignedPermissionIds: readonly string[];
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Lock a role and requested permissions before validating and changing mappings.
|
|
56
|
+
*
|
|
57
|
+
* Permissions are de-duplicated and sorted before PostgreSQL acquires row locks.
|
|
58
|
+
* This gives concurrent mapping requests one deterministic lock order. Callers
|
|
59
|
+
* compare the returned permission IDs with their requested IDs before mutating.
|
|
60
|
+
*
|
|
61
|
+
* @param applicationId - Authoritative parent application UUID
|
|
62
|
+
* @param roleId - Role UUID selected beneath the application
|
|
63
|
+
* @param permissionIds - Permission UUIDs in the mapping request
|
|
64
|
+
* @returns The owned role and owned requested permissions
|
|
65
|
+
*/
|
|
66
|
+
export declare function lockRolePermissionTargets(applicationId: string, roleId: string, permissionIds: readonly string[]): Promise<LockedRolePermissionTargets>;
|
|
67
|
+
/**
|
|
68
|
+
* List users assigned to an application-owned role.
|
|
69
|
+
*
|
|
70
|
+
* Mapping mutations call this while holding the role row lock, so concurrent
|
|
71
|
+
* assignments cannot escape affected-user capture through the role foreign key.
|
|
72
|
+
*
|
|
73
|
+
* @param applicationId - Authoritative parent application UUID
|
|
74
|
+
* @param roleId - Role UUID selected beneath the application
|
|
75
|
+
* @returns Distinct user UUIDs in stable order
|
|
76
|
+
*/
|
|
77
|
+
export declare function getUserIdsForRole(applicationId: string, roleId: string): Promise<string[]>;
|
|
41
78
|
/**
|
|
42
79
|
* Get all permissions assigned to a role.
|
|
43
80
|
*
|
|
44
81
|
* JOINs role_permissions with permissions table to return full
|
|
45
82
|
* Permission objects, ordered by slug for consistent output.
|
|
46
83
|
*
|
|
84
|
+
* @param applicationId - Authoritative parent application UUID
|
|
47
85
|
* @param roleId - Role UUID
|
|
48
86
|
* @returns Array of permissions assigned to the role
|
|
49
87
|
*/
|
|
50
|
-
export declare function getPermissionsForRole(roleId: string): Promise<Permission[]>;
|
|
88
|
+
export declare function getPermissionsForRole(applicationId: string, roleId: string): Promise<Permission[]>;
|
|
51
89
|
/**
|
|
52
90
|
* Get all roles that have a specific permission assigned.
|
|
53
91
|
*
|
|
54
92
|
* JOINs role_permissions with roles table to return full Role objects,
|
|
55
93
|
* ordered by name for consistent output.
|
|
56
94
|
*
|
|
95
|
+
* @param applicationId - Authoritative parent application UUID
|
|
57
96
|
* @param permissionId - Permission UUID
|
|
58
97
|
* @returns Array of roles that have this permission
|
|
59
98
|
*/
|
|
60
|
-
export declare function getRolesWithPermission(permissionId: string): Promise<Role[]>;
|
|
99
|
+
export declare function getRolesWithPermission(applicationId: string, permissionId: string): Promise<Role[]>;
|
|
61
100
|
/**
|
|
62
101
|
* Assign multiple roles to a user (bulk insert).
|
|
63
102
|
*
|
|
@@ -65,21 +104,54 @@ export declare function getRolesWithPermission(permissionId: string): Promise<Ro
|
|
|
65
104
|
* already-assigned roles are silently skipped. Tracks who performed
|
|
66
105
|
* the assignment via the optional assignedBy parameter.
|
|
67
106
|
*
|
|
107
|
+
* @param organizationId - Authoritative organization UUID
|
|
68
108
|
* @param userId - User UUID
|
|
69
109
|
* @param roleIds - Array of role UUIDs to assign
|
|
70
110
|
* @param assignedBy - Optional UUID of the admin who performed the assignment
|
|
111
|
+
* @returns Role IDs inserted by this call
|
|
71
112
|
*/
|
|
72
|
-
export declare function assignRolesToUser(userId: string, roleIds: string[], assignedBy?: string): Promise<
|
|
113
|
+
export declare function assignRolesToUser(organizationId: string, userId: string, roleIds: string[], assignedBy?: string): Promise<string[]>;
|
|
73
114
|
/**
|
|
74
115
|
* Remove multiple roles from a user.
|
|
75
116
|
*
|
|
76
117
|
* Silently succeeds if any of the role IDs are not currently
|
|
77
118
|
* assigned to the user.
|
|
78
119
|
*
|
|
120
|
+
* @param organizationId - Authoritative organization UUID
|
|
79
121
|
* @param userId - User UUID
|
|
80
122
|
* @param roleIds - Array of role UUIDs to remove
|
|
123
|
+
* @returns Role IDs removed by this call
|
|
124
|
+
*/
|
|
125
|
+
export declare function removeRolesFromUser(organizationId: string, userId: string, roleIds: string[]): Promise<string[]>;
|
|
126
|
+
/** Locked user and role records for one organization-scoped assignment request. */
|
|
127
|
+
export interface LockedUserRoleTargets {
|
|
128
|
+
/** Target user when it belongs to the route organization. */
|
|
129
|
+
readonly user: {
|
|
130
|
+
readonly id: string;
|
|
131
|
+
readonly status: string;
|
|
132
|
+
} | null;
|
|
133
|
+
/** Requested roles found in PostgreSQL, ordered by UUID. */
|
|
134
|
+
readonly roles: readonly Role[];
|
|
135
|
+
/** Requested role IDs currently assigned to the user, ordered by UUID. */
|
|
136
|
+
readonly assignedRoleIds: readonly string[];
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Lock one organization-owned user and requested roles before an assignment change.
|
|
140
|
+
*
|
|
141
|
+
* Role IDs are de-duplicated and sorted before locking. The returned collections
|
|
142
|
+
* let the service reject unknown targets atomically and distinguish removals from
|
|
143
|
+
* idempotent no-ops.
|
|
144
|
+
*
|
|
145
|
+
* @param organizationId - Authoritative organization UUID
|
|
146
|
+
* @param userId - User UUID beneath the organization
|
|
147
|
+
* @param roleIds - Role UUIDs in the assignment request
|
|
148
|
+
* @returns Locked target records and current direct assignments
|
|
81
149
|
*/
|
|
82
|
-
export declare function
|
|
150
|
+
export declare function lockUserRoleTargets(organizationId: string, userId: string, roleIds: readonly string[]): Promise<LockedUserRoleTargets>;
|
|
151
|
+
/** List roles for a user only when the user belongs to the route organization. */
|
|
152
|
+
export declare function getRolesForOrganizationUser(organizationId: string, userId: string): Promise<Role[]>;
|
|
153
|
+
/** List same-application permissions for an organization-owned user. */
|
|
154
|
+
export declare function getPermissionsForOrganizationUser(organizationId: string, userId: string): Promise<Permission[]>;
|
|
83
155
|
/**
|
|
84
156
|
* Get all roles assigned to a user.
|
|
85
157
|
*
|
|
@@ -87,9 +159,10 @@ export declare function removeRolesFromUser(userId: string, roleIds: string[]):
|
|
|
87
159
|
* ordered by name for consistent output.
|
|
88
160
|
*
|
|
89
161
|
* @param userId - User UUID
|
|
162
|
+
* @param applicationId - Optional application UUID used to scope token authority
|
|
90
163
|
* @returns Array of roles assigned to the user
|
|
91
164
|
*/
|
|
92
|
-
export declare function getRolesForUser(userId: string): Promise<Role[]>;
|
|
165
|
+
export declare function getRolesForUser(userId: string, applicationId?: string): Promise<Role[]>;
|
|
93
166
|
/**
|
|
94
167
|
* Get all permissions for a user, resolved through their assigned roles.
|
|
95
168
|
*
|
|
@@ -99,22 +172,24 @@ export declare function getRolesForUser(userId: string): Promise<Role[]>;
|
|
|
99
172
|
* may have the same permission through multiple roles.
|
|
100
173
|
*
|
|
101
174
|
* @param userId - User UUID
|
|
175
|
+
* @param applicationId - Optional application UUID used to scope token authority
|
|
102
176
|
* @returns Deduplicated array of permissions the user has through their roles
|
|
103
177
|
*/
|
|
104
|
-
export declare function getPermissionsForUser(userId: string): Promise<Permission[]>;
|
|
178
|
+
export declare function getPermissionsForUser(userId: string, applicationId?: string): Promise<Permission[]>;
|
|
105
179
|
/**
|
|
106
180
|
* List user-role assignments for a specific role within an organization.
|
|
107
181
|
*
|
|
108
182
|
* Supports pagination for admin UI views showing which users have a
|
|
109
183
|
* particular role. JOINs with users table to filter by organization.
|
|
110
184
|
*
|
|
185
|
+
* @param applicationId - Authoritative parent application UUID
|
|
111
186
|
* @param roleId - Role UUID
|
|
112
187
|
* @param orgId - Organization UUID (to scope users)
|
|
113
188
|
* @param page - Page number (1-based)
|
|
114
189
|
* @param pageSize - Number of results per page
|
|
115
190
|
* @returns Paginated user-role assignments and total count
|
|
116
191
|
*/
|
|
117
|
-
export declare function getUsersWithRole(roleId: string, orgId: string, page: number, pageSize: number): Promise<{
|
|
192
|
+
export declare function getUsersWithRole(applicationId: string, roleId: string, orgId: string, page: number, pageSize: number): Promise<{
|
|
118
193
|
rows: UserRole[];
|
|
119
194
|
total: number;
|
|
120
195
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapping-repository.d.ts","sourceRoot":"","sources":["../../src/rbac/mapping-repository.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,IAAI,EAAW,UAAU,EAAiB,QAAQ,EAAe,MAAM,YAAY,CAAC;AAOlG
|
|
1
|
+
{"version":3,"file":"mapping-repository.d.ts","sourceRoot":"","sources":["../../src/rbac/mapping-repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,24 +28,25 @@ import { mapRowToRole, mapRowToPermission, mapRowToUserRole } from './types.js';
|
|
|
28
28
|
* already-assigned permissions are silently skipped. This allows
|
|
29
29
|
* callers to assign without checking for existing assignments first.
|
|
30
30
|
*
|
|
31
|
+
* @param applicationId - Authoritative parent application UUID
|
|
31
32
|
* @param roleId - Role UUID
|
|
32
33
|
* @param permissionIds - Array of permission UUIDs to assign
|
|
34
|
+
* @returns Permission IDs inserted by this request
|
|
33
35
|
*/
|
|
34
|
-
export async function assignPermissionsToRole(roleId, permissionIds) {
|
|
36
|
+
export async function assignPermissionsToRole(applicationId, roleId, permissionIds) {
|
|
35
37
|
if (permissionIds.length === 0)
|
|
36
|
-
return;
|
|
38
|
+
return [];
|
|
37
39
|
const pool = getPool();
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
ON CONFLICT DO NOTHING`, params);
|
|
40
|
+
const result = await pool.query(`INSERT INTO role_permissions (role_id, permission_id)
|
|
41
|
+
SELECT role.id, permission.id
|
|
42
|
+
FROM roles role
|
|
43
|
+
JOIN permissions permission ON permission.application_id = role.application_id
|
|
44
|
+
WHERE role.application_id = $1
|
|
45
|
+
AND role.id = $2
|
|
46
|
+
AND permission.id = ANY($3::uuid[])
|
|
47
|
+
ON CONFLICT DO NOTHING
|
|
48
|
+
RETURNING permission_id`, [applicationId, roleId, permissionIds]);
|
|
49
|
+
return result.rows.map((row) => row.permission_id);
|
|
49
50
|
}
|
|
50
51
|
/**
|
|
51
52
|
* Remove multiple permissions from a role.
|
|
@@ -53,17 +54,92 @@ export async function assignPermissionsToRole(roleId, permissionIds) {
|
|
|
53
54
|
* Silently succeeds if any of the permission IDs are not currently
|
|
54
55
|
* assigned to the role.
|
|
55
56
|
*
|
|
57
|
+
* @param applicationId - Authoritative parent application UUID
|
|
56
58
|
* @param roleId - Role UUID
|
|
57
59
|
* @param permissionIds - Array of permission UUIDs to remove
|
|
60
|
+
* @returns Permission IDs removed by this request
|
|
58
61
|
*/
|
|
59
|
-
export async function removePermissionsFromRole(roleId, permissionIds) {
|
|
62
|
+
export async function removePermissionsFromRole(applicationId, roleId, permissionIds) {
|
|
60
63
|
if (permissionIds.length === 0)
|
|
61
|
-
return;
|
|
64
|
+
return [];
|
|
62
65
|
const pool = getPool();
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
66
|
+
const result = await pool.query(`DELETE FROM role_permissions mapping
|
|
67
|
+
USING roles role, permissions permission
|
|
68
|
+
WHERE mapping.role_id = role.id
|
|
69
|
+
AND mapping.permission_id = permission.id
|
|
70
|
+
AND role.application_id = $1
|
|
71
|
+
AND permission.application_id = $1
|
|
72
|
+
AND role.id = $2
|
|
73
|
+
AND permission.id = ANY($3::uuid[])
|
|
74
|
+
RETURNING mapping.permission_id`, [applicationId, roleId, permissionIds]);
|
|
75
|
+
return result.rows.map((row) => row.permission_id);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Lock a role and requested permissions before validating and changing mappings.
|
|
79
|
+
*
|
|
80
|
+
* Permissions are de-duplicated and sorted before PostgreSQL acquires row locks.
|
|
81
|
+
* This gives concurrent mapping requests one deterministic lock order. Callers
|
|
82
|
+
* compare the returned permission IDs with their requested IDs before mutating.
|
|
83
|
+
*
|
|
84
|
+
* @param applicationId - Authoritative parent application UUID
|
|
85
|
+
* @param roleId - Role UUID selected beneath the application
|
|
86
|
+
* @param permissionIds - Permission UUIDs in the mapping request
|
|
87
|
+
* @returns The owned role and owned requested permissions
|
|
88
|
+
*/
|
|
89
|
+
export async function lockRolePermissionTargets(applicationId, roleId, permissionIds) {
|
|
90
|
+
const pool = getPool();
|
|
91
|
+
const orderedPermissionIds = [...new Set(permissionIds)].sort();
|
|
92
|
+
const permissionResult = orderedPermissionIds.length === 0
|
|
93
|
+
? { rows: [] }
|
|
94
|
+
: await pool.query(`SELECT * FROM permissions
|
|
95
|
+
WHERE application_id = $1 AND id = ANY($2::uuid[])
|
|
96
|
+
ORDER BY id
|
|
97
|
+
FOR UPDATE`, [applicationId, orderedPermissionIds]);
|
|
98
|
+
const roleResult = await pool.query(`SELECT * FROM roles
|
|
99
|
+
WHERE application_id = $1 AND id = $2
|
|
100
|
+
FOR UPDATE`, [applicationId, roleId]);
|
|
101
|
+
if (!roleResult.rows[0]) {
|
|
102
|
+
return { role: null, permissions: [], assignedPermissionIds: [] };
|
|
103
|
+
}
|
|
104
|
+
if (orderedPermissionIds.length === 0) {
|
|
105
|
+
return {
|
|
106
|
+
role: mapRowToRole(roleResult.rows[0]),
|
|
107
|
+
permissions: [],
|
|
108
|
+
assignedPermissionIds: [],
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
const mappingResult = await pool.query(`SELECT mapping.permission_id
|
|
112
|
+
FROM role_permissions mapping
|
|
113
|
+
JOIN roles role ON role.id = mapping.role_id
|
|
114
|
+
JOIN permissions permission ON permission.id = mapping.permission_id
|
|
115
|
+
WHERE role.application_id = $1
|
|
116
|
+
AND permission.application_id = $1
|
|
117
|
+
AND role.id = $2
|
|
118
|
+
AND mapping.permission_id = ANY($3::uuid[])
|
|
119
|
+
ORDER BY mapping.permission_id`, [applicationId, roleId, orderedPermissionIds]);
|
|
120
|
+
return {
|
|
121
|
+
role: mapRowToRole(roleResult.rows[0]),
|
|
122
|
+
permissions: permissionResult.rows.map(mapRowToPermission),
|
|
123
|
+
assignedPermissionIds: mappingResult.rows.map((row) => row.permission_id),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* List users assigned to an application-owned role.
|
|
128
|
+
*
|
|
129
|
+
* Mapping mutations call this while holding the role row lock, so concurrent
|
|
130
|
+
* assignments cannot escape affected-user capture through the role foreign key.
|
|
131
|
+
*
|
|
132
|
+
* @param applicationId - Authoritative parent application UUID
|
|
133
|
+
* @param roleId - Role UUID selected beneath the application
|
|
134
|
+
* @returns Distinct user UUIDs in stable order
|
|
135
|
+
*/
|
|
136
|
+
export async function getUserIdsForRole(applicationId, roleId) {
|
|
137
|
+
const result = await getPool().query(`SELECT DISTINCT assignment.user_id
|
|
138
|
+
FROM user_roles assignment
|
|
139
|
+
JOIN roles role ON role.id = assignment.role_id
|
|
140
|
+
WHERE role.application_id = $1 AND role.id = $2
|
|
141
|
+
ORDER BY assignment.user_id`, [applicationId, roleId]);
|
|
142
|
+
return result.rows.map((row) => row.user_id);
|
|
67
143
|
}
|
|
68
144
|
/**
|
|
69
145
|
* Get all permissions assigned to a role.
|
|
@@ -71,16 +147,20 @@ export async function removePermissionsFromRole(roleId, permissionIds) {
|
|
|
71
147
|
* JOINs role_permissions with permissions table to return full
|
|
72
148
|
* Permission objects, ordered by slug for consistent output.
|
|
73
149
|
*
|
|
150
|
+
* @param applicationId - Authoritative parent application UUID
|
|
74
151
|
* @param roleId - Role UUID
|
|
75
152
|
* @returns Array of permissions assigned to the role
|
|
76
153
|
*/
|
|
77
|
-
export async function getPermissionsForRole(roleId) {
|
|
154
|
+
export async function getPermissionsForRole(applicationId, roleId) {
|
|
78
155
|
const pool = getPool();
|
|
79
156
|
const result = await pool.query(`SELECT p.*
|
|
80
157
|
FROM role_permissions rp
|
|
158
|
+
JOIN roles r ON r.id = rp.role_id
|
|
81
159
|
JOIN permissions p ON p.id = rp.permission_id
|
|
82
|
-
WHERE
|
|
83
|
-
|
|
160
|
+
WHERE r.application_id = $1
|
|
161
|
+
AND p.application_id = $1
|
|
162
|
+
AND rp.role_id = $2
|
|
163
|
+
ORDER BY p.slug ASC`, [applicationId, roleId]);
|
|
84
164
|
return result.rows.map(mapRowToPermission);
|
|
85
165
|
}
|
|
86
166
|
/**
|
|
@@ -89,16 +169,20 @@ export async function getPermissionsForRole(roleId) {
|
|
|
89
169
|
* JOINs role_permissions with roles table to return full Role objects,
|
|
90
170
|
* ordered by name for consistent output.
|
|
91
171
|
*
|
|
172
|
+
* @param applicationId - Authoritative parent application UUID
|
|
92
173
|
* @param permissionId - Permission UUID
|
|
93
174
|
* @returns Array of roles that have this permission
|
|
94
175
|
*/
|
|
95
|
-
export async function getRolesWithPermission(permissionId) {
|
|
176
|
+
export async function getRolesWithPermission(applicationId, permissionId) {
|
|
96
177
|
const pool = getPool();
|
|
97
178
|
const result = await pool.query(`SELECT r.*
|
|
98
179
|
FROM role_permissions rp
|
|
180
|
+
JOIN permissions p ON p.id = rp.permission_id
|
|
99
181
|
JOIN roles r ON r.id = rp.role_id
|
|
100
|
-
WHERE
|
|
101
|
-
|
|
182
|
+
WHERE p.application_id = $1
|
|
183
|
+
AND r.application_id = $1
|
|
184
|
+
AND rp.permission_id = $2
|
|
185
|
+
ORDER BY r.name ASC`, [applicationId, permissionId]);
|
|
102
186
|
return result.rows.map(mapRowToRole);
|
|
103
187
|
}
|
|
104
188
|
// ===========================================================================
|
|
@@ -111,25 +195,26 @@ export async function getRolesWithPermission(permissionId) {
|
|
|
111
195
|
* already-assigned roles are silently skipped. Tracks who performed
|
|
112
196
|
* the assignment via the optional assignedBy parameter.
|
|
113
197
|
*
|
|
198
|
+
* @param organizationId - Authoritative organization UUID
|
|
114
199
|
* @param userId - User UUID
|
|
115
200
|
* @param roleIds - Array of role UUIDs to assign
|
|
116
201
|
* @param assignedBy - Optional UUID of the admin who performed the assignment
|
|
202
|
+
* @returns Role IDs inserted by this call
|
|
117
203
|
*/
|
|
118
|
-
export async function assignRolesToUser(userId, roleIds, assignedBy) {
|
|
204
|
+
export async function assignRolesToUser(organizationId, userId, roleIds, assignedBy) {
|
|
119
205
|
if (roleIds.length === 0)
|
|
120
|
-
return;
|
|
206
|
+
return [];
|
|
121
207
|
const pool = getPool();
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
ON CONFLICT DO NOTHING`, params);
|
|
208
|
+
const result = await pool.query(`INSERT INTO user_roles (user_id, role_id, assigned_by)
|
|
209
|
+
SELECT target.id, role.id, $4
|
|
210
|
+
FROM users target
|
|
211
|
+
CROSS JOIN roles role
|
|
212
|
+
WHERE target.organization_id = $1
|
|
213
|
+
AND target.id = $2
|
|
214
|
+
AND role.id = ANY($3::uuid[])
|
|
215
|
+
ON CONFLICT DO NOTHING
|
|
216
|
+
RETURNING role_id`, [organizationId, userId, roleIds, assignedBy ?? null]);
|
|
217
|
+
return result.rows.map((row) => row.role_id);
|
|
133
218
|
}
|
|
134
219
|
/**
|
|
135
220
|
* Remove multiple roles from a user.
|
|
@@ -137,17 +222,87 @@ export async function assignRolesToUser(userId, roleIds, assignedBy) {
|
|
|
137
222
|
* Silently succeeds if any of the role IDs are not currently
|
|
138
223
|
* assigned to the user.
|
|
139
224
|
*
|
|
225
|
+
* @param organizationId - Authoritative organization UUID
|
|
140
226
|
* @param userId - User UUID
|
|
141
227
|
* @param roleIds - Array of role UUIDs to remove
|
|
228
|
+
* @returns Role IDs removed by this call
|
|
142
229
|
*/
|
|
143
|
-
export async function removeRolesFromUser(userId, roleIds) {
|
|
230
|
+
export async function removeRolesFromUser(organizationId, userId, roleIds) {
|
|
144
231
|
if (roleIds.length === 0)
|
|
145
|
-
return;
|
|
232
|
+
return [];
|
|
146
233
|
const pool = getPool();
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
234
|
+
const result = await pool.query(`DELETE FROM user_roles assignment
|
|
235
|
+
USING users target, roles role
|
|
236
|
+
WHERE assignment.user_id = target.id
|
|
237
|
+
AND assignment.role_id = role.id
|
|
238
|
+
AND target.organization_id = $1
|
|
239
|
+
AND target.id = $2
|
|
240
|
+
AND role.id = ANY($3::uuid[])
|
|
241
|
+
RETURNING assignment.role_id`, [organizationId, userId, roleIds]);
|
|
242
|
+
return result.rows.map((row) => row.role_id);
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Lock one organization-owned user and requested roles before an assignment change.
|
|
246
|
+
*
|
|
247
|
+
* Role IDs are de-duplicated and sorted before locking. The returned collections
|
|
248
|
+
* let the service reject unknown targets atomically and distinguish removals from
|
|
249
|
+
* idempotent no-ops.
|
|
250
|
+
*
|
|
251
|
+
* @param organizationId - Authoritative organization UUID
|
|
252
|
+
* @param userId - User UUID beneath the organization
|
|
253
|
+
* @param roleIds - Role UUIDs in the assignment request
|
|
254
|
+
* @returns Locked target records and current direct assignments
|
|
255
|
+
*/
|
|
256
|
+
export async function lockUserRoleTargets(organizationId, userId, roleIds) {
|
|
257
|
+
const pool = getPool();
|
|
258
|
+
const userResult = await pool.query(`SELECT id, status FROM users
|
|
259
|
+
WHERE organization_id = $1 AND id = $2
|
|
260
|
+
FOR UPDATE`, [organizationId, userId]);
|
|
261
|
+
if (!userResult.rows[0])
|
|
262
|
+
return { user: null, roles: [], assignedRoleIds: [] };
|
|
263
|
+
const orderedRoleIds = [...new Set(roleIds)].sort();
|
|
264
|
+
if (orderedRoleIds.length === 0) {
|
|
265
|
+
return { user: userResult.rows[0], roles: [], assignedRoleIds: [] };
|
|
266
|
+
}
|
|
267
|
+
const roleResult = await pool.query(`SELECT * FROM roles
|
|
268
|
+
WHERE id = ANY($1::uuid[])
|
|
269
|
+
ORDER BY id
|
|
270
|
+
FOR UPDATE`, [orderedRoleIds]);
|
|
271
|
+
const assignmentResult = await pool.query(`SELECT assignment.role_id
|
|
272
|
+
FROM user_roles assignment
|
|
273
|
+
JOIN users target ON target.id = assignment.user_id
|
|
274
|
+
WHERE target.organization_id = $1
|
|
275
|
+
AND target.id = $2
|
|
276
|
+
AND assignment.role_id = ANY($3::uuid[])
|
|
277
|
+
ORDER BY assignment.role_id`, [organizationId, userId, orderedRoleIds]);
|
|
278
|
+
return {
|
|
279
|
+
user: userResult.rows[0],
|
|
280
|
+
roles: roleResult.rows.map(mapRowToRole),
|
|
281
|
+
assignedRoleIds: assignmentResult.rows.map((row) => row.role_id),
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
/** List roles for a user only when the user belongs to the route organization. */
|
|
285
|
+
export async function getRolesForOrganizationUser(organizationId, userId) {
|
|
286
|
+
const result = await getPool().query(`SELECT role.*
|
|
287
|
+
FROM users target
|
|
288
|
+
JOIN user_roles assignment ON assignment.user_id = target.id
|
|
289
|
+
JOIN roles role ON role.id = assignment.role_id
|
|
290
|
+
WHERE target.organization_id = $1 AND target.id = $2
|
|
291
|
+
ORDER BY role.name ASC`, [organizationId, userId]);
|
|
292
|
+
return result.rows.map(mapRowToRole);
|
|
293
|
+
}
|
|
294
|
+
/** List same-application permissions for an organization-owned user. */
|
|
295
|
+
export async function getPermissionsForOrganizationUser(organizationId, userId) {
|
|
296
|
+
const result = await getPool().query(`SELECT DISTINCT permission.*
|
|
297
|
+
FROM users target
|
|
298
|
+
JOIN user_roles assignment ON assignment.user_id = target.id
|
|
299
|
+
JOIN roles role ON role.id = assignment.role_id
|
|
300
|
+
JOIN role_permissions mapping ON mapping.role_id = role.id
|
|
301
|
+
JOIN permissions permission ON permission.id = mapping.permission_id
|
|
302
|
+
AND permission.application_id = role.application_id
|
|
303
|
+
WHERE target.organization_id = $1 AND target.id = $2
|
|
304
|
+
ORDER BY permission.slug ASC`, [organizationId, userId]);
|
|
305
|
+
return result.rows.map(mapRowToPermission);
|
|
151
306
|
}
|
|
152
307
|
/**
|
|
153
308
|
* Get all roles assigned to a user.
|
|
@@ -156,15 +311,18 @@ export async function removeRolesFromUser(userId, roleIds) {
|
|
|
156
311
|
* ordered by name for consistent output.
|
|
157
312
|
*
|
|
158
313
|
* @param userId - User UUID
|
|
314
|
+
* @param applicationId - Optional application UUID used to scope token authority
|
|
159
315
|
* @returns Array of roles assigned to the user
|
|
160
316
|
*/
|
|
161
|
-
export async function getRolesForUser(userId) {
|
|
317
|
+
export async function getRolesForUser(userId, applicationId) {
|
|
162
318
|
const pool = getPool();
|
|
319
|
+
const applicationFilter = applicationId ? ' AND r.application_id = $2' : '';
|
|
320
|
+
const params = applicationId ? [userId, applicationId] : [userId];
|
|
163
321
|
const result = await pool.query(`SELECT r.*
|
|
164
322
|
FROM user_roles ur
|
|
165
323
|
JOIN roles r ON r.id = ur.role_id
|
|
166
|
-
WHERE ur.user_id = $1
|
|
167
|
-
ORDER BY r.name ASC`,
|
|
324
|
+
WHERE ur.user_id = $1${applicationFilter}
|
|
325
|
+
ORDER BY r.name ASC`, params);
|
|
168
326
|
return result.rows.map(mapRowToRole);
|
|
169
327
|
}
|
|
170
328
|
/**
|
|
@@ -176,16 +334,22 @@ export async function getRolesForUser(userId) {
|
|
|
176
334
|
* may have the same permission through multiple roles.
|
|
177
335
|
*
|
|
178
336
|
* @param userId - User UUID
|
|
337
|
+
* @param applicationId - Optional application UUID used to scope token authority
|
|
179
338
|
* @returns Deduplicated array of permissions the user has through their roles
|
|
180
339
|
*/
|
|
181
|
-
export async function getPermissionsForUser(userId) {
|
|
340
|
+
export async function getPermissionsForUser(userId, applicationId) {
|
|
182
341
|
const pool = getPool();
|
|
342
|
+
const applicationFilter = applicationId
|
|
343
|
+
? ' AND r.application_id = $2 AND p.application_id = $2'
|
|
344
|
+
: '';
|
|
345
|
+
const params = applicationId ? [userId, applicationId] : [userId];
|
|
183
346
|
const result = await pool.query(`SELECT DISTINCT p.*
|
|
184
347
|
FROM user_roles ur
|
|
348
|
+
JOIN roles r ON r.id = ur.role_id
|
|
185
349
|
JOIN role_permissions rp ON rp.role_id = ur.role_id
|
|
186
|
-
JOIN permissions p ON p.id = rp.permission_id
|
|
187
|
-
WHERE ur.user_id = $1
|
|
188
|
-
ORDER BY p.slug ASC`,
|
|
350
|
+
JOIN permissions p ON p.id = rp.permission_id AND p.application_id = r.application_id
|
|
351
|
+
WHERE ur.user_id = $1${applicationFilter}
|
|
352
|
+
ORDER BY p.slug ASC`, params);
|
|
189
353
|
return result.rows.map(mapRowToPermission);
|
|
190
354
|
}
|
|
191
355
|
/**
|
|
@@ -194,28 +358,31 @@ export async function getPermissionsForUser(userId) {
|
|
|
194
358
|
* Supports pagination for admin UI views showing which users have a
|
|
195
359
|
* particular role. JOINs with users table to filter by organization.
|
|
196
360
|
*
|
|
361
|
+
* @param applicationId - Authoritative parent application UUID
|
|
197
362
|
* @param roleId - Role UUID
|
|
198
363
|
* @param orgId - Organization UUID (to scope users)
|
|
199
364
|
* @param page - Page number (1-based)
|
|
200
365
|
* @param pageSize - Number of results per page
|
|
201
366
|
* @returns Paginated user-role assignments and total count
|
|
202
367
|
*/
|
|
203
|
-
export async function getUsersWithRole(roleId, orgId, page, pageSize) {
|
|
368
|
+
export async function getUsersWithRole(applicationId, roleId, orgId, page, pageSize) {
|
|
204
369
|
const pool = getPool();
|
|
205
370
|
const offset = (page - 1) * pageSize;
|
|
206
371
|
// Count total matching assignments
|
|
207
372
|
const countResult = await pool.query(`SELECT COUNT(*)::int as count
|
|
208
373
|
FROM user_roles ur
|
|
209
374
|
JOIN users u ON u.id = ur.user_id
|
|
210
|
-
|
|
375
|
+
JOIN roles r ON r.id = ur.role_id
|
|
376
|
+
WHERE r.application_id = $1 AND ur.role_id = $2 AND u.organization_id = $3`, [applicationId, roleId, orgId]);
|
|
211
377
|
const total = parseInt(countResult.rows[0].count, 10);
|
|
212
378
|
// Fetch paginated data
|
|
213
379
|
const dataResult = await pool.query(`SELECT ur.*
|
|
214
380
|
FROM user_roles ur
|
|
215
381
|
JOIN users u ON u.id = ur.user_id
|
|
216
|
-
|
|
382
|
+
JOIN roles r ON r.id = ur.role_id
|
|
383
|
+
WHERE r.application_id = $1 AND ur.role_id = $2 AND u.organization_id = $3
|
|
217
384
|
ORDER BY ur.created_at DESC
|
|
218
|
-
LIMIT $
|
|
385
|
+
LIMIT $4 OFFSET $5`, [applicationId, roleId, orgId, pageSize, offset]);
|
|
219
386
|
return {
|
|
220
387
|
rows: dataResult.rows.map(mapRowToUserRole),
|
|
221
388
|
total,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapping-repository.js","sourceRoot":"","sources":["../../src/rbac/mapping-repository.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEhF,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAE9E
|
|
1
|
+
{"version":3,"file":"mapping-repository.js","sourceRoot":"","sources":["../../src/rbac/mapping-repository.ts"],"names":[],"mappings":"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"}
|