@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,499 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* User repository — PostgreSQL data access layer.
|
|
3
|
+
*
|
|
4
|
+
* Provides CRUD operations for the `users` table using parameterized
|
|
5
|
+
* queries. Each function acquires the pool via `getPool()` and returns
|
|
6
|
+
* mapped User objects (or raw password hashes for auth flows).
|
|
7
|
+
*
|
|
8
|
+
* This module is the sole interface to the database for user data.
|
|
9
|
+
* The service layer composes repository + cache + validation.
|
|
10
|
+
*
|
|
11
|
+
* Key patterns:
|
|
12
|
+
* - Dynamic UPDATE query builder for partial updates (~30 fields)
|
|
13
|
+
* - Paginated listing with mandatory org scope, optional status/search filters
|
|
14
|
+
* - Whitelisted sort columns to prevent SQL injection
|
|
15
|
+
* - All rows mapped through `mapRowToUser()`
|
|
16
|
+
* - password_hash is never returned in User objects (only via getPasswordHash)
|
|
17
|
+
*/
|
|
18
|
+
import { getPool } from '../lib/database.js';
|
|
19
|
+
import { mapRowToUser } from './types.js';
|
|
20
|
+
import { decodeCursor, buildCursorResult } from '../lib/cursor.js';
|
|
21
|
+
/**
|
|
22
|
+
* Insert a new user into the database.
|
|
23
|
+
*
|
|
24
|
+
* Uses RETURNING * to get the full row back in a single round trip.
|
|
25
|
+
* The email must be unique within the organization (enforced by the
|
|
26
|
+
* DB unique constraint on (organization_id, email)).
|
|
27
|
+
*
|
|
28
|
+
* @param data - User data to insert (password must already be hashed)
|
|
29
|
+
* @returns The newly created user
|
|
30
|
+
* @throws If email already exists in the org (unique constraint violation)
|
|
31
|
+
*/
|
|
32
|
+
export async function insertUser(data) {
|
|
33
|
+
const pool = getPool();
|
|
34
|
+
const result = await pool.query(`INSERT INTO users (
|
|
35
|
+
organization_id, email, password_hash, email_verified,
|
|
36
|
+
given_name, family_name, middle_name, nickname,
|
|
37
|
+
preferred_username, profile_url, picture_url, website_url,
|
|
38
|
+
gender, birthdate, zoneinfo, locale, phone_number,
|
|
39
|
+
address_street, address_locality, address_region,
|
|
40
|
+
address_postal_code, address_country
|
|
41
|
+
)
|
|
42
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12,
|
|
43
|
+
$13, $14, $15, $16, $17, $18, $19, $20, $21, $22)
|
|
44
|
+
RETURNING *`, [
|
|
45
|
+
data.organizationId,
|
|
46
|
+
data.email,
|
|
47
|
+
data.passwordHash ?? null,
|
|
48
|
+
data.emailVerified ?? false,
|
|
49
|
+
data.givenName ?? null,
|
|
50
|
+
data.familyName ?? null,
|
|
51
|
+
data.middleName ?? null,
|
|
52
|
+
data.nickname ?? null,
|
|
53
|
+
data.preferredUsername ?? null,
|
|
54
|
+
data.profileUrl ?? null,
|
|
55
|
+
data.pictureUrl ?? null,
|
|
56
|
+
data.websiteUrl ?? null,
|
|
57
|
+
data.gender ?? null,
|
|
58
|
+
data.birthdate ?? null,
|
|
59
|
+
data.zoneinfo ?? null,
|
|
60
|
+
data.locale ?? null,
|
|
61
|
+
data.phoneNumber ?? null,
|
|
62
|
+
data.addressStreet ?? null,
|
|
63
|
+
data.addressLocality ?? null,
|
|
64
|
+
data.addressRegion ?? null,
|
|
65
|
+
data.addressPostalCode ?? null,
|
|
66
|
+
data.addressCountry ?? null,
|
|
67
|
+
]);
|
|
68
|
+
return mapRowToUser(result.rows[0]);
|
|
69
|
+
}
|
|
70
|
+
// ---------------------------------------------------------------------------
|
|
71
|
+
// Find
|
|
72
|
+
// ---------------------------------------------------------------------------
|
|
73
|
+
/**
|
|
74
|
+
* Find a user by their UUID.
|
|
75
|
+
*
|
|
76
|
+
* @param id - User UUID
|
|
77
|
+
* @returns User or null if not found
|
|
78
|
+
*/
|
|
79
|
+
export async function findUserById(id) {
|
|
80
|
+
const pool = getPool();
|
|
81
|
+
const result = await pool.query('SELECT * FROM users WHERE id = $1', [id]);
|
|
82
|
+
if (result.rows.length === 0)
|
|
83
|
+
return null;
|
|
84
|
+
return mapRowToUser(result.rows[0]);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Find a user by email within a specific organization.
|
|
88
|
+
*
|
|
89
|
+
* Email comparison is case-insensitive because the `email` column
|
|
90
|
+
* uses the CITEXT extension.
|
|
91
|
+
*
|
|
92
|
+
* @param orgId - Organization UUID
|
|
93
|
+
* @param email - User email address
|
|
94
|
+
* @returns User or null if not found
|
|
95
|
+
*/
|
|
96
|
+
export async function findUserByEmail(orgId, email) {
|
|
97
|
+
const pool = getPool();
|
|
98
|
+
const result = await pool.query('SELECT * FROM users WHERE organization_id = $1 AND email = $2', [orgId, email]);
|
|
99
|
+
if (result.rows.length === 0)
|
|
100
|
+
return null;
|
|
101
|
+
return mapRowToUser(result.rows[0]);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Get the password hash for a user (active users only).
|
|
105
|
+
*
|
|
106
|
+
* Returns the raw Argon2id hash for password verification. Only returns
|
|
107
|
+
* the hash if the user status is 'active' — inactive, suspended, and
|
|
108
|
+
* locked users cannot authenticate.
|
|
109
|
+
*
|
|
110
|
+
* This is the only function that exposes password_hash; the User
|
|
111
|
+
* interface replaces it with a `hasPassword` boolean.
|
|
112
|
+
*
|
|
113
|
+
* @param userId - User UUID
|
|
114
|
+
* @returns Password hash string, or null if not found / not active / no password
|
|
115
|
+
*/
|
|
116
|
+
export async function getPasswordHash(userId) {
|
|
117
|
+
const pool = getPool();
|
|
118
|
+
const result = await pool.query("SELECT password_hash FROM users WHERE id = $1 AND status = 'active'", [userId]);
|
|
119
|
+
if (result.rows.length === 0)
|
|
120
|
+
return null;
|
|
121
|
+
return result.rows[0].password_hash;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Mapping from UpdateUserData keys to database column names.
|
|
125
|
+
* Used by the dynamic query builder to construct SET clauses.
|
|
126
|
+
*/
|
|
127
|
+
const FIELD_TO_COLUMN = {
|
|
128
|
+
email: 'email',
|
|
129
|
+
emailVerified: 'email_verified',
|
|
130
|
+
passwordHash: 'password_hash',
|
|
131
|
+
passwordChangedAt: 'password_changed_at',
|
|
132
|
+
givenName: 'given_name',
|
|
133
|
+
familyName: 'family_name',
|
|
134
|
+
middleName: 'middle_name',
|
|
135
|
+
nickname: 'nickname',
|
|
136
|
+
preferredUsername: 'preferred_username',
|
|
137
|
+
profileUrl: 'profile_url',
|
|
138
|
+
pictureUrl: 'picture_url',
|
|
139
|
+
websiteUrl: 'website_url',
|
|
140
|
+
gender: 'gender',
|
|
141
|
+
birthdate: 'birthdate',
|
|
142
|
+
zoneinfo: 'zoneinfo',
|
|
143
|
+
locale: 'locale',
|
|
144
|
+
phoneNumber: 'phone_number',
|
|
145
|
+
phoneNumberVerified: 'phone_number_verified',
|
|
146
|
+
addressStreet: 'address_street',
|
|
147
|
+
addressLocality: 'address_locality',
|
|
148
|
+
addressRegion: 'address_region',
|
|
149
|
+
addressPostalCode: 'address_postal_code',
|
|
150
|
+
addressCountry: 'address_country',
|
|
151
|
+
twoFactorEnabled: 'two_factor_enabled',
|
|
152
|
+
twoFactorMethod: 'two_factor_method',
|
|
153
|
+
status: 'status',
|
|
154
|
+
lockedAt: 'locked_at',
|
|
155
|
+
lockedReason: 'locked_reason',
|
|
156
|
+
};
|
|
157
|
+
/**
|
|
158
|
+
* Update a user's fields using a dynamic SET clause.
|
|
159
|
+
*
|
|
160
|
+
* Only explicitly provided fields (not undefined) are included in the
|
|
161
|
+
* UPDATE statement. This allows partial updates without overwriting
|
|
162
|
+
* fields that weren't specified. Setting a field to `null` clears it.
|
|
163
|
+
*
|
|
164
|
+
* The `updated_at` column is handled automatically by the DB trigger.
|
|
165
|
+
*
|
|
166
|
+
* @param id - User UUID
|
|
167
|
+
* @param data - Fields to update (only non-undefined fields are applied)
|
|
168
|
+
* @returns Updated user
|
|
169
|
+
* @throws Error if user not found or no fields provided
|
|
170
|
+
*/
|
|
171
|
+
export async function updateUser(id, data) {
|
|
172
|
+
const pool = getPool();
|
|
173
|
+
// Build dynamic SET clause from provided fields
|
|
174
|
+
const setClauses = [];
|
|
175
|
+
const values = [id]; // $1 is always the ID
|
|
176
|
+
let paramIndex = 2;
|
|
177
|
+
for (const [field, column] of Object.entries(FIELD_TO_COLUMN)) {
|
|
178
|
+
const value = data[field];
|
|
179
|
+
// Include the field if it's explicitly set (including null for clearing)
|
|
180
|
+
if (value !== undefined) {
|
|
181
|
+
setClauses.push(`${column} = $${paramIndex}`);
|
|
182
|
+
values.push(value);
|
|
183
|
+
paramIndex++;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
if (setClauses.length === 0) {
|
|
187
|
+
throw new Error('No fields to update');
|
|
188
|
+
}
|
|
189
|
+
const sql = `UPDATE users SET ${setClauses.join(', ')} WHERE id = $1 RETURNING *`;
|
|
190
|
+
const result = await pool.query(sql, values);
|
|
191
|
+
if (result.rows.length === 0) {
|
|
192
|
+
throw new Error('User not found');
|
|
193
|
+
}
|
|
194
|
+
return mapRowToUser(result.rows[0]);
|
|
195
|
+
}
|
|
196
|
+
// ---------------------------------------------------------------------------
|
|
197
|
+
// List
|
|
198
|
+
// ---------------------------------------------------------------------------
|
|
199
|
+
/**
|
|
200
|
+
* Allowed sort columns — whitelisted to prevent SQL injection.
|
|
201
|
+
* These are interpolated directly into the SQL ORDER BY clause.
|
|
202
|
+
*/
|
|
203
|
+
const ALLOWED_SORT_COLUMNS = {
|
|
204
|
+
email: 'email',
|
|
205
|
+
given_name: 'given_name',
|
|
206
|
+
family_name: 'family_name',
|
|
207
|
+
created_at: 'created_at',
|
|
208
|
+
last_login_at: 'last_login_at',
|
|
209
|
+
};
|
|
210
|
+
/**
|
|
211
|
+
* List users within an organization with pagination, optional filters, and sorting.
|
|
212
|
+
*
|
|
213
|
+
* Unlike organization listing, user listing always requires an organization_id
|
|
214
|
+
* scope — users are never listed across organizations.
|
|
215
|
+
*
|
|
216
|
+
* Executes two queries:
|
|
217
|
+
* 1. COUNT query for total matching rows
|
|
218
|
+
* 2. Data query with LIMIT/OFFSET for the current page
|
|
219
|
+
*
|
|
220
|
+
* Search is case-insensitive (ILIKE) across email, given_name, and family_name.
|
|
221
|
+
*
|
|
222
|
+
* @param options - Pagination, filter, and sort options (orgId is required)
|
|
223
|
+
* @returns Paginated result with users and metadata
|
|
224
|
+
*/
|
|
225
|
+
export async function listUsers(options) {
|
|
226
|
+
const pool = getPool();
|
|
227
|
+
const { organizationId, page, pageSize, status, search, sortBy, sortOrder } = options;
|
|
228
|
+
// Build WHERE conditions — org_id is always required
|
|
229
|
+
const conditions = ['organization_id = $1'];
|
|
230
|
+
const params = [organizationId];
|
|
231
|
+
let paramIndex = 2;
|
|
232
|
+
if (status) {
|
|
233
|
+
conditions.push(`status = $${paramIndex}`);
|
|
234
|
+
params.push(status);
|
|
235
|
+
paramIndex++;
|
|
236
|
+
}
|
|
237
|
+
if (search) {
|
|
238
|
+
// Search across email, given_name, and family_name
|
|
239
|
+
conditions.push(`(email ILIKE $${paramIndex} OR given_name ILIKE $${paramIndex} OR family_name ILIKE $${paramIndex})`);
|
|
240
|
+
params.push(`%${search}%`);
|
|
241
|
+
paramIndex++;
|
|
242
|
+
}
|
|
243
|
+
const whereClause = `WHERE ${conditions.join(' AND ')}`;
|
|
244
|
+
// Whitelist sort column and direction to prevent SQL injection
|
|
245
|
+
const sortColumn = ALLOWED_SORT_COLUMNS[sortBy ?? 'created_at'] ?? 'created_at';
|
|
246
|
+
const direction = sortOrder === 'asc' ? 'ASC' : 'DESC';
|
|
247
|
+
// Count total matching rows
|
|
248
|
+
const countResult = await pool.query(`SELECT COUNT(*) as count FROM users ${whereClause}`, params);
|
|
249
|
+
const total = parseInt(countResult.rows[0].count, 10);
|
|
250
|
+
// Fetch paginated data
|
|
251
|
+
const offset = (page - 1) * pageSize;
|
|
252
|
+
const dataResult = await pool.query(`SELECT * FROM users ${whereClause} ORDER BY ${sortColumn} ${direction} LIMIT $${paramIndex} OFFSET $${paramIndex + 1}`, [...params, pageSize, offset]);
|
|
253
|
+
return {
|
|
254
|
+
data: dataResult.rows.map(mapRowToUser),
|
|
255
|
+
total,
|
|
256
|
+
page,
|
|
257
|
+
pageSize,
|
|
258
|
+
totalPages: Math.ceil(total / pageSize),
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* List users with cursor-based keyset pagination (org-scoped).
|
|
263
|
+
*
|
|
264
|
+
* @param options - Cursor pagination, filter, and sort options
|
|
265
|
+
* @returns Cursor-paginated result with users
|
|
266
|
+
*/
|
|
267
|
+
export async function listUsersCursor(options) {
|
|
268
|
+
const pool = getPool();
|
|
269
|
+
const limit = Math.min(Math.max(1, options.limit ?? 25), 100);
|
|
270
|
+
const sortColumn = ALLOWED_SORT_COLUMNS[options.sortBy ?? 'created_at'] ?? 'created_at';
|
|
271
|
+
const direction = options.sortOrder === 'asc' ? 'ASC' : 'DESC';
|
|
272
|
+
const comparator = direction === 'ASC' ? '>' : '<';
|
|
273
|
+
// Organization scope is always required
|
|
274
|
+
const conditions = ['organization_id = $1'];
|
|
275
|
+
const params = [options.organizationId];
|
|
276
|
+
let paramIndex = 2;
|
|
277
|
+
if (options.cursor) {
|
|
278
|
+
const decoded = decodeCursor(options.cursor);
|
|
279
|
+
if (decoded) {
|
|
280
|
+
if (decoded.s === null) {
|
|
281
|
+
conditions.push(`(${sortColumn} IS NOT NULL OR (${sortColumn} IS NULL AND id ${comparator} $${paramIndex}))`);
|
|
282
|
+
params.push(decoded.i);
|
|
283
|
+
paramIndex++;
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
conditions.push(`(${sortColumn}, id) ${comparator} ($${paramIndex}, $${paramIndex + 1})`);
|
|
287
|
+
params.push(decoded.s, decoded.i);
|
|
288
|
+
paramIndex += 2;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
if (options.status) {
|
|
293
|
+
conditions.push(`status = $${paramIndex}`);
|
|
294
|
+
params.push(options.status);
|
|
295
|
+
paramIndex++;
|
|
296
|
+
}
|
|
297
|
+
if (options.search) {
|
|
298
|
+
conditions.push(`(email ILIKE $${paramIndex} OR given_name ILIKE $${paramIndex} OR family_name ILIKE $${paramIndex})`);
|
|
299
|
+
params.push(`%${options.search}%`);
|
|
300
|
+
paramIndex++;
|
|
301
|
+
}
|
|
302
|
+
const whereClause = `WHERE ${conditions.join(' AND ')}`;
|
|
303
|
+
const sql = `SELECT * FROM users ${whereClause} ORDER BY ${sortColumn} ${direction}, id ${direction} LIMIT $${paramIndex}`;
|
|
304
|
+
params.push(limit + 1);
|
|
305
|
+
const result = await pool.query(sql, params);
|
|
306
|
+
const rows = result.rows.map(mapRowToUser);
|
|
307
|
+
// Resolve sort value getter based on sort column
|
|
308
|
+
const getSortValue = (u) => {
|
|
309
|
+
switch (sortColumn) {
|
|
310
|
+
case 'email':
|
|
311
|
+
return u.email;
|
|
312
|
+
case 'given_name':
|
|
313
|
+
return u.givenName ?? null;
|
|
314
|
+
case 'family_name':
|
|
315
|
+
return u.familyName ?? null;
|
|
316
|
+
case 'last_login_at':
|
|
317
|
+
return u.lastLoginAt?.toISOString() ?? null;
|
|
318
|
+
default:
|
|
319
|
+
return u.createdAt.toISOString();
|
|
320
|
+
}
|
|
321
|
+
};
|
|
322
|
+
return buildCursorResult(rows, limit, getSortValue, (u) => u.id);
|
|
323
|
+
}
|
|
324
|
+
// ---------------------------------------------------------------------------
|
|
325
|
+
// Utility queries
|
|
326
|
+
// ---------------------------------------------------------------------------
|
|
327
|
+
/**
|
|
328
|
+
* Check if an email already exists within an organization.
|
|
329
|
+
*
|
|
330
|
+
* Used by the service layer to check for duplicates before create/update.
|
|
331
|
+
* An optional `excludeId` parameter allows excluding a specific user
|
|
332
|
+
* (useful when updating a user's email — the existing email for that
|
|
333
|
+
* user should not count as a duplicate).
|
|
334
|
+
*
|
|
335
|
+
* @param orgId - Organization UUID
|
|
336
|
+
* @param email - Email to check (case-insensitive via CITEXT)
|
|
337
|
+
* @param excludeId - Optional user ID to exclude from the check
|
|
338
|
+
* @returns true if the email already exists
|
|
339
|
+
*/
|
|
340
|
+
export async function emailExists(orgId, email, excludeId) {
|
|
341
|
+
const pool = getPool();
|
|
342
|
+
if (excludeId) {
|
|
343
|
+
const result = await pool.query('SELECT EXISTS(SELECT 1 FROM users WHERE organization_id = $1 AND email = $2 AND id != $3) as exists', [orgId, email, excludeId]);
|
|
344
|
+
return result.rows[0].exists;
|
|
345
|
+
}
|
|
346
|
+
const result = await pool.query('SELECT EXISTS(SELECT 1 FROM users WHERE organization_id = $1 AND email = $2) as exists', [orgId, email]);
|
|
347
|
+
return result.rows[0].exists;
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Update login statistics for a user.
|
|
351
|
+
*
|
|
352
|
+
* Increments login_count and sets last_login_at to the current timestamp.
|
|
353
|
+
* Called by the service layer's recordLogin() function after successful
|
|
354
|
+
* authentication.
|
|
355
|
+
*
|
|
356
|
+
* @param id - User UUID
|
|
357
|
+
*/
|
|
358
|
+
export async function updateLoginStats(id) {
|
|
359
|
+
const pool = getPool();
|
|
360
|
+
// Also reset failed login counter on successful login
|
|
361
|
+
await pool.query(`UPDATE users
|
|
362
|
+
SET last_login_at = NOW(),
|
|
363
|
+
login_count = login_count + 1,
|
|
364
|
+
failed_login_count = 0,
|
|
365
|
+
last_failed_login_at = NULL
|
|
366
|
+
WHERE id = $1`, [id]);
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Atomic failed login counter increment with conditional auto-lock.
|
|
370
|
+
*
|
|
371
|
+
* Increments `failed_login_count` and sets `last_failed_login_at` in a
|
|
372
|
+
* single UPDATE. If the new count reaches or exceeds `maxAttempts` and
|
|
373
|
+
* the user is currently `active`, the status is changed to `locked`
|
|
374
|
+
* with `locked_reason = 'auto_lockout'`.
|
|
375
|
+
*
|
|
376
|
+
* Returns the row's new status and count so the caller knows whether
|
|
377
|
+
* a lock was triggered (for audit logging and cache invalidation).
|
|
378
|
+
*
|
|
379
|
+
* @param id - User UUID
|
|
380
|
+
* @param maxAttempts - Threshold from system_config `max_failed_logins`
|
|
381
|
+
* @returns New status and failed_login_count after the update
|
|
382
|
+
*/
|
|
383
|
+
export async function incrementFailedLoginCount(id, maxAttempts) {
|
|
384
|
+
const pool = getPool();
|
|
385
|
+
const result = await pool.query(`UPDATE users
|
|
386
|
+
SET failed_login_count = failed_login_count + 1,
|
|
387
|
+
last_failed_login_at = NOW(),
|
|
388
|
+
status = CASE
|
|
389
|
+
WHEN failed_login_count + 1 >= $2 AND status = 'active' THEN 'locked'
|
|
390
|
+
ELSE status
|
|
391
|
+
END,
|
|
392
|
+
locked_at = CASE
|
|
393
|
+
WHEN failed_login_count + 1 >= $2 AND status = 'active' THEN NOW()
|
|
394
|
+
ELSE locked_at
|
|
395
|
+
END,
|
|
396
|
+
locked_reason = CASE
|
|
397
|
+
WHEN failed_login_count + 1 >= $2 AND status = 'active' THEN 'auto_lockout'
|
|
398
|
+
ELSE locked_reason
|
|
399
|
+
END
|
|
400
|
+
WHERE id = $1
|
|
401
|
+
RETURNING status, failed_login_count`, [id, maxAttempts]);
|
|
402
|
+
const row = result.rows[0];
|
|
403
|
+
return {
|
|
404
|
+
status: row?.status ?? 'active',
|
|
405
|
+
failedLoginCount: row?.failed_login_count ?? 0,
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* Apply the fixed-shape failed-login update only when the selected account remains active.
|
|
410
|
+
*
|
|
411
|
+
* Callers pass a non-account UUID when no eligible account exists. PostgreSQL still executes the
|
|
412
|
+
* same statement, while the status predicate prevents mutation of absent or ineligible accounts.
|
|
413
|
+
*
|
|
414
|
+
* @param id - Eligible account UUID or the fixed non-account UUID.
|
|
415
|
+
* @param maxAttempts - Auto-lock threshold.
|
|
416
|
+
* @returns Updated status/count, or the neutral no-op result.
|
|
417
|
+
*/
|
|
418
|
+
export async function recordEligiblePasswordFailure(id, maxAttempts) {
|
|
419
|
+
const pool = getPool();
|
|
420
|
+
const result = await pool.query(`UPDATE users
|
|
421
|
+
SET failed_login_count = failed_login_count + 1,
|
|
422
|
+
last_failed_login_at = NOW(),
|
|
423
|
+
status = CASE
|
|
424
|
+
WHEN failed_login_count + 1 >= $2 THEN 'locked'
|
|
425
|
+
ELSE status
|
|
426
|
+
END,
|
|
427
|
+
locked_at = CASE
|
|
428
|
+
WHEN failed_login_count + 1 >= $2 THEN NOW()
|
|
429
|
+
ELSE locked_at
|
|
430
|
+
END,
|
|
431
|
+
locked_reason = CASE
|
|
432
|
+
WHEN failed_login_count + 1 >= $2 THEN 'auto_lockout'
|
|
433
|
+
ELSE locked_reason
|
|
434
|
+
END
|
|
435
|
+
WHERE id = $1
|
|
436
|
+
AND status = 'active'
|
|
437
|
+
RETURNING status, failed_login_count`, [id, maxAttempts]);
|
|
438
|
+
const row = result.rows[0];
|
|
439
|
+
return {
|
|
440
|
+
status: row?.status ?? 'unmodified',
|
|
441
|
+
failedLoginCount: row?.failed_login_count ?? 0,
|
|
442
|
+
};
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Conditionally clear an elapsed automatic lock using a fixed-shape update.
|
|
446
|
+
*
|
|
447
|
+
* @param id - Candidate account UUID or the fixed non-account UUID.
|
|
448
|
+
* @param lockedBefore - Inclusive cutoff for an elapsed automatic lock.
|
|
449
|
+
* @returns Whether an account was unlocked.
|
|
450
|
+
*/
|
|
451
|
+
export async function unlockEligiblePasswordAccount(id, lockedBefore) {
|
|
452
|
+
const pool = getPool();
|
|
453
|
+
const result = await pool.query(`UPDATE users
|
|
454
|
+
SET status = 'active',
|
|
455
|
+
locked_at = NULL,
|
|
456
|
+
locked_reason = NULL,
|
|
457
|
+
failed_login_count = 0,
|
|
458
|
+
last_failed_login_at = NULL
|
|
459
|
+
WHERE id = $1
|
|
460
|
+
AND status = 'locked'
|
|
461
|
+
AND locked_reason = 'auto_lockout'
|
|
462
|
+
AND locked_at <= $2`, [id, lockedBefore]);
|
|
463
|
+
return result.rowCount === 1;
|
|
464
|
+
}
|
|
465
|
+
/**
|
|
466
|
+
* Reset the failed login counter and unlock an auto-locked account.
|
|
467
|
+
*
|
|
468
|
+
* Used by `checkAutoUnlock` when the lockout cooldown has elapsed.
|
|
469
|
+
* Only affects rows that are actually auto-locked — the WHERE clause
|
|
470
|
+
* ensures we don't accidentally unlock manually-locked accounts.
|
|
471
|
+
*
|
|
472
|
+
* @param id - User UUID
|
|
473
|
+
*/
|
|
474
|
+
export async function resetFailedLoginCount(id) {
|
|
475
|
+
const pool = getPool();
|
|
476
|
+
await pool.query(`UPDATE users
|
|
477
|
+
SET status = 'active',
|
|
478
|
+
locked_at = NULL,
|
|
479
|
+
locked_reason = NULL,
|
|
480
|
+
failed_login_count = 0,
|
|
481
|
+
last_failed_login_at = NULL
|
|
482
|
+
WHERE id = $1
|
|
483
|
+
AND status = 'locked'
|
|
484
|
+
AND locked_reason = 'auto_lockout'`, [id]);
|
|
485
|
+
}
|
|
486
|
+
/**
|
|
487
|
+
* Count the number of users in an organization.
|
|
488
|
+
*
|
|
489
|
+
* Useful for organization statistics, license enforcement, or rate limiting.
|
|
490
|
+
*
|
|
491
|
+
* @param orgId - Organization UUID
|
|
492
|
+
* @returns Number of users in the organization
|
|
493
|
+
*/
|
|
494
|
+
export async function countByOrganization(orgId) {
|
|
495
|
+
const pool = getPool();
|
|
496
|
+
const result = await pool.query('SELECT COUNT(*) as count FROM users WHERE organization_id = $1', [orgId]);
|
|
497
|
+
return parseInt(result.rows[0].count, 10);
|
|
498
|
+
}
|
|
499
|
+
//# sourceMappingURL=repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/users/repository.ts"],"names":[],"mappings":"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"}
|