@portaidentity/server 1.7.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 +11 -0
- package/LICENSE +21 -0
- package/README.md +33 -0
- package/dist/applications/cache.d.ts +64 -0
- package/dist/applications/cache.d.ts.map +1 -0
- package/dist/applications/cache.js +161 -0
- package/dist/applications/cache.js.map +1 -0
- package/dist/applications/errors.d.ts +25 -0
- package/dist/applications/errors.d.ts.map +1 -0
- package/dist/applications/errors.js +31 -0
- package/dist/applications/errors.js.map +1 -0
- package/dist/applications/index.d.ts +17 -0
- package/dist/applications/index.d.ts.map +1 -0
- package/dist/applications/index.js +19 -0
- package/dist/applications/index.js.map +1 -0
- package/dist/applications/repository.d.ts +184 -0
- package/dist/applications/repository.d.ts.map +1 -0
- package/dist/applications/repository.js +367 -0
- package/dist/applications/repository.js.map +1 -0
- package/dist/applications/service.d.ts +160 -0
- package/dist/applications/service.d.ts.map +1 -0
- package/dist/applications/service.js +388 -0
- package/dist/applications/service.js.map +1 -0
- package/dist/applications/slugs.d.ts +61 -0
- package/dist/applications/slugs.d.ts.map +1 -0
- package/dist/applications/slugs.js +115 -0
- package/dist/applications/slugs.js.map +1 -0
- package/dist/applications/types.d.ts +129 -0
- package/dist/applications/types.d.ts.map +1 -0
- package/dist/applications/types.js +62 -0
- package/dist/applications/types.js.map +1 -0
- package/dist/auth/csrf.d.ts +71 -0
- package/dist/auth/csrf.d.ts.map +1 -0
- package/dist/auth/csrf.js +112 -0
- package/dist/auth/csrf.js.map +1 -0
- package/dist/auth/email-renderer.d.ts +37 -0
- package/dist/auth/email-renderer.d.ts.map +1 -0
- package/dist/auth/email-renderer.js +116 -0
- package/dist/auth/email-renderer.js.map +1 -0
- package/dist/auth/email-service.d.ts +154 -0
- package/dist/auth/email-service.d.ts.map +1 -0
- package/dist/auth/email-service.js +415 -0
- package/dist/auth/email-service.js.map +1 -0
- package/dist/auth/email-transport.d.ts +65 -0
- package/dist/auth/email-transport.d.ts.map +1 -0
- package/dist/auth/email-transport.js +82 -0
- package/dist/auth/email-transport.js.map +1 -0
- package/dist/auth/i18n.d.ts +81 -0
- package/dist/auth/i18n.d.ts.map +1 -0
- package/dist/auth/i18n.js +395 -0
- package/dist/auth/i18n.js.map +1 -0
- package/dist/auth/index.d.ts +28 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +31 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/interaction-authority.d.ts +39 -0
- package/dist/auth/interaction-authority.d.ts.map +1 -0
- package/dist/auth/interaction-authority.js +30 -0
- package/dist/auth/interaction-authority.js.map +1 -0
- package/dist/auth/magic-link-session.d.ts +81 -0
- package/dist/auth/magic-link-session.d.ts.map +1 -0
- package/dist/auth/magic-link-session.js +183 -0
- package/dist/auth/magic-link-session.js.map +1 -0
- package/dist/auth/rate-limiter.d.ts +143 -0
- package/dist/auth/rate-limiter.d.ts.map +1 -0
- package/dist/auth/rate-limiter.js +220 -0
- package/dist/auth/rate-limiter.js.map +1 -0
- package/dist/auth/recovery-crypto.d.ts +34 -0
- package/dist/auth/recovery-crypto.d.ts.map +1 -0
- package/dist/auth/recovery-crypto.js +103 -0
- package/dist/auth/recovery-crypto.js.map +1 -0
- package/dist/auth/recovery-job-processor.d.ts +24 -0
- package/dist/auth/recovery-job-processor.d.ts.map +1 -0
- package/dist/auth/recovery-job-processor.js +123 -0
- package/dist/auth/recovery-job-processor.js.map +1 -0
- package/dist/auth/recovery-job-repository.d.ts +219 -0
- package/dist/auth/recovery-job-repository.d.ts.map +1 -0
- package/dist/auth/recovery-job-repository.js +340 -0
- package/dist/auth/recovery-job-repository.js.map +1 -0
- package/dist/auth/recovery-service.d.ts +27 -0
- package/dist/auth/recovery-service.d.ts.map +1 -0
- package/dist/auth/recovery-service.js +53 -0
- package/dist/auth/recovery-service.js.map +1 -0
- package/dist/auth/recovery-worker.d.ts +158 -0
- package/dist/auth/recovery-worker.d.ts.map +1 -0
- package/dist/auth/recovery-worker.js +306 -0
- package/dist/auth/recovery-worker.js.map +1 -0
- package/dist/auth/template-engine.d.ts +134 -0
- package/dist/auth/template-engine.d.ts.map +1 -0
- package/dist/auth/template-engine.js +225 -0
- package/dist/auth/template-engine.js.map +1 -0
- package/dist/auth/token-repository.d.ts +238 -0
- package/dist/auth/token-repository.d.ts.map +1 -0
- package/dist/auth/token-repository.js +475 -0
- package/dist/auth/token-repository.js.map +1 -0
- package/dist/auth/tokens.d.ts +45 -0
- package/dist/auth/tokens.d.ts.map +1 -0
- package/dist/auth/tokens.js +51 -0
- package/dist/auth/tokens.js.map +1 -0
- package/dist/cli/bootstrap.d.ts +55 -0
- package/dist/cli/bootstrap.d.ts.map +1 -0
- package/dist/cli/bootstrap.js +90 -0
- package/dist/cli/bootstrap.js.map +1 -0
- package/dist/cli/commands/health.d.ts +20 -0
- package/dist/cli/commands/health.d.ts.map +1 -0
- package/dist/cli/commands/health.js +80 -0
- package/dist/cli/commands/health.js.map +1 -0
- package/dist/cli/commands/init.d.ts +48 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +349 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/migrate.d.ts +19 -0
- package/dist/cli/commands/migrate.d.ts.map +1 -0
- package/dist/cli/commands/migrate.js +88 -0
- package/dist/cli/commands/migrate.js.map +1 -0
- package/dist/cli/commands/seed.d.ts +19 -0
- package/dist/cli/commands/seed.d.ts.map +1 -0
- package/dist/cli/commands/seed.js +71 -0
- package/dist/cli/commands/seed.js.map +1 -0
- package/dist/cli/commands/user-2fa.d.ts +29 -0
- package/dist/cli/commands/user-2fa.d.ts.map +1 -0
- package/dist/cli/commands/user-2fa.js +113 -0
- package/dist/cli/commands/user-2fa.js.map +1 -0
- package/dist/cli/error-handler.d.ts +31 -0
- package/dist/cli/error-handler.d.ts.map +1 -0
- package/dist/cli/error-handler.js +65 -0
- package/dist/cli/error-handler.js.map +1 -0
- package/dist/cli/index.d.ts +48 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +99 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/output.d.ts +94 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +124 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/prompt.d.ts +48 -0
- package/dist/cli/prompt.d.ts.map +1 -0
- package/dist/cli/prompt.js +96 -0
- package/dist/cli/prompt.js.map +1 -0
- package/dist/clients/cache.d.ts +63 -0
- package/dist/clients/cache.d.ts.map +1 -0
- package/dist/clients/cache.js +160 -0
- package/dist/clients/cache.js.map +1 -0
- package/dist/clients/crypto.d.ts +69 -0
- package/dist/clients/crypto.d.ts.map +1 -0
- package/dist/clients/crypto.js +83 -0
- package/dist/clients/crypto.js.map +1 -0
- package/dist/clients/errors.d.ts +27 -0
- package/dist/clients/errors.d.ts.map +1 -0
- package/dist/clients/errors.js +33 -0
- package/dist/clients/errors.js.map +1 -0
- package/dist/clients/index.d.ts +19 -0
- package/dist/clients/index.d.ts.map +1 -0
- package/dist/clients/index.js +23 -0
- package/dist/clients/index.js.map +1 -0
- package/dist/clients/repository.d.ts +161 -0
- package/dist/clients/repository.d.ts.map +1 -0
- package/dist/clients/repository.js +318 -0
- package/dist/clients/repository.js.map +1 -0
- package/dist/clients/resolve-login-methods.d.ts +74 -0
- package/dist/clients/resolve-login-methods.d.ts.map +1 -0
- package/dist/clients/resolve-login-methods.js +68 -0
- package/dist/clients/resolve-login-methods.js.map +1 -0
- package/dist/clients/secret-repository.d.ts +109 -0
- package/dist/clients/secret-repository.d.ts.map +1 -0
- package/dist/clients/secret-repository.js +166 -0
- package/dist/clients/secret-repository.js.map +1 -0
- package/dist/clients/secret-service.d.ts +87 -0
- package/dist/clients/secret-service.d.ts.map +1 -0
- package/dist/clients/secret-service.js +204 -0
- package/dist/clients/secret-service.js.map +1 -0
- package/dist/clients/service.d.ts +158 -0
- package/dist/clients/service.d.ts.map +1 -0
- package/dist/clients/service.js +523 -0
- package/dist/clients/service.js.map +1 -0
- package/dist/clients/types.d.ts +214 -0
- package/dist/clients/types.d.ts.map +1 -0
- package/dist/clients/types.js +77 -0
- package/dist/clients/types.js.map +1 -0
- package/dist/clients/validators.d.ts +87 -0
- package/dist/clients/validators.d.ts.map +1 -0
- package/dist/clients/validators.js +164 -0
- package/dist/clients/validators.js.map +1 -0
- package/dist/config/index.d.ts +23 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +52 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/schema.d.ts +35 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +167 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/custom-claims/cache.d.ts +48 -0
- package/dist/custom-claims/cache.d.ts.map +1 -0
- package/dist/custom-claims/cache.js +122 -0
- package/dist/custom-claims/cache.js.map +1 -0
- package/dist/custom-claims/errors.d.ts +25 -0
- package/dist/custom-claims/errors.d.ts.map +1 -0
- package/dist/custom-claims/errors.js +31 -0
- package/dist/custom-claims/errors.js.map +1 -0
- package/dist/custom-claims/index.d.ts +14 -0
- package/dist/custom-claims/index.d.ts.map +1 -0
- package/dist/custom-claims/index.js +17 -0
- package/dist/custom-claims/index.js.map +1 -0
- package/dist/custom-claims/repository.d.ts +147 -0
- package/dist/custom-claims/repository.d.ts.map +1 -0
- package/dist/custom-claims/repository.js +338 -0
- package/dist/custom-claims/repository.js.map +1 -0
- package/dist/custom-claims/service.d.ts +129 -0
- package/dist/custom-claims/service.d.ts.map +1 -0
- package/dist/custom-claims/service.js +296 -0
- package/dist/custom-claims/service.js.map +1 -0
- package/dist/custom-claims/types.d.ts +132 -0
- package/dist/custom-claims/types.d.ts.map +1 -0
- package/dist/custom-claims/types.js +61 -0
- package/dist/custom-claims/types.js.map +1 -0
- package/dist/custom-claims/validators.d.ts +61 -0
- package/dist/custom-claims/validators.d.ts.map +1 -0
- package/dist/custom-claims/validators.js +136 -0
- package/dist/custom-claims/validators.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/admin-permissions.d.ts +147 -0
- package/dist/lib/admin-permissions.d.ts.map +1 -0
- package/dist/lib/admin-permissions.js +261 -0
- package/dist/lib/admin-permissions.js.map +1 -0
- package/dist/lib/audit-log.d.ts +45 -0
- package/dist/lib/audit-log.d.ts.map +1 -0
- package/dist/lib/audit-log.js +79 -0
- package/dist/lib/audit-log.js.map +1 -0
- package/dist/lib/branding-assets.d.ts +47 -0
- package/dist/lib/branding-assets.d.ts.map +1 -0
- package/dist/lib/branding-assets.js +93 -0
- package/dist/lib/branding-assets.js.map +1 -0
- package/dist/lib/bulk-operations.d.ts +54 -0
- package/dist/lib/bulk-operations.d.ts.map +1 -0
- package/dist/lib/bulk-operations.js +201 -0
- package/dist/lib/bulk-operations.js.map +1 -0
- package/dist/lib/cursor.d.ts +110 -0
- package/dist/lib/cursor.d.ts.map +1 -0
- package/dist/lib/cursor.js +115 -0
- package/dist/lib/cursor.js.map +1 -0
- package/dist/lib/data-export.d.ts +67 -0
- package/dist/lib/data-export.d.ts.map +1 -0
- package/dist/lib/data-export.js +272 -0
- package/dist/lib/data-export.js.map +1 -0
- package/dist/lib/data-import-plan.d.ts +50 -0
- package/dist/lib/data-import-plan.d.ts.map +1 -0
- package/dist/lib/data-import-plan.js +235 -0
- package/dist/lib/data-import-plan.js.map +1 -0
- package/dist/lib/data-import.d.ts +276 -0
- package/dist/lib/data-import.d.ts.map +1 -0
- package/dist/lib/data-import.js +1694 -0
- package/dist/lib/data-import.js.map +1 -0
- package/dist/lib/database.d.ts +22 -0
- package/dist/lib/database.d.ts.map +1 -0
- package/dist/lib/database.js +103 -0
- package/dist/lib/database.js.map +1 -0
- package/dist/lib/entity-history.d.ts +52 -0
- package/dist/lib/entity-history.d.ts.map +1 -0
- package/dist/lib/entity-history.js +121 -0
- package/dist/lib/entity-history.js.map +1 -0
- package/dist/lib/etag.d.ts +92 -0
- package/dist/lib/etag.d.ts.map +1 -0
- package/dist/lib/etag.js +155 -0
- package/dist/lib/etag.js.map +1 -0
- package/dist/lib/image-validator.d.ts +44 -0
- package/dist/lib/image-validator.d.ts.map +1 -0
- package/dist/lib/image-validator.js +204 -0
- package/dist/lib/image-validator.js.map +1 -0
- package/dist/lib/logger.d.ts +15 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +84 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/migrator.d.ts +14 -0
- package/dist/lib/migrator.d.ts.map +1 -0
- package/dist/lib/migrator.js +34 -0
- package/dist/lib/migrator.js.map +1 -0
- package/dist/lib/redis.d.ts +5 -0
- package/dist/lib/redis.d.ts.map +1 -0
- package/dist/lib/redis.js +29 -0
- package/dist/lib/redis.js.map +1 -0
- package/dist/lib/runtime-paths.d.ts +38 -0
- package/dist/lib/runtime-paths.d.ts.map +1 -0
- package/dist/lib/runtime-paths.js +50 -0
- package/dist/lib/runtime-paths.js.map +1 -0
- package/dist/lib/session-tracking.d.ts +81 -0
- package/dist/lib/session-tracking.d.ts.map +1 -0
- package/dist/lib/session-tracking.js +145 -0
- package/dist/lib/session-tracking.js.map +1 -0
- package/dist/lib/signing-key-crypto.d.ts +53 -0
- package/dist/lib/signing-key-crypto.d.ts.map +1 -0
- package/dist/lib/signing-key-crypto.js +108 -0
- package/dist/lib/signing-key-crypto.js.map +1 -0
- package/dist/lib/signing-keys.d.ts +141 -0
- package/dist/lib/signing-keys.d.ts.map +1 -0
- package/dist/lib/signing-keys.js +206 -0
- package/dist/lib/signing-keys.js.map +1 -0
- package/dist/lib/stats.d.ts +83 -0
- package/dist/lib/stats.d.ts.map +1 -0
- package/dist/lib/stats.js +187 -0
- package/dist/lib/stats.js.map +1 -0
- package/dist/lib/super-admin-protection.d.ts +69 -0
- package/dist/lib/super-admin-protection.d.ts.map +1 -0
- package/dist/lib/super-admin-protection.js +102 -0
- package/dist/lib/super-admin-protection.js.map +1 -0
- package/dist/lib/system-config.d.ts +79 -0
- package/dist/lib/system-config.d.ts.map +1 -0
- package/dist/lib/system-config.js +159 -0
- package/dist/lib/system-config.js.map +1 -0
- package/dist/middleware/admin-auth.d.ts +100 -0
- package/dist/middleware/admin-auth.d.ts.map +1 -0
- package/dist/middleware/admin-auth.js +241 -0
- package/dist/middleware/admin-auth.js.map +1 -0
- package/dist/middleware/admin-cors.d.ts +41 -0
- package/dist/middleware/admin-cors.d.ts.map +1 -0
- package/dist/middleware/admin-cors.js +83 -0
- package/dist/middleware/admin-cors.js.map +1 -0
- package/dist/middleware/admin-mutation-audit.d.ts +9 -0
- package/dist/middleware/admin-mutation-audit.d.ts.map +1 -0
- package/dist/middleware/admin-mutation-audit.js +76 -0
- package/dist/middleware/admin-mutation-audit.js.map +1 -0
- package/dist/middleware/admin-rate-limiter.d.ts +56 -0
- package/dist/middleware/admin-rate-limiter.d.ts.map +1 -0
- package/dist/middleware/admin-rate-limiter.js +97 -0
- package/dist/middleware/admin-rate-limiter.js.map +1 -0
- package/dist/middleware/client-secret-hash.d.ts +34 -0
- package/dist/middleware/client-secret-hash.d.ts.map +1 -0
- package/dist/middleware/client-secret-hash.js +74 -0
- package/dist/middleware/client-secret-hash.js.map +1 -0
- package/dist/middleware/error-handler.d.ts +3 -0
- package/dist/middleware/error-handler.d.ts.map +1 -0
- package/dist/middleware/error-handler.js +93 -0
- package/dist/middleware/error-handler.js.map +1 -0
- package/dist/middleware/health.d.ts +3 -0
- package/dist/middleware/health.d.ts.map +1 -0
- package/dist/middleware/health.js +35 -0
- package/dist/middleware/health.js.map +1 -0
- package/dist/middleware/metrics.d.ts +40 -0
- package/dist/middleware/metrics.d.ts.map +1 -0
- package/dist/middleware/metrics.js +75 -0
- package/dist/middleware/metrics.js.map +1 -0
- package/dist/middleware/oidc-client-tenant.d.ts +37 -0
- package/dist/middleware/oidc-client-tenant.d.ts.map +1 -0
- package/dist/middleware/oidc-client-tenant.js +156 -0
- package/dist/middleware/oidc-client-tenant.js.map +1 -0
- package/dist/middleware/oidc-cors.d.ts +33 -0
- package/dist/middleware/oidc-cors.d.ts.map +1 -0
- package/dist/middleware/oidc-cors.js +68 -0
- package/dist/middleware/oidc-cors.js.map +1 -0
- package/dist/middleware/oidc-preflight-cors.d.ts +54 -0
- package/dist/middleware/oidc-preflight-cors.d.ts.map +1 -0
- package/dist/middleware/oidc-preflight-cors.js +267 -0
- package/dist/middleware/oidc-preflight-cors.js.map +1 -0
- package/dist/middleware/prompt-login-reset.d.ts +103 -0
- package/dist/middleware/prompt-login-reset.d.ts.map +1 -0
- package/dist/middleware/prompt-login-reset.js +204 -0
- package/dist/middleware/prompt-login-reset.js.map +1 -0
- package/dist/middleware/ready.d.ts +23 -0
- package/dist/middleware/ready.d.ts.map +1 -0
- package/dist/middleware/ready.js +60 -0
- package/dist/middleware/ready.js.map +1 -0
- package/dist/middleware/request-logger.d.ts +27 -0
- package/dist/middleware/request-logger.d.ts.map +1 -0
- package/dist/middleware/request-logger.js +46 -0
- package/dist/middleware/request-logger.js.map +1 -0
- package/dist/middleware/require-permission.d.ts +28 -0
- package/dist/middleware/require-permission.d.ts.map +1 -0
- package/dist/middleware/require-permission.js +63 -0
- package/dist/middleware/require-permission.js.map +1 -0
- package/dist/middleware/require-user-organization.d.ts +18 -0
- package/dist/middleware/require-user-organization.d.ts.map +1 -0
- package/dist/middleware/require-user-organization.js +53 -0
- package/dist/middleware/require-user-organization.js.map +1 -0
- package/dist/middleware/root-page.d.ts +62 -0
- package/dist/middleware/root-page.d.ts.map +1 -0
- package/dist/middleware/root-page.js +134 -0
- package/dist/middleware/root-page.js.map +1 -0
- package/dist/middleware/security-headers.d.ts +98 -0
- package/dist/middleware/security-headers.d.ts.map +1 -0
- package/dist/middleware/security-headers.js +159 -0
- package/dist/middleware/security-headers.js.map +1 -0
- package/dist/middleware/tenant-resolver.d.ts +37 -0
- package/dist/middleware/tenant-resolver.d.ts.map +1 -0
- package/dist/middleware/tenant-resolver.js +71 -0
- package/dist/middleware/tenant-resolver.js.map +1 -0
- package/dist/middleware/token-rate-limiter.d.ts +89 -0
- package/dist/middleware/token-rate-limiter.d.ts.map +1 -0
- package/dist/middleware/token-rate-limiter.js +189 -0
- package/dist/middleware/token-rate-limiter.js.map +1 -0
- package/dist/oidc/account-finder.d.ts +52 -0
- package/dist/oidc/account-finder.d.ts.map +1 -0
- package/dist/oidc/account-finder.js +134 -0
- package/dist/oidc/account-finder.js.map +1 -0
- package/dist/oidc/adapter-factory.d.ts +90 -0
- package/dist/oidc/adapter-factory.d.ts.map +1 -0
- package/dist/oidc/adapter-factory.js +165 -0
- package/dist/oidc/adapter-factory.js.map +1 -0
- package/dist/oidc/configuration.d.ts +155 -0
- package/dist/oidc/configuration.d.ts.map +1 -0
- package/dist/oidc/configuration.js +531 -0
- package/dist/oidc/configuration.js.map +1 -0
- package/dist/oidc/postgres-adapter.d.ts +159 -0
- package/dist/oidc/postgres-adapter.d.ts.map +1 -0
- package/dist/oidc/postgres-adapter.js +222 -0
- package/dist/oidc/postgres-adapter.js.map +1 -0
- package/dist/oidc/protocol-security-observer.d.ts +38 -0
- package/dist/oidc/protocol-security-observer.d.ts.map +1 -0
- package/dist/oidc/protocol-security-observer.js +93 -0
- package/dist/oidc/protocol-security-observer.js.map +1 -0
- package/dist/oidc/provider.d.ts +37 -0
- package/dist/oidc/provider.d.ts.map +1 -0
- package/dist/oidc/provider.js +71 -0
- package/dist/oidc/provider.js.map +1 -0
- package/dist/oidc/redis-adapter.d.ts +140 -0
- package/dist/oidc/redis-adapter.d.ts.map +1 -0
- package/dist/oidc/redis-adapter.js +344 -0
- package/dist/oidc/redis-adapter.js.map +1 -0
- package/dist/organizations/cache.d.ts +60 -0
- package/dist/organizations/cache.d.ts.map +1 -0
- package/dist/organizations/cache.js +157 -0
- package/dist/organizations/cache.js.map +1 -0
- package/dist/organizations/errors.d.ts +25 -0
- package/dist/organizations/errors.d.ts.map +1 -0
- package/dist/organizations/errors.js +31 -0
- package/dist/organizations/errors.js.map +1 -0
- package/dist/organizations/index.d.ts +15 -0
- package/dist/organizations/index.d.ts.map +1 -0
- package/dist/organizations/index.js +15 -0
- package/dist/organizations/index.js.map +1 -0
- package/dist/organizations/repository.d.ts +183 -0
- package/dist/organizations/repository.d.ts.map +1 -0
- package/dist/organizations/repository.js +354 -0
- package/dist/organizations/repository.js.map +1 -0
- package/dist/organizations/service.d.ts +168 -0
- package/dist/organizations/service.d.ts.map +1 -0
- package/dist/organizations/service.js +511 -0
- package/dist/organizations/service.js.map +1 -0
- package/dist/organizations/slugs.d.ts +57 -0
- package/dist/organizations/slugs.d.ts.map +1 -0
- package/dist/organizations/slugs.js +130 -0
- package/dist/organizations/slugs.js.map +1 -0
- package/dist/organizations/types.d.ts +146 -0
- package/dist/organizations/types.d.ts.map +1 -0
- package/dist/organizations/types.js +49 -0
- package/dist/organizations/types.js.map +1 -0
- package/dist/rbac/cache.d.ts +110 -0
- package/dist/rbac/cache.d.ts.map +1 -0
- package/dist/rbac/cache.js +271 -0
- package/dist/rbac/cache.js.map +1 -0
- package/dist/rbac/errors.d.ts +34 -0
- package/dist/rbac/errors.d.ts.map +1 -0
- package/dist/rbac/errors.js +43 -0
- package/dist/rbac/errors.js.map +1 -0
- package/dist/rbac/index.d.ts +17 -0
- package/dist/rbac/index.d.ts.map +1 -0
- package/dist/rbac/index.js +21 -0
- package/dist/rbac/index.js.map +1 -0
- package/dist/rbac/mapping-repository.d.ts +121 -0
- package/dist/rbac/mapping-repository.d.ts.map +1 -0
- package/dist/rbac/mapping-repository.js +224 -0
- package/dist/rbac/mapping-repository.js.map +1 -0
- package/dist/rbac/permission-repository.d.ts +100 -0
- package/dist/rbac/permission-repository.d.ts.map +1 -0
- package/dist/rbac/permission-repository.js +190 -0
- package/dist/rbac/permission-repository.js.map +1 -0
- package/dist/rbac/permission-service.d.ts +85 -0
- package/dist/rbac/permission-service.d.ts.map +1 -0
- package/dist/rbac/permission-service.js +179 -0
- package/dist/rbac/permission-service.js.map +1 -0
- package/dist/rbac/role-repository.d.ts +104 -0
- package/dist/rbac/role-repository.d.ts.map +1 -0
- package/dist/rbac/role-repository.js +202 -0
- package/dist/rbac/role-repository.js.map +1 -0
- package/dist/rbac/role-service.d.ts +111 -0
- package/dist/rbac/role-service.d.ts.map +1 -0
- package/dist/rbac/role-service.js +256 -0
- package/dist/rbac/role-service.js.map +1 -0
- package/dist/rbac/slugs.d.ts +116 -0
- package/dist/rbac/slugs.d.ts.map +1 -0
- package/dist/rbac/slugs.js +178 -0
- package/dist/rbac/slugs.js.map +1 -0
- package/dist/rbac/types.d.ts +187 -0
- package/dist/rbac/types.d.ts.map +1 -0
- package/dist/rbac/types.js +75 -0
- package/dist/rbac/types.js.map +1 -0
- package/dist/rbac/user-role-service.d.ts +101 -0
- package/dist/rbac/user-role-service.d.ts.map +1 -0
- package/dist/rbac/user-role-service.js +166 -0
- package/dist/rbac/user-role-service.js.map +1 -0
- package/dist/routes/applications.d.ts +40 -0
- package/dist/routes/applications.d.ts.map +1 -0
- package/dist/routes/applications.js +284 -0
- package/dist/routes/applications.js.map +1 -0
- package/dist/routes/audit.d.ts +31 -0
- package/dist/routes/audit.d.ts.map +1 -0
- package/dist/routes/audit.js +140 -0
- package/dist/routes/audit.js.map +1 -0
- package/dist/routes/branding.d.ts +17 -0
- package/dist/routes/branding.d.ts.map +1 -0
- package/dist/routes/branding.js +104 -0
- package/dist/routes/branding.js.map +1 -0
- package/dist/routes/bulk.d.ts +37 -0
- package/dist/routes/bulk.d.ts.map +1 -0
- package/dist/routes/bulk.js +94 -0
- package/dist/routes/bulk.js.map +1 -0
- package/dist/routes/clients.d.ts +44 -0
- package/dist/routes/clients.d.ts.map +1 -0
- package/dist/routes/clients.js +353 -0
- package/dist/routes/clients.js.map +1 -0
- package/dist/routes/config.d.ts +35 -0
- package/dist/routes/config.d.ts.map +1 -0
- package/dist/routes/config.js +115 -0
- package/dist/routes/config.js.map +1 -0
- package/dist/routes/custom-claims.d.ts +38 -0
- package/dist/routes/custom-claims.d.ts.map +1 -0
- package/dist/routes/custom-claims.js +208 -0
- package/dist/routes/custom-claims.js.map +1 -0
- package/dist/routes/exports.d.ts +21 -0
- package/dist/routes/exports.d.ts.map +1 -0
- package/dist/routes/exports.js +98 -0
- package/dist/routes/exports.js.map +1 -0
- package/dist/routes/imports.d.ts +18 -0
- package/dist/routes/imports.d.ts.map +1 -0
- package/dist/routes/imports.js +72 -0
- package/dist/routes/imports.js.map +1 -0
- package/dist/routes/interactions.d.ts +111 -0
- package/dist/routes/interactions.d.ts.map +1 -0
- package/dist/routes/interactions.js +1074 -0
- package/dist/routes/interactions.js.map +1 -0
- package/dist/routes/invitation.d.ts +31 -0
- package/dist/routes/invitation.d.ts.map +1 -0
- package/dist/routes/invitation.js +342 -0
- package/dist/routes/invitation.js.map +1 -0
- package/dist/routes/keys.d.ts +28 -0
- package/dist/routes/keys.d.ts.map +1 -0
- package/dist/routes/keys.js +91 -0
- package/dist/routes/keys.js.map +1 -0
- package/dist/routes/magic-link.d.ts +43 -0
- package/dist/routes/magic-link.d.ts.map +1 -0
- package/dist/routes/magic-link.js +264 -0
- package/dist/routes/magic-link.js.map +1 -0
- package/dist/routes/organizations.d.ts +38 -0
- package/dist/routes/organizations.d.ts.map +1 -0
- package/dist/routes/organizations.js +347 -0
- package/dist/routes/organizations.js.map +1 -0
- package/dist/routes/password-reset.d.ts +65 -0
- package/dist/routes/password-reset.d.ts.map +1 -0
- package/dist/routes/password-reset.js +493 -0
- package/dist/routes/password-reset.js.map +1 -0
- package/dist/routes/permissions.d.ts +33 -0
- package/dist/routes/permissions.d.ts.map +1 -0
- package/dist/routes/permissions.js +166 -0
- package/dist/routes/permissions.js.map +1 -0
- package/dist/routes/roles.d.ts +37 -0
- package/dist/routes/roles.d.ts.map +1 -0
- package/dist/routes/roles.js +222 -0
- package/dist/routes/roles.js.map +1 -0
- package/dist/routes/sessions.d.ts +37 -0
- package/dist/routes/sessions.d.ts.map +1 -0
- package/dist/routes/sessions.js +121 -0
- package/dist/routes/sessions.js.map +1 -0
- package/dist/routes/stats.d.ts +28 -0
- package/dist/routes/stats.d.ts.map +1 -0
- package/dist/routes/stats.js +65 -0
- package/dist/routes/stats.js.map +1 -0
- package/dist/routes/two-factor-admin.d.ts +54 -0
- package/dist/routes/two-factor-admin.d.ts.map +1 -0
- package/dist/routes/two-factor-admin.js +344 -0
- package/dist/routes/two-factor-admin.js.map +1 -0
- package/dist/routes/two-factor.d.ts +31 -0
- package/dist/routes/two-factor.d.ts.map +1 -0
- package/dist/routes/two-factor.js +595 -0
- package/dist/routes/two-factor.js.map +1 -0
- package/dist/routes/user-roles.d.ts +33 -0
- package/dist/routes/user-roles.d.ts.map +1 -0
- package/dist/routes/user-roles.js +129 -0
- package/dist/routes/user-roles.js.map +1 -0
- package/dist/routes/users.d.ts +61 -0
- package/dist/routes/users.d.ts.map +1 -0
- package/dist/routes/users.js +868 -0
- package/dist/routes/users.js.map +1 -0
- package/dist/security/decision-context.d.ts +52 -0
- package/dist/security/decision-context.d.ts.map +1 -0
- package/dist/security/decision-context.js +150 -0
- package/dist/security/decision-context.js.map +1 -0
- package/dist/security/decision-event.d.ts +128 -0
- package/dist/security/decision-event.d.ts.map +1 -0
- package/dist/security/decision-event.js +225 -0
- package/dist/security/decision-event.js.map +1 -0
- package/dist/security/transport-decision.d.ts +6 -0
- package/dist/security/transport-decision.d.ts.map +1 -0
- package/dist/security/transport-decision.js +37 -0
- package/dist/security/transport-decision.js.map +1 -0
- package/dist/server.d.ts +50 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +491 -0
- package/dist/server.js.map +1 -0
- package/dist/two-factor/cache.d.ts +47 -0
- package/dist/two-factor/cache.d.ts.map +1 -0
- package/dist/two-factor/cache.js +122 -0
- package/dist/two-factor/cache.js.map +1 -0
- package/dist/two-factor/crypto.d.ts +41 -0
- package/dist/two-factor/crypto.d.ts.map +1 -0
- package/dist/two-factor/crypto.js +94 -0
- package/dist/two-factor/crypto.js.map +1 -0
- package/dist/two-factor/errors.d.ts +82 -0
- package/dist/two-factor/errors.d.ts.map +1 -0
- package/dist/two-factor/errors.js +112 -0
- package/dist/two-factor/errors.js.map +1 -0
- package/dist/two-factor/index.d.ts +18 -0
- package/dist/two-factor/index.d.ts.map +1 -0
- package/dist/two-factor/index.js +25 -0
- package/dist/two-factor/index.js.map +1 -0
- package/dist/two-factor/otp.d.ts +43 -0
- package/dist/two-factor/otp.d.ts.map +1 -0
- package/dist/two-factor/otp.js +57 -0
- package/dist/two-factor/otp.js.map +1 -0
- package/dist/two-factor/recovery.d.ts +45 -0
- package/dist/two-factor/recovery.d.ts.map +1 -0
- package/dist/two-factor/recovery.js +104 -0
- package/dist/two-factor/recovery.js.map +1 -0
- package/dist/two-factor/repository.d.ts +156 -0
- package/dist/two-factor/repository.d.ts.map +1 -0
- package/dist/two-factor/repository.js +251 -0
- package/dist/two-factor/repository.js.map +1 -0
- package/dist/two-factor/service.d.ts +232 -0
- package/dist/two-factor/service.d.ts.map +1 -0
- package/dist/two-factor/service.js +599 -0
- package/dist/two-factor/service.js.map +1 -0
- package/dist/two-factor/totp.d.ts +57 -0
- package/dist/two-factor/totp.d.ts.map +1 -0
- package/dist/two-factor/totp.js +96 -0
- package/dist/two-factor/totp.js.map +1 -0
- package/dist/two-factor/types.d.ts +152 -0
- package/dist/two-factor/types.d.ts.map +1 -0
- package/dist/two-factor/types.js +64 -0
- package/dist/two-factor/types.js.map +1 -0
- package/dist/users/cache.d.ts +49 -0
- package/dist/users/cache.d.ts.map +1 -0
- package/dist/users/cache.js +140 -0
- package/dist/users/cache.js.map +1 -0
- package/dist/users/claims.d.ts +67 -0
- package/dist/users/claims.d.ts.map +1 -0
- package/dist/users/claims.js +104 -0
- package/dist/users/claims.js.map +1 -0
- package/dist/users/errors.d.ts +25 -0
- package/dist/users/errors.d.ts.map +1 -0
- package/dist/users/errors.js +31 -0
- package/dist/users/errors.js.map +1 -0
- package/dist/users/gdpr.d.ts +110 -0
- package/dist/users/gdpr.d.ts.map +1 -0
- package/dist/users/gdpr.js +211 -0
- package/dist/users/gdpr.js.map +1 -0
- package/dist/users/index.d.ts +20 -0
- package/dist/users/index.d.ts.map +1 -0
- package/dist/users/index.js +19 -0
- package/dist/users/index.js.map +1 -0
- package/dist/users/password.d.ts +85 -0
- package/dist/users/password.d.ts.map +1 -0
- package/dist/users/password.js +138 -0
- package/dist/users/password.js.map +1 -0
- package/dist/users/repository.d.ts +263 -0
- package/dist/users/repository.d.ts.map +1 -0
- package/dist/users/repository.js +499 -0
- package/dist/users/repository.js.map +1 -0
- package/dist/users/service.d.ts +299 -0
- package/dist/users/service.d.ts.map +1 -0
- package/dist/users/service.js +698 -0
- package/dist/users/service.js.map +1 -0
- package/dist/users/types.d.ts +220 -0
- package/dist/users/types.d.ts.map +1 -0
- package/dist/users/types.js +77 -0
- package/dist/users/types.js.map +1 -0
- package/locales/default/en/common.json +10 -0
- package/locales/default/en/consent.json +13 -0
- package/locales/default/en/emails.json +17 -0
- package/locales/default/en/errors.json +21 -0
- package/locales/default/en/forgot-password.json +11 -0
- package/locales/default/en/invitation.json +18 -0
- package/locales/default/en/login.json +17 -0
- package/locales/default/en/logout.json +9 -0
- package/locales/default/en/magic-link.json +12 -0
- package/locales/default/en/reset-password.json +16 -0
- package/locales/default/en/two-factor.json +29 -0
- package/migrations/.gitkeep +0 -0
- package/migrations/001_extensions.sql +22 -0
- package/migrations/002_organizations.sql +43 -0
- package/migrations/003_applications.sql +50 -0
- package/migrations/004_clients.sql +74 -0
- package/migrations/005_users.sql +119 -0
- package/migrations/006_roles_permissions.sql +80 -0
- package/migrations/007_custom_claims.sql +55 -0
- package/migrations/008_config.sql +51 -0
- package/migrations/009_audit_log.sql +31 -0
- package/migrations/010_oidc_adapter.sql +34 -0
- package/migrations/011_seed.sql +53 -0
- package/migrations/012_two_factor.sql +88 -0
- package/migrations/013_client_secret_sha256.sql +22 -0
- package/migrations/014_login_methods.sql +34 -0
- package/migrations/015_signing_key_encryption.sql +20 -0
- package/migrations/016_failed_login_count.sql +27 -0
- package/migrations/017_audit_retention.sql +11 -0
- package/migrations/018_admin_api_enhancements.sql +78 -0
- package/migrations/019_invitation_details.sql +27 -0
- package/migrations/020_two_factor_admin_permission.sql +108 -0
- package/migrations/021_auth_recovery_jobs.sql +74 -0
- package/migrations/022_recovery_artifact_ownership.sql +25 -0
- package/migrations/023_magic_link_authority.sql +39 -0
- package/package.json +106 -0
- package/templates/default/emails/invitation.hbs +39 -0
- package/templates/default/emails/invitation.txt.hbs +18 -0
- package/templates/default/emails/magic-link.hbs +30 -0
- package/templates/default/emails/magic-link.txt.hbs +11 -0
- package/templates/default/emails/otp-code.hbs +31 -0
- package/templates/default/emails/otp-code.txt.hbs +15 -0
- package/templates/default/emails/password-changed.hbs +24 -0
- package/templates/default/emails/password-changed.txt.hbs +7 -0
- package/templates/default/emails/password-reset.hbs +30 -0
- package/templates/default/emails/password-reset.txt.hbs +11 -0
- package/templates/default/emails/welcome.hbs +25 -0
- package/templates/default/emails/welcome.txt.hbs +9 -0
- package/templates/default/layouts/main.hbs +49 -0
- package/templates/default/pages/accept-invite.hbs +25 -0
- package/templates/default/pages/consent.hbs +27 -0
- package/templates/default/pages/error.hbs +15 -0
- package/templates/default/pages/forgot-password.hbs +21 -0
- package/templates/default/pages/invite-expired.hbs +6 -0
- package/templates/default/pages/invite-success.hbs +9 -0
- package/templates/default/pages/login.hbs +108 -0
- package/templates/default/pages/logout-success.hbs +5 -0
- package/templates/default/pages/logout.hbs +24 -0
- package/templates/default/pages/magic-link-sent.hbs +10 -0
- package/templates/default/pages/magic-link-success.hbs +17 -0
- package/templates/default/pages/reset-password.hbs +20 -0
- package/templates/default/pages/reset-success.hbs +9 -0
- package/templates/default/pages/two-factor-setup.hbs +65 -0
- package/templates/default/pages/two-factor-verify.hbs +77 -0
- package/templates/default/partials/flash-messages.hbs +10 -0
- package/templates/default/partials/footer.hbs +4 -0
- package/templates/default/partials/header.hbs +8 -0
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RBAC types and interfaces.
|
|
3
|
+
*
|
|
4
|
+
* Defines the data structures for roles, permissions, and user-role
|
|
5
|
+
* assignments. Includes full database record interfaces, input types
|
|
6
|
+
* for create/update, pagination helpers, and mapping functions to
|
|
7
|
+
* convert snake_case database rows to camelCase TypeScript objects.
|
|
8
|
+
*
|
|
9
|
+
* These types are the foundation that all other RBAC modules depend
|
|
10
|
+
* on (repository, cache, service, routes).
|
|
11
|
+
*
|
|
12
|
+
* Database tables: roles, permissions, role_permissions, user_roles
|
|
13
|
+
* (see migrations 006_roles_permissions.sql)
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Full role record as stored in the database.
|
|
17
|
+
* Maps to the `roles` table columns (see migration 006).
|
|
18
|
+
* Roles are defined globally per application — assigned to users via user_roles.
|
|
19
|
+
*/
|
|
20
|
+
export interface Role {
|
|
21
|
+
id: string;
|
|
22
|
+
applicationId: string;
|
|
23
|
+
name: string;
|
|
24
|
+
slug: string;
|
|
25
|
+
description: string | null;
|
|
26
|
+
createdAt: Date;
|
|
27
|
+
updatedAt: Date;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Raw database row from the roles table (snake_case columns).
|
|
31
|
+
* Used by the repository layer; mapped to Role via mapRowToRole().
|
|
32
|
+
*/
|
|
33
|
+
export interface RoleRow {
|
|
34
|
+
id: string;
|
|
35
|
+
application_id: string;
|
|
36
|
+
name: string;
|
|
37
|
+
slug: string;
|
|
38
|
+
description: string | null;
|
|
39
|
+
created_at: Date;
|
|
40
|
+
updated_at: Date;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Input for creating a new role.
|
|
44
|
+
* Slug is auto-generated from name if not provided.
|
|
45
|
+
*/
|
|
46
|
+
export interface CreateRoleInput {
|
|
47
|
+
applicationId: string;
|
|
48
|
+
name: string;
|
|
49
|
+
slug?: string;
|
|
50
|
+
description?: string;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Input for updating an existing role (partial).
|
|
54
|
+
* Only provided fields are updated.
|
|
55
|
+
*/
|
|
56
|
+
export interface UpdateRoleInput {
|
|
57
|
+
name?: string;
|
|
58
|
+
slug?: string;
|
|
59
|
+
description?: string | null;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Full permission record as stored in the database.
|
|
63
|
+
* Maps to the `permissions` table columns (see migration 006).
|
|
64
|
+
* Permissions are defined globally per application, optionally scoped
|
|
65
|
+
* to a module. The slug follows the module:resource:action format
|
|
66
|
+
* (e.g., "crm:contacts:read").
|
|
67
|
+
*/
|
|
68
|
+
export interface Permission {
|
|
69
|
+
id: string;
|
|
70
|
+
applicationId: string;
|
|
71
|
+
moduleId: string | null;
|
|
72
|
+
name: string;
|
|
73
|
+
slug: string;
|
|
74
|
+
description: string | null;
|
|
75
|
+
createdAt: Date;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Raw database row from the permissions table (snake_case columns).
|
|
79
|
+
* Used by the repository layer; mapped to Permission via mapRowToPermission().
|
|
80
|
+
*/
|
|
81
|
+
export interface PermissionRow {
|
|
82
|
+
id: string;
|
|
83
|
+
application_id: string;
|
|
84
|
+
module_id: string | null;
|
|
85
|
+
name: string;
|
|
86
|
+
slug: string;
|
|
87
|
+
description: string | null;
|
|
88
|
+
created_at: Date;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Input for creating a new permission.
|
|
92
|
+
* The slug must follow the module:resource:action format and is
|
|
93
|
+
* validated by the service layer before insert.
|
|
94
|
+
*/
|
|
95
|
+
export interface CreatePermissionInput {
|
|
96
|
+
applicationId: string;
|
|
97
|
+
moduleId?: string;
|
|
98
|
+
name: string;
|
|
99
|
+
slug: string;
|
|
100
|
+
description?: string;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Input for updating an existing permission (partial).
|
|
104
|
+
* Note: slug is NOT updatable — it is the permission's identity.
|
|
105
|
+
*/
|
|
106
|
+
export interface UpdatePermissionInput {
|
|
107
|
+
name?: string;
|
|
108
|
+
description?: string | null;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* User-role assignment record.
|
|
112
|
+
* Maps to the `user_roles` join table (see migration 006).
|
|
113
|
+
* Tracks which user has which role, and who assigned it.
|
|
114
|
+
*/
|
|
115
|
+
export interface UserRole {
|
|
116
|
+
userId: string;
|
|
117
|
+
roleId: string;
|
|
118
|
+
assignedBy: string | null;
|
|
119
|
+
createdAt: Date;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Raw database row from the user_roles table (snake_case columns).
|
|
123
|
+
* Used by the repository layer; mapped to UserRole via mapRowToUserRole().
|
|
124
|
+
*/
|
|
125
|
+
export interface UserRoleRow {
|
|
126
|
+
user_id: string;
|
|
127
|
+
role_id: string;
|
|
128
|
+
assigned_by: string | null;
|
|
129
|
+
created_at: Date;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Role with its assigned permissions — result of a joined query.
|
|
133
|
+
* Used when fetching a role with all its permission details.
|
|
134
|
+
*/
|
|
135
|
+
export interface RoleWithPermissions extends Role {
|
|
136
|
+
permissions: Permission[];
|
|
137
|
+
}
|
|
138
|
+
/** Options for listing roles (paginated). */
|
|
139
|
+
export interface ListRolesOptions {
|
|
140
|
+
applicationId: string;
|
|
141
|
+
page: number;
|
|
142
|
+
pageSize: number;
|
|
143
|
+
search?: string;
|
|
144
|
+
sortBy?: 'name' | 'created_at';
|
|
145
|
+
sortOrder?: 'asc' | 'desc';
|
|
146
|
+
}
|
|
147
|
+
/** Options for listing permissions (paginated). */
|
|
148
|
+
export interface ListPermissionsOptions {
|
|
149
|
+
applicationId: string;
|
|
150
|
+
page: number;
|
|
151
|
+
pageSize: number;
|
|
152
|
+
moduleId?: string;
|
|
153
|
+
search?: string;
|
|
154
|
+
sortBy?: 'name' | 'created_at';
|
|
155
|
+
sortOrder?: 'asc' | 'desc';
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Map a database row to a Role object.
|
|
159
|
+
*
|
|
160
|
+
* Converts snake_case column names from PostgreSQL to camelCase
|
|
161
|
+
* TypeScript properties.
|
|
162
|
+
*
|
|
163
|
+
* @param row - Raw database row from the roles table
|
|
164
|
+
* @returns Mapped Role object with camelCase properties
|
|
165
|
+
*/
|
|
166
|
+
export declare function mapRowToRole(row: RoleRow): Role;
|
|
167
|
+
/**
|
|
168
|
+
* Map a database row to a Permission object.
|
|
169
|
+
*
|
|
170
|
+
* Converts snake_case column names from PostgreSQL to camelCase
|
|
171
|
+
* TypeScript properties.
|
|
172
|
+
*
|
|
173
|
+
* @param row - Raw database row from the permissions table
|
|
174
|
+
* @returns Mapped Permission object with camelCase properties
|
|
175
|
+
*/
|
|
176
|
+
export declare function mapRowToPermission(row: PermissionRow): Permission;
|
|
177
|
+
/**
|
|
178
|
+
* Map a database row to a UserRole object.
|
|
179
|
+
*
|
|
180
|
+
* Converts snake_case column names from PostgreSQL to camelCase
|
|
181
|
+
* TypeScript properties.
|
|
182
|
+
*
|
|
183
|
+
* @param row - Raw database row from the user_roles table
|
|
184
|
+
* @returns Mapped UserRole object with camelCase properties
|
|
185
|
+
*/
|
|
186
|
+
export declare function mapRowToUserRole(row: UserRoleRow): UserRole;
|
|
187
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/rbac/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RBAC types and interfaces.
|
|
3
|
+
*
|
|
4
|
+
* Defines the data structures for roles, permissions, and user-role
|
|
5
|
+
* assignments. Includes full database record interfaces, input types
|
|
6
|
+
* for create/update, pagination helpers, and mapping functions to
|
|
7
|
+
* convert snake_case database rows to camelCase TypeScript objects.
|
|
8
|
+
*
|
|
9
|
+
* These types are the foundation that all other RBAC modules depend
|
|
10
|
+
* on (repository, cache, service, routes).
|
|
11
|
+
*
|
|
12
|
+
* Database tables: roles, permissions, role_permissions, user_roles
|
|
13
|
+
* (see migrations 006_roles_permissions.sql)
|
|
14
|
+
*/
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Database row mapping functions
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
/**
|
|
19
|
+
* Map a database row to a Role object.
|
|
20
|
+
*
|
|
21
|
+
* Converts snake_case column names from PostgreSQL to camelCase
|
|
22
|
+
* TypeScript properties.
|
|
23
|
+
*
|
|
24
|
+
* @param row - Raw database row from the roles table
|
|
25
|
+
* @returns Mapped Role object with camelCase properties
|
|
26
|
+
*/
|
|
27
|
+
export function mapRowToRole(row) {
|
|
28
|
+
return {
|
|
29
|
+
id: row.id,
|
|
30
|
+
applicationId: row.application_id,
|
|
31
|
+
name: row.name,
|
|
32
|
+
slug: row.slug,
|
|
33
|
+
description: row.description,
|
|
34
|
+
createdAt: row.created_at,
|
|
35
|
+
updatedAt: row.updated_at,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Map a database row to a Permission object.
|
|
40
|
+
*
|
|
41
|
+
* Converts snake_case column names from PostgreSQL to camelCase
|
|
42
|
+
* TypeScript properties.
|
|
43
|
+
*
|
|
44
|
+
* @param row - Raw database row from the permissions table
|
|
45
|
+
* @returns Mapped Permission object with camelCase properties
|
|
46
|
+
*/
|
|
47
|
+
export function mapRowToPermission(row) {
|
|
48
|
+
return {
|
|
49
|
+
id: row.id,
|
|
50
|
+
applicationId: row.application_id,
|
|
51
|
+
moduleId: row.module_id,
|
|
52
|
+
name: row.name,
|
|
53
|
+
slug: row.slug,
|
|
54
|
+
description: row.description,
|
|
55
|
+
createdAt: row.created_at,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Map a database row to a UserRole object.
|
|
60
|
+
*
|
|
61
|
+
* Converts snake_case column names from PostgreSQL to camelCase
|
|
62
|
+
* TypeScript properties.
|
|
63
|
+
*
|
|
64
|
+
* @param row - Raw database row from the user_roles table
|
|
65
|
+
* @returns Mapped UserRole object with camelCase properties
|
|
66
|
+
*/
|
|
67
|
+
export function mapRowToUserRole(row) {
|
|
68
|
+
return {
|
|
69
|
+
userId: row.user_id,
|
|
70
|
+
roleId: row.role_id,
|
|
71
|
+
assignedBy: row.assigned_by,
|
|
72
|
+
createdAt: row.created_at,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/rbac/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAiLH,8EAA8E;AAC9E,iCAAiC;AACjC,8EAA8E;AAE9E;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,aAAa,EAAE,GAAG,CAAC,cAAc;QACjC,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAkB;IACnD,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,aAAa,EAAE,GAAG,CAAC,cAAc;QACjC,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAgB;IAC/C,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,OAAO;QACnB,MAAM,EAAE,GAAG,CAAC,OAAO;QACnB,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* User-role service — user role assignment and claims building.
|
|
3
|
+
*
|
|
4
|
+
* Handles assigning/removing roles to/from users, retrieving user
|
|
5
|
+
* roles and permissions, and building the claims arrays that get
|
|
6
|
+
* injected into OIDC tokens.
|
|
7
|
+
*
|
|
8
|
+
* The claims-building functions (buildRoleClaims, buildPermissionClaims)
|
|
9
|
+
* are the token hot path — they use cache-first resolution to minimize
|
|
10
|
+
* database queries during token issuance.
|
|
11
|
+
*
|
|
12
|
+
* Cache strategy for claims:
|
|
13
|
+
* 1. Check Redis for cached slug arrays
|
|
14
|
+
* 2. On cache hit → return immediately (fast path)
|
|
15
|
+
* 3. On cache miss → query DB, cache result, return
|
|
16
|
+
*
|
|
17
|
+
* @see mapping-repository.ts — Database operations for user-role join table
|
|
18
|
+
* @see cache.ts — Redis cache for role/permission slug arrays
|
|
19
|
+
*/
|
|
20
|
+
import type { Role, Permission, UserRole } from './types.js';
|
|
21
|
+
/**
|
|
22
|
+
* Assign roles to a user (bulk).
|
|
23
|
+
*
|
|
24
|
+
* Uses ON CONFLICT DO NOTHING for idempotent assignment. Invalidates
|
|
25
|
+
* the user's RBAC cache since their effective permissions may change.
|
|
26
|
+
*
|
|
27
|
+
* @param userId - User UUID
|
|
28
|
+
* @param roleIds - Array of role UUIDs to assign
|
|
29
|
+
* @param assignedBy - Optional UUID of the admin performing the assignment
|
|
30
|
+
*/
|
|
31
|
+
export declare function assignRolesToUser(userId: string, roleIds: string[], assignedBy?: string): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Remove roles from a user (bulk).
|
|
34
|
+
*
|
|
35
|
+
* Invalidates the user's RBAC cache since their effective permissions
|
|
36
|
+
* may change.
|
|
37
|
+
*
|
|
38
|
+
* @param userId - User UUID
|
|
39
|
+
* @param roleIds - Array of role UUIDs to remove
|
|
40
|
+
* @param actorId - Optional UUID of the admin performing the action
|
|
41
|
+
*/
|
|
42
|
+
export declare function removeRolesFromUser(userId: string, roleIds: string[], actorId?: string): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Get all roles assigned to a user.
|
|
45
|
+
*
|
|
46
|
+
* @param userId - User UUID
|
|
47
|
+
* @returns Array of Role objects
|
|
48
|
+
*/
|
|
49
|
+
export declare function getUserRoles(userId: string): Promise<Role[]>;
|
|
50
|
+
/**
|
|
51
|
+
* Get all permissions for a user (resolved through roles).
|
|
52
|
+
*
|
|
53
|
+
* @param userId - User UUID
|
|
54
|
+
* @returns Deduplicated array of Permission objects
|
|
55
|
+
*/
|
|
56
|
+
export declare function getUserPermissions(userId: string): Promise<Permission[]>;
|
|
57
|
+
/**
|
|
58
|
+
* List users with a specific role within an organization.
|
|
59
|
+
*
|
|
60
|
+
* Supports pagination for admin UI views.
|
|
61
|
+
*
|
|
62
|
+
* @param roleId - Role UUID
|
|
63
|
+
* @param orgId - Organization UUID
|
|
64
|
+
* @param options - Pagination options
|
|
65
|
+
* @returns Paginated user-role assignments and total count
|
|
66
|
+
*/
|
|
67
|
+
export declare function getUsersWithRole(roleId: string, orgId: string, options?: {
|
|
68
|
+
page?: number;
|
|
69
|
+
pageSize?: number;
|
|
70
|
+
}): Promise<{
|
|
71
|
+
rows: UserRole[];
|
|
72
|
+
total: number;
|
|
73
|
+
}>;
|
|
74
|
+
/**
|
|
75
|
+
* Build role claims for a user's token.
|
|
76
|
+
*
|
|
77
|
+
* Returns an array of role slugs (e.g., ["crm-editor", "invoice-approver"])
|
|
78
|
+
* for inclusion in the token's custom claims.
|
|
79
|
+
*
|
|
80
|
+
* Cache-first: checks Redis for cached role slugs. On cache miss,
|
|
81
|
+
* resolves from DB and caches the result for future token issuances.
|
|
82
|
+
*
|
|
83
|
+
* @param userId - User UUID
|
|
84
|
+
* @returns Array of role slug strings
|
|
85
|
+
*/
|
|
86
|
+
export declare function buildRoleClaims(userId: string): Promise<string[]>;
|
|
87
|
+
/**
|
|
88
|
+
* Build permission claims for a user's token.
|
|
89
|
+
*
|
|
90
|
+
* Returns an array of permission slugs (e.g., ["crm:contacts:read",
|
|
91
|
+
* "crm:deals:write"]) for inclusion in the token's custom claims.
|
|
92
|
+
*
|
|
93
|
+
* Cache-first: checks Redis for cached permission slugs. On cache miss,
|
|
94
|
+
* resolves through the full user → roles → permissions chain from DB
|
|
95
|
+
* and caches the result.
|
|
96
|
+
*
|
|
97
|
+
* @param userId - User UUID
|
|
98
|
+
* @returns Array of permission slug strings
|
|
99
|
+
*/
|
|
100
|
+
export declare function buildPermissionClaims(userId: string): Promise<string[]>;
|
|
101
|
+
//# sourceMappingURL=user-role-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-role-service.d.ts","sourceRoot":"","sources":["../../src/rbac/user-role-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAiBH,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAM7D;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EAAE,EACjB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAgBf;AAMD;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAElE;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAE9E;AAED;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7C,OAAO,CAAC;IAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAK9C;AAMD;;;;;;;;;;;GAWG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAevE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAe7E"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* User-role service — user role assignment and claims building.
|
|
3
|
+
*
|
|
4
|
+
* Handles assigning/removing roles to/from users, retrieving user
|
|
5
|
+
* roles and permissions, and building the claims arrays that get
|
|
6
|
+
* injected into OIDC tokens.
|
|
7
|
+
*
|
|
8
|
+
* The claims-building functions (buildRoleClaims, buildPermissionClaims)
|
|
9
|
+
* are the token hot path — they use cache-first resolution to minimize
|
|
10
|
+
* database queries during token issuance.
|
|
11
|
+
*
|
|
12
|
+
* Cache strategy for claims:
|
|
13
|
+
* 1. Check Redis for cached slug arrays
|
|
14
|
+
* 2. On cache hit → return immediately (fast path)
|
|
15
|
+
* 3. On cache miss → query DB, cache result, return
|
|
16
|
+
*
|
|
17
|
+
* @see mapping-repository.ts — Database operations for user-role join table
|
|
18
|
+
* @see cache.ts — Redis cache for role/permission slug arrays
|
|
19
|
+
*/
|
|
20
|
+
import { assignRolesToUser as repoAssignRoles, removeRolesFromUser as repoRemoveRoles, getRolesForUser as repoGetRolesForUser, getPermissionsForUser as repoGetPermissionsForUser, getUsersWithRole as repoGetUsersWithRole, } from './mapping-repository.js';
|
|
21
|
+
import { getCachedUserRoles, setCachedUserRoles, getCachedUserPermissions, setCachedUserPermissions, invalidateUserRbacCache, } from './cache.js';
|
|
22
|
+
import { writeAuditLog } from '../lib/audit-log.js';
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// Assignment management
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
/**
|
|
27
|
+
* Assign roles to a user (bulk).
|
|
28
|
+
*
|
|
29
|
+
* Uses ON CONFLICT DO NOTHING for idempotent assignment. Invalidates
|
|
30
|
+
* the user's RBAC cache since their effective permissions may change.
|
|
31
|
+
*
|
|
32
|
+
* @param userId - User UUID
|
|
33
|
+
* @param roleIds - Array of role UUIDs to assign
|
|
34
|
+
* @param assignedBy - Optional UUID of the admin performing the assignment
|
|
35
|
+
*/
|
|
36
|
+
export async function assignRolesToUser(userId, roleIds, assignedBy) {
|
|
37
|
+
if (roleIds.length === 0)
|
|
38
|
+
return;
|
|
39
|
+
await repoAssignRoles(userId, roleIds, assignedBy);
|
|
40
|
+
// Invalidate user's cached roles and permissions
|
|
41
|
+
await invalidateUserRbacCache(userId);
|
|
42
|
+
// Audit log (fire-and-forget)
|
|
43
|
+
void writeAuditLog({
|
|
44
|
+
eventType: 'user.roles.assigned',
|
|
45
|
+
eventCategory: 'admin',
|
|
46
|
+
userId,
|
|
47
|
+
actorId: assignedBy,
|
|
48
|
+
metadata: { roleIds },
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Remove roles from a user (bulk).
|
|
53
|
+
*
|
|
54
|
+
* Invalidates the user's RBAC cache since their effective permissions
|
|
55
|
+
* may change.
|
|
56
|
+
*
|
|
57
|
+
* @param userId - User UUID
|
|
58
|
+
* @param roleIds - Array of role UUIDs to remove
|
|
59
|
+
* @param actorId - Optional UUID of the admin performing the action
|
|
60
|
+
*/
|
|
61
|
+
export async function removeRolesFromUser(userId, roleIds, actorId) {
|
|
62
|
+
if (roleIds.length === 0)
|
|
63
|
+
return;
|
|
64
|
+
await repoRemoveRoles(userId, roleIds);
|
|
65
|
+
// Invalidate user's cached roles and permissions
|
|
66
|
+
await invalidateUserRbacCache(userId);
|
|
67
|
+
// Audit log (fire-and-forget)
|
|
68
|
+
void writeAuditLog({
|
|
69
|
+
eventType: 'user.roles.removed',
|
|
70
|
+
eventCategory: 'admin',
|
|
71
|
+
userId,
|
|
72
|
+
actorId,
|
|
73
|
+
metadata: { roleIds },
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
// ---------------------------------------------------------------------------
|
|
77
|
+
// Query operations
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
/**
|
|
80
|
+
* Get all roles assigned to a user.
|
|
81
|
+
*
|
|
82
|
+
* @param userId - User UUID
|
|
83
|
+
* @returns Array of Role objects
|
|
84
|
+
*/
|
|
85
|
+
export async function getUserRoles(userId) {
|
|
86
|
+
return repoGetRolesForUser(userId);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get all permissions for a user (resolved through roles).
|
|
90
|
+
*
|
|
91
|
+
* @param userId - User UUID
|
|
92
|
+
* @returns Deduplicated array of Permission objects
|
|
93
|
+
*/
|
|
94
|
+
export async function getUserPermissions(userId) {
|
|
95
|
+
return repoGetPermissionsForUser(userId);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* List users with a specific role within an organization.
|
|
99
|
+
*
|
|
100
|
+
* Supports pagination for admin UI views.
|
|
101
|
+
*
|
|
102
|
+
* @param roleId - Role UUID
|
|
103
|
+
* @param orgId - Organization UUID
|
|
104
|
+
* @param options - Pagination options
|
|
105
|
+
* @returns Paginated user-role assignments and total count
|
|
106
|
+
*/
|
|
107
|
+
export async function getUsersWithRole(roleId, orgId, options) {
|
|
108
|
+
const page = options?.page ?? 1;
|
|
109
|
+
const pageSize = options?.pageSize ?? 20;
|
|
110
|
+
return repoGetUsersWithRole(roleId, orgId, page, pageSize);
|
|
111
|
+
}
|
|
112
|
+
// ---------------------------------------------------------------------------
|
|
113
|
+
// Token claims building (hot path)
|
|
114
|
+
// ---------------------------------------------------------------------------
|
|
115
|
+
/**
|
|
116
|
+
* Build role claims for a user's token.
|
|
117
|
+
*
|
|
118
|
+
* Returns an array of role slugs (e.g., ["crm-editor", "invoice-approver"])
|
|
119
|
+
* for inclusion in the token's custom claims.
|
|
120
|
+
*
|
|
121
|
+
* Cache-first: checks Redis for cached role slugs. On cache miss,
|
|
122
|
+
* resolves from DB and caches the result for future token issuances.
|
|
123
|
+
*
|
|
124
|
+
* @param userId - User UUID
|
|
125
|
+
* @returns Array of role slug strings
|
|
126
|
+
*/
|
|
127
|
+
export async function buildRoleClaims(userId) {
|
|
128
|
+
// 1. Check cache for user role slugs
|
|
129
|
+
const cached = await getCachedUserRoles(userId);
|
|
130
|
+
if (cached !== null) {
|
|
131
|
+
return cached;
|
|
132
|
+
}
|
|
133
|
+
// 2. Cache miss — resolve from DB
|
|
134
|
+
const roles = await repoGetRolesForUser(userId);
|
|
135
|
+
const slugs = roles.map((role) => role.slug);
|
|
136
|
+
// 3. Cache the slugs for future requests
|
|
137
|
+
await setCachedUserRoles(userId, slugs);
|
|
138
|
+
return slugs;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Build permission claims for a user's token.
|
|
142
|
+
*
|
|
143
|
+
* Returns an array of permission slugs (e.g., ["crm:contacts:read",
|
|
144
|
+
* "crm:deals:write"]) for inclusion in the token's custom claims.
|
|
145
|
+
*
|
|
146
|
+
* Cache-first: checks Redis for cached permission slugs. On cache miss,
|
|
147
|
+
* resolves through the full user → roles → permissions chain from DB
|
|
148
|
+
* and caches the result.
|
|
149
|
+
*
|
|
150
|
+
* @param userId - User UUID
|
|
151
|
+
* @returns Array of permission slug strings
|
|
152
|
+
*/
|
|
153
|
+
export async function buildPermissionClaims(userId) {
|
|
154
|
+
// 1. Check cache for user permission slugs
|
|
155
|
+
const cached = await getCachedUserPermissions(userId);
|
|
156
|
+
if (cached !== null) {
|
|
157
|
+
return cached;
|
|
158
|
+
}
|
|
159
|
+
// 2. Cache miss — resolve from DB (through roles)
|
|
160
|
+
const permissions = await repoGetPermissionsForUser(userId);
|
|
161
|
+
const slugs = permissions.map((perm) => perm.slug);
|
|
162
|
+
// 3. Cache the slugs for future requests
|
|
163
|
+
await setCachedUserPermissions(userId, slugs);
|
|
164
|
+
return slugs;
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=user-role-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-role-service.js","sourceRoot":"","sources":["../../src/rbac/user-role-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Application management API routes.
|
|
3
|
+
*
|
|
4
|
+
* All routes are under `/api/admin/applications` and require
|
|
5
|
+
* admin authentication (Bearer JWT). Provides CRUD for applications,
|
|
6
|
+
* status lifecycle (activate, deactivate, archive), and nested
|
|
7
|
+
* module management (CRUD, deactivate).
|
|
8
|
+
*
|
|
9
|
+
* Route structure:
|
|
10
|
+
* POST / — Create a new application
|
|
11
|
+
* GET / — List applications (paginated)
|
|
12
|
+
* GET /:id — Get application by ID
|
|
13
|
+
* PUT /:id — Update application
|
|
14
|
+
* POST /:id/archive — Archive application
|
|
15
|
+
* POST /:id/activate — Activate application
|
|
16
|
+
* POST /:id/deactivate — Deactivate application
|
|
17
|
+
* POST /:id/modules — Create module
|
|
18
|
+
* GET /:id/modules — List modules
|
|
19
|
+
* PUT /:id/modules/:moduleId — Update module
|
|
20
|
+
* POST /:id/modules/:moduleId/deactivate — Deactivate module
|
|
21
|
+
*
|
|
22
|
+
* Error mapping:
|
|
23
|
+
* ApplicationNotFoundError → 404
|
|
24
|
+
* ApplicationValidationError → 400
|
|
25
|
+
* ZodError → 400 with validation details
|
|
26
|
+
*/
|
|
27
|
+
import Router from '@koa/router';
|
|
28
|
+
/**
|
|
29
|
+
* Create the application management router.
|
|
30
|
+
*
|
|
31
|
+
* All routes require admin authentication (Bearer JWT via requireAdminAuth).
|
|
32
|
+
* Provides full CRUD for applications and nested modules, plus status
|
|
33
|
+
* lifecycle actions.
|
|
34
|
+
*
|
|
35
|
+
* Prefix: /api/admin/applications
|
|
36
|
+
*
|
|
37
|
+
* @returns Configured Koa Router
|
|
38
|
+
*/
|
|
39
|
+
export declare function createApplicationRouter(): Router;
|
|
40
|
+
//# sourceMappingURL=applications.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"applications.d.ts","sourceRoot":"","sources":["../../src/routes/applications.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,MAAM,MAAM,aAAa,CAAC;AA0FjC;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAsLhD"}
|