alepha 0.22.0 → 0.24.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/assets/swagger-ui/swagger-ui-bundle.js +1 -1
- package/assets/swagger-ui/swagger-ui-standalone-preset.js +1 -1
- package/dist/api/audits/index.browser.js +49 -52
- package/dist/api/audits/index.browser.js.map +1 -1
- package/dist/api/audits/index.d.ts +629 -565
- package/dist/api/audits/index.d.ts.map +1 -1
- package/dist/api/audits/index.js +206 -98
- package/dist/api/audits/index.js.map +1 -1
- package/dist/api/files/index.browser.js +44 -44
- package/dist/api/files/index.browser.js.map +1 -1
- package/dist/api/files/index.d.ts +292 -293
- package/dist/api/files/index.d.ts.map +1 -1
- package/dist/api/files/index.js +61 -64
- package/dist/api/files/index.js.map +1 -1
- package/dist/api/jobs/index.browser.js +61 -59
- package/dist/api/jobs/index.browser.js.map +1 -1
- package/dist/api/jobs/index.d.ts +546 -347
- package/dist/api/jobs/index.d.ts.map +1 -1
- package/dist/api/jobs/index.js +165 -86
- package/dist/api/jobs/index.js.map +1 -1
- package/dist/api/keys/index.d.ts +242 -230
- package/dist/api/keys/index.d.ts.map +1 -1
- package/dist/api/keys/index.js +63 -66
- package/dist/api/keys/index.js.map +1 -1
- package/dist/api/notifications/index.browser.js +40 -38
- package/dist/api/notifications/index.browser.js.map +1 -1
- package/dist/api/notifications/index.d.ts +339 -209
- package/dist/api/notifications/index.d.ts.map +1 -1
- package/dist/api/notifications/index.js +108 -60
- package/dist/api/notifications/index.js.map +1 -1
- package/dist/api/oauth/index.d.ts +190 -78
- package/dist/api/oauth/index.d.ts.map +1 -1
- package/dist/api/oauth/index.js +290 -68
- package/dist/api/oauth/index.js.map +1 -1
- package/dist/api/organizations/index.browser.js +14 -14
- package/dist/api/organizations/index.browser.js.map +1 -1
- package/dist/api/organizations/index.d.ts +158 -134
- package/dist/api/organizations/index.d.ts.map +1 -1
- package/dist/api/organizations/index.js +18 -18
- package/dist/api/organizations/index.js.map +1 -1
- package/dist/api/parameters/index.browser.js +74 -53
- package/dist/api/parameters/index.browser.js.map +1 -1
- package/dist/api/parameters/index.d.ts +607 -513
- package/dist/api/parameters/index.d.ts.map +1 -1
- package/dist/api/parameters/index.js +205 -127
- package/dist/api/parameters/index.js.map +1 -1
- package/dist/api/payments/index.d.ts +652 -449
- package/dist/api/payments/index.d.ts.map +1 -1
- package/dist/api/payments/index.js +159 -93
- package/dist/api/payments/index.js.map +1 -1
- package/dist/api/subscriptions/index.d.ts +1032 -762
- package/dist/api/subscriptions/index.d.ts.map +1 -1
- package/dist/api/subscriptions/index.js +166 -185
- package/dist/api/subscriptions/index.js.map +1 -1
- package/dist/api/users/index.browser.js +48 -71
- package/dist/api/users/index.browser.js.map +1 -1
- package/dist/api/users/index.d.ts +1297 -1109
- package/dist/api/users/index.d.ts.map +1 -1
- package/dist/api/users/index.js +454 -369
- package/dist/api/users/index.js.map +1 -1
- package/dist/api/verifications/index.browser.js +17 -17
- package/dist/api/verifications/index.browser.js.map +1 -1
- package/dist/api/verifications/index.d.ts +169 -157
- package/dist/api/verifications/index.d.ts.map +1 -1
- package/dist/api/verifications/index.js +47 -95
- package/dist/api/verifications/index.js.map +1 -1
- package/dist/background/index.d.ts +0 -1
- package/dist/background/index.d.ts.map +1 -1
- package/dist/background/index.js.map +1 -1
- package/dist/background/index.workerd.js.map +1 -1
- package/dist/batch/index.d.ts +0 -1
- package/dist/batch/index.d.ts.map +1 -1
- package/dist/batch/index.js.map +1 -1
- package/dist/bin/index.js +1 -1
- package/dist/bin/index.js.map +1 -1
- package/dist/bucket/index.d.ts +27 -32
- package/dist/bucket/index.d.ts.map +1 -1
- package/dist/bucket/index.js +56 -26
- package/dist/bucket/index.js.map +1 -1
- package/dist/bucket/index.workerd.js +52 -24
- package/dist/bucket/index.workerd.js.map +1 -1
- package/dist/cache/core/index.d.ts +4 -6
- package/dist/cache/core/index.d.ts.map +1 -1
- package/dist/cache/core/index.js +4 -10
- package/dist/cache/core/index.js.map +1 -1
- package/dist/cache/core/index.workerd.js +4 -10
- package/dist/cache/core/index.workerd.js.map +1 -1
- package/dist/cache/database/index.d.ts +22 -23
- package/dist/cache/database/index.d.ts.map +1 -1
- package/dist/cache/database/index.js +11 -20
- package/dist/cache/database/index.js.map +1 -1
- package/dist/cache/redis/index.d.ts +3 -4
- package/dist/cache/redis/index.d.ts.map +1 -1
- package/dist/cache/redis/index.js +2 -2
- package/dist/cache/redis/index.js.map +1 -1
- package/dist/captcha/index.d.ts.map +1 -1
- package/dist/captcha/index.js +4 -4
- package/dist/captcha/index.js.map +1 -1
- package/dist/cli/config/index.d.ts +0 -1
- package/dist/cli/config/index.d.ts.map +1 -1
- package/dist/cli/core/index.d.ts +244 -475
- package/dist/cli/core/index.d.ts.map +1 -1
- package/dist/cli/core/index.js +308 -383
- package/dist/cli/core/index.js.map +1 -1
- package/dist/cli/devtools/index.d.ts +3 -9
- package/dist/cli/devtools/index.d.ts.map +1 -1
- package/dist/cli/devtools/index.js +3 -3
- package/dist/cli/devtools/index.js.map +1 -1
- package/dist/cli/i18n/index.d.ts +20 -39
- package/dist/cli/i18n/index.d.ts.map +1 -1
- package/dist/cli/i18n/index.js +51 -17
- package/dist/cli/i18n/index.js.map +1 -1
- package/dist/cli/platform/index.d.ts +89 -82
- package/dist/cli/platform/index.d.ts.map +1 -1
- package/dist/cli/platform/index.js +27 -33
- package/dist/cli/platform/index.js.map +1 -1
- package/dist/cli/platform-lib/index.d.ts +383 -410
- package/dist/cli/platform-lib/index.d.ts.map +1 -1
- package/dist/cli/platform-lib/index.js +300 -258
- package/dist/cli/platform-lib/index.js.map +1 -1
- package/dist/cli/vendor/index.d.ts +17 -41
- package/dist/cli/vendor/index.d.ts.map +1 -1
- package/dist/cli/vendor/index.js +10 -13
- package/dist/cli/vendor/index.js.map +1 -1
- package/dist/command/index.d.ts +82 -194
- package/dist/command/index.d.ts.map +1 -1
- package/dist/command/index.js +160 -563
- package/dist/command/index.js.map +1 -1
- package/dist/core/index.browser.js +845 -859
- package/dist/core/index.browser.js.map +1 -1
- package/dist/core/index.d.ts +787 -527
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +845 -859
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.native.js +845 -859
- package/dist/core/index.native.js.map +1 -1
- package/dist/core/index.workerd.js +845 -859
- package/dist/core/index.workerd.js.map +1 -1
- package/dist/crypto/index.browser.js +1 -1
- package/dist/crypto/index.browser.js.map +1 -1
- package/dist/crypto/index.d.ts +3 -4
- package/dist/crypto/index.d.ts.map +1 -1
- package/dist/crypto/index.js +6 -3
- package/dist/crypto/index.js.map +1 -1
- package/dist/datetime/index.d.ts +12 -2
- package/dist/datetime/index.d.ts.map +1 -1
- package/dist/datetime/index.js +6 -1
- package/dist/datetime/index.js.map +1 -1
- package/dist/email/brevo/index.d.ts +0 -1
- package/dist/email/brevo/index.d.ts.map +1 -1
- package/dist/email/brevo/index.js +4 -4
- package/dist/email/brevo/index.js.map +1 -1
- package/dist/email/cloudflare/index.d.ts +0 -1
- package/dist/email/cloudflare/index.d.ts.map +1 -1
- package/dist/email/cloudflare/index.js +2 -2
- package/dist/email/cloudflare/index.js.map +1 -1
- package/dist/email/core/index.d.ts +15 -7
- package/dist/email/core/index.d.ts.map +1 -1
- package/dist/email/core/index.js +14 -5
- package/dist/email/core/index.js.map +1 -1
- package/dist/email/core/index.workerd.js +5 -1
- package/dist/email/core/index.workerd.js.map +1 -1
- package/dist/email/smtp/index.d.ts +8 -9
- package/dist/email/smtp/index.d.ts.map +1 -1
- package/dist/email/smtp/index.js +702 -479
- package/dist/email/smtp/index.js.map +1 -1
- package/dist/fake/index.d.ts +1580 -1238
- package/dist/fake/index.d.ts.map +1 -1
- package/dist/fake/index.js +11728 -32131
- package/dist/fake/index.js.map +1 -1
- package/dist/lock/core/index.d.ts +13 -9
- package/dist/lock/core/index.d.ts.map +1 -1
- package/dist/lock/core/index.js +5 -5
- package/dist/lock/core/index.js.map +1 -1
- package/dist/lock/redis/index.d.ts +0 -1
- package/dist/lock/redis/index.d.ts.map +1 -1
- package/dist/lock/redis/index.js.map +1 -1
- package/dist/logger/index.d.ts +81 -69
- package/dist/logger/index.d.ts.map +1 -1
- package/dist/logger/index.js +123 -56
- package/dist/logger/index.js.map +1 -1
- package/dist/mcp/index.d.ts +36 -90
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +65 -70
- package/dist/mcp/index.js.map +1 -1
- package/dist/orm/core/index.browser.js +54 -40
- package/dist/orm/core/index.browser.js.map +1 -1
- package/dist/orm/core/index.bun.js +140 -106
- package/dist/orm/core/index.bun.js.map +1 -1
- package/dist/orm/core/index.d.ts +145 -150
- package/dist/orm/core/index.d.ts.map +1 -1
- package/dist/orm/core/index.js +144 -109
- package/dist/orm/core/index.js.map +1 -1
- package/dist/orm/postgres/index.bun.js +64 -54
- package/dist/orm/postgres/index.bun.js.map +1 -1
- package/dist/orm/postgres/index.d.ts +36 -76
- package/dist/orm/postgres/index.d.ts.map +1 -1
- package/dist/orm/postgres/index.js +67 -57
- package/dist/orm/postgres/index.js.map +1 -1
- package/dist/queue/core/index.d.ts +62 -75
- package/dist/queue/core/index.d.ts.map +1 -1
- package/dist/queue/core/index.js +48 -71
- package/dist/queue/core/index.js.map +1 -1
- package/dist/queue/core/index.workerd.js +48 -71
- package/dist/queue/core/index.workerd.js.map +1 -1
- package/dist/queue/redis/index.d.ts +3 -4
- package/dist/queue/redis/index.d.ts.map +1 -1
- package/dist/queue/redis/index.js +2 -2
- package/dist/queue/redis/index.js.map +1 -1
- package/dist/react/auth/index.browser.js.map +1 -1
- package/dist/react/auth/index.d.ts +7 -4
- package/dist/react/auth/index.d.ts.map +1 -1
- package/dist/react/auth/index.js.map +1 -1
- package/dist/react/core/index.d.ts +87 -5
- package/dist/react/core/index.d.ts.map +1 -1
- package/dist/react/core/index.js +170 -23
- package/dist/react/core/index.js.map +1 -1
- package/dist/react/form/index.d.ts +4 -6
- package/dist/react/form/index.d.ts.map +1 -1
- package/dist/react/form/index.js +107 -71
- package/dist/react/form/index.js.map +1 -1
- package/dist/react/head/index.browser.js.map +1 -1
- package/dist/react/head/index.d.ts +0 -1
- package/dist/react/head/index.d.ts.map +1 -1
- package/dist/react/head/index.js.map +1 -1
- package/dist/react/i18n/index.d.ts +47 -5
- package/dist/react/i18n/index.d.ts.map +1 -1
- package/dist/react/i18n/index.js +116 -12
- package/dist/react/i18n/index.js.map +1 -1
- package/dist/react/intro/index.d.ts +1 -4
- package/dist/react/intro/index.d.ts.map +1 -1
- package/dist/react/intro/index.js.map +1 -1
- package/dist/react/router/index.browser.js +188 -29
- package/dist/react/router/index.browser.js.map +1 -1
- package/dist/react/router/index.d.ts +480 -372
- package/dist/react/router/index.d.ts.map +1 -1
- package/dist/react/router/index.js +261 -47
- package/dist/react/router/index.js.map +1 -1
- package/dist/react/sitemap/index.browser.js +35 -0
- package/dist/react/sitemap/index.browser.js.map +1 -0
- package/dist/react/sitemap/index.d.ts +91 -0
- package/dist/react/sitemap/index.d.ts.map +1 -0
- package/dist/react/sitemap/index.js +131 -0
- package/dist/react/sitemap/index.js.map +1 -0
- package/dist/react/testing/index.d.ts +4 -5
- package/dist/react/testing/index.d.ts.map +1 -1
- package/dist/react/testing/index.js +41 -15
- package/dist/react/testing/index.js.map +1 -1
- package/dist/react/testing/{chunk-BpyX8vjI.js → rolldown-runtime-Bl3dcgcQ.js} +1 -1
- package/dist/react/ui/index.d.ts +35 -34
- package/dist/react/ui/index.d.ts.map +1 -1
- package/dist/react/ui/index.js +12 -17
- package/dist/react/ui/index.js.map +1 -1
- package/dist/redis/index.bun.js +5 -5
- package/dist/redis/index.bun.js.map +1 -1
- package/dist/redis/index.d.ts +6 -7
- package/dist/redis/index.d.ts.map +1 -1
- package/dist/redis/index.js +6 -6
- package/dist/redis/index.js.map +1 -1
- package/dist/retry/index.d.ts +0 -1
- package/dist/retry/index.d.ts.map +1 -1
- package/dist/retry/index.js.map +1 -1
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js.map +1 -1
- package/dist/scheduler/index.d.ts +4 -12
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js +9 -4
- package/dist/scheduler/index.js.map +1 -1
- package/dist/scheduler/index.workerd.js +9 -4
- package/dist/scheduler/index.workerd.js.map +1 -1
- package/dist/security/index.browser.js +30 -28
- package/dist/security/index.browser.js.map +1 -1
- package/dist/security/index.d.ts +113 -44
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js +452 -37
- package/dist/security/index.js.map +1 -1
- package/dist/server/auth/index.browser.js +19 -19
- package/dist/server/auth/index.browser.js.map +1 -1
- package/dist/server/auth/index.d.ts +215 -187
- package/dist/server/auth/index.d.ts.map +1 -1
- package/dist/server/auth/index.js +1145 -86
- package/dist/server/auth/index.js.map +1 -1
- package/dist/server/cookies/index.browser.js +103 -5
- package/dist/server/cookies/index.browser.js.map +1 -1
- package/dist/server/cookies/index.d.ts +86 -4
- package/dist/server/cookies/index.d.ts.map +1 -1
- package/dist/server/cookies/index.js +121 -8
- package/dist/server/cookies/index.js.map +1 -1
- package/dist/server/core/index.browser.js +22 -27
- package/dist/server/core/index.browser.js.map +1 -1
- package/dist/server/core/index.d.ts +134 -85
- package/dist/server/core/index.d.ts.map +1 -1
- package/dist/server/core/index.js +130 -118
- package/dist/server/core/index.js.map +1 -1
- package/dist/server/cors/index.d.ts +9 -10
- package/dist/server/cors/index.d.ts.map +1 -1
- package/dist/server/cors/index.js +14 -26
- package/dist/server/cors/index.js.map +1 -1
- package/dist/server/etag/index.d.ts +2 -3
- package/dist/server/etag/index.d.ts.map +1 -1
- package/dist/server/etag/index.js.map +1 -1
- package/dist/server/health/index.d.ts +18 -19
- package/dist/server/health/index.d.ts.map +1 -1
- package/dist/server/health/index.js +6 -6
- package/dist/server/health/index.js.map +1 -1
- package/dist/server/links/index.browser.js +15 -18
- package/dist/server/links/index.browser.js.map +1 -1
- package/dist/server/links/index.d.ts +66 -67
- package/dist/server/links/index.d.ts.map +1 -1
- package/dist/server/links/index.js +29 -32
- package/dist/server/links/index.js.map +1 -1
- package/dist/server/metrics/index.d.ts +0 -1
- package/dist/server/metrics/index.d.ts.map +1 -1
- package/dist/server/metrics/index.js +10 -3
- package/dist/server/metrics/index.js.map +1 -1
- package/dist/server/proxy/index.d.ts +0 -1
- package/dist/server/proxy/index.d.ts.map +1 -1
- package/dist/server/proxy/index.js.map +1 -1
- package/dist/server/rate-limit/index.d.ts +8 -9
- package/dist/server/rate-limit/index.d.ts.map +1 -1
- package/dist/server/rate-limit/index.js +6 -12
- package/dist/server/rate-limit/index.js.map +1 -1
- package/dist/server/static/index.d.ts +0 -1
- package/dist/server/static/index.d.ts.map +1 -1
- package/dist/server/static/index.js.map +1 -1
- package/dist/server/swagger/index.d.ts +4 -4
- package/dist/server/swagger/index.d.ts.map +1 -1
- package/dist/server/swagger/index.js +37 -25
- package/dist/server/swagger/index.js.map +1 -1
- package/dist/sms/index.d.ts +0 -1
- package/dist/sms/index.d.ts.map +1 -1
- package/dist/sms/index.js.map +1 -1
- package/dist/system/index.browser.js.map +1 -1
- package/dist/system/index.d.ts +0 -1
- package/dist/system/index.d.ts.map +1 -1
- package/dist/system/index.js +2 -1
- package/dist/system/index.js.map +1 -1
- package/dist/system/index.workerd.js.map +1 -1
- package/dist/topic/core/index.d.ts +19 -20
- package/dist/topic/core/index.d.ts.map +1 -1
- package/dist/topic/core/index.js +8 -8
- package/dist/topic/core/index.js.map +1 -1
- package/dist/topic/redis/index.d.ts +3 -4
- package/dist/topic/redis/index.d.ts.map +1 -1
- package/dist/topic/redis/index.js +2 -2
- package/dist/topic/redis/index.js.map +1 -1
- package/package.json +36 -36
- package/src/api/audits/__tests__/AuditJobs.spec.ts +83 -0
- package/src/api/audits/__tests__/AuditService.spec.ts +139 -1
- package/src/api/audits/controllers/AdminAuditController.ts +41 -41
- package/src/api/audits/entities/audits.ts +22 -22
- package/src/api/audits/index.ts +6 -1
- package/src/api/audits/jobs/AuditJobs.ts +29 -0
- package/src/api/audits/parameters/AuditParameters.ts +51 -0
- package/src/api/audits/primitives/$audit.ts +24 -0
- package/src/api/audits/schemas/auditQuerySchema.ts +13 -13
- package/src/api/audits/schemas/createAuditSchema.ts +18 -18
- package/src/api/audits/services/AuditService.ts +79 -7
- package/src/api/files/__tests__/FileController.spec.ts +5 -5
- package/src/api/files/__tests__/FileJobs.spec.ts +6 -0
- package/src/api/files/controllers/FileController.ts +25 -25
- package/src/api/files/entities/files.ts +15 -15
- package/src/api/files/schemas/fileCreatorSummarySchema.ts +7 -7
- package/src/api/files/schemas/fileQuerySchema.ts +9 -9
- package/src/api/files/schemas/fileResourceSchema.ts +7 -9
- package/src/api/files/schemas/storageStatsSchema.ts +13 -13
- package/src/api/jobs/__tests__/$job-hardening.spec.ts +289 -0
- package/src/api/jobs/__tests__/$job.spec.ts +18 -18
- package/src/api/jobs/controllers/AdminJobController.ts +8 -8
- package/src/api/jobs/entities/jobExecutionEntity.ts +29 -19
- package/src/api/jobs/providers/JobProvider.ts +128 -12
- package/src/api/jobs/providers/JobQueueProvider.ts +2 -2
- package/src/api/jobs/schemas/jobConfigAtom.ts +22 -22
- package/src/api/jobs/schemas/jobExecutionQuerySchema.ts +6 -6
- package/src/api/jobs/schemas/jobExecutionResourceSchema.ts +11 -15
- package/src/api/jobs/schemas/jobRegistrationSchema.ts +20 -19
- package/src/api/jobs/schemas/triggerJobSchema.ts +3 -3
- package/src/api/jobs/services/JobService.ts +6 -6
- package/src/api/keys/__tests__/ApiKeyService.spec.ts +2 -2
- package/src/api/keys/controllers/AdminApiKeyController.ts +10 -10
- package/src/api/keys/entities/apiKeyEntity.ts +15 -15
- package/src/api/keys/schemas/adminApiKeyQuerySchema.ts +4 -4
- package/src/api/keys/schemas/adminApiKeyResourceSchema.ts +15 -15
- package/src/api/keys/schemas/createApiKeyBodySchema.ts +5 -5
- package/src/api/keys/schemas/createApiKeyResponseSchema.ts +9 -9
- package/src/api/keys/schemas/listApiKeyResponseSchema.ts +13 -13
- package/src/api/keys/schemas/revokeApiKeyParamsSchema.ts +3 -3
- package/src/api/keys/schemas/revokeApiKeyResponseSchema.ts +3 -3
- package/src/api/notifications/__tests__/AlephaApiNotifications.spec.ts +2 -2
- package/src/api/notifications/controllers/AdminNotificationController.ts +38 -14
- package/src/api/notifications/jobs/NotificationJobs.ts +7 -6
- package/src/api/notifications/primitives/$notification.ts +43 -4
- package/src/api/notifications/schemas/notificationContactPreferencesSchema.ts +4 -4
- package/src/api/notifications/schemas/notificationContactSchema.ts +7 -7
- package/src/api/notifications/schemas/notificationDetailResourceSchema.ts +9 -11
- package/src/api/notifications/schemas/notificationPayloadSchema.ts +11 -9
- package/src/api/notifications/schemas/notificationQuerySchema.ts +6 -6
- package/src/api/notifications/schemas/notificationResourceSchema.ts +14 -14
- package/src/api/notifications/services/NotificationSenderService.ts +38 -2
- package/src/api/oauth/__tests__/OAuthClientService.spec.ts +42 -0
- package/src/api/oauth/__tests__/OAuthController.spec.ts +128 -0
- package/src/api/oauth/controllers/OAuthController.ts +132 -12
- package/src/api/oauth/entities/oauthClientEntity.ts +29 -12
- package/src/api/oauth/helpers/oauthMetadata.ts +1 -0
- package/src/api/oauth/helpers/oidcMetadata.ts +19 -0
- package/src/api/oauth/index.ts +1 -0
- package/src/api/oauth/schemas/authorizeDecisionBodySchema.ts +12 -11
- package/src/api/oauth/schemas/authorizeQuerySchema.ts +12 -10
- package/src/api/oauth/schemas/registerClientBodySchema.ts +10 -11
- package/src/api/oauth/schemas/tokenRequestBodySchema.ts +9 -8
- package/src/api/oauth/services/OAuthClientService.ts +228 -15
- package/src/api/organizations/controllers/AdminOrganizationController.ts +8 -8
- package/src/api/organizations/entities/organizations.ts +6 -6
- package/src/api/organizations/schemas/createOrganizationSchema.ts +5 -5
- package/src/api/organizations/schemas/organizationQuerySchema.ts +4 -4
- package/src/api/organizations/schemas/updateOrganizationSchema.ts +1 -2
- package/src/api/parameters/__tests__/$parameter.spec.ts +229 -50
- package/src/api/parameters/controllers/AdminParameterController.ts +9 -12
- package/src/api/parameters/entities/parameters.ts +29 -16
- package/src/api/parameters/primitives/$parameter.ts +3 -3
- package/src/api/parameters/schemas/activateParameterBodySchema.ts +4 -4
- package/src/api/parameters/schemas/createParameterVersionBodySchema.ts +15 -15
- package/src/api/parameters/schemas/parameterCreatorSummarySchema.ts +7 -7
- package/src/api/parameters/schemas/parameterCurrentResponseSchema.ts +7 -7
- package/src/api/parameters/schemas/parameterHistoryResponseSchema.ts +3 -3
- package/src/api/parameters/schemas/parameterNameParamSchema.ts +2 -3
- package/src/api/parameters/schemas/parameterNamesResponseSchema.ts +3 -3
- package/src/api/parameters/schemas/parameterResponseSchema.ts +3 -3
- package/src/api/parameters/schemas/parameterStatusSchema.ts +2 -2
- package/src/api/parameters/schemas/parameterTreeNodeSchema.ts +6 -6
- package/src/api/parameters/schemas/parameterVersionParamSchema.ts +5 -6
- package/src/api/parameters/schemas/parameterVersionResponseSchema.ts +3 -3
- package/src/api/parameters/schemas/rollbackParameterBodySchema.ts +6 -9
- package/src/api/parameters/services/ParameterProvider.ts +152 -65
- package/src/api/payments/controllers/AdminPaymentController.ts +7 -7
- package/src/api/payments/controllers/MockCheckoutController.ts +79 -28
- package/src/api/payments/controllers/PaymentController.ts +4 -4
- package/src/api/payments/entities/paymentIntents.ts +11 -11
- package/src/api/payments/entities/paymentMethods.ts +11 -11
- package/src/api/payments/entities/refunds.ts +9 -9
- package/src/api/payments/providers/PaymentProvider.ts +18 -0
- package/src/api/payments/schemas/intentSchemas.ts +25 -25
- package/src/api/payments/schemas/paymentMethodSchemas.ts +3 -3
- package/src/api/payments/services/PaymentService.ts +60 -3
- package/src/api/subscriptions/__tests__/SubscriptionService.spec.ts +14 -0
- package/src/api/subscriptions/controllers/AdminSubscriptionController.ts +11 -11
- package/src/api/subscriptions/controllers/SubscriptionController.ts +5 -4
- package/src/api/subscriptions/entities/subscriptionEvents.ts +15 -15
- package/src/api/subscriptions/entities/subscriptions.ts +22 -22
- package/src/api/subscriptions/notifications/SubscriptionNotifications.ts +22 -22
- package/src/api/subscriptions/schemas/cancelSubscriptionSchema.ts +4 -4
- package/src/api/subscriptions/schemas/changePlanSchema.ts +5 -5
- package/src/api/subscriptions/schemas/createSubscriptionSchema.ts +14 -7
- package/src/api/subscriptions/schemas/entitlementsSchema.ts +10 -10
- package/src/api/subscriptions/schemas/mrrSchema.ts +9 -9
- package/src/api/subscriptions/schemas/planDefinitionSchema.ts +21 -21
- package/src/api/subscriptions/schemas/planResourceSchema.ts +19 -19
- package/src/api/subscriptions/schemas/subscriptionQuerySchema.ts +8 -8
- package/src/api/subscriptions/schemas/subscriptionSettingsSchema.ts +7 -7
- package/src/api/subscriptions/schemas/subscriptionStatsSchema.ts +17 -17
- package/src/api/subscriptions/services/SubscriptionConfig.ts +2 -2
- package/src/api/users/__tests__/ApiKeys-integration.spec.ts +11 -11
- package/src/api/users/atoms/realmAuthSettingsAtom.ts +111 -119
- package/src/api/users/controllers/AdminIdentityController.ts +29 -19
- package/src/api/users/controllers/AdminSessionController.ts +37 -27
- package/src/api/users/controllers/AdminUserController.ts +75 -53
- package/src/api/users/controllers/MySessionController.ts +125 -0
- package/src/api/users/controllers/RealmController.ts +9 -9
- package/src/api/users/controllers/UserController.ts +55 -55
- package/src/api/users/entities/identities.ts +8 -8
- package/src/api/users/entities/sessions.ts +17 -17
- package/src/api/users/entities/users.ts +17 -17
- package/src/api/users/index.ts +3 -0
- package/src/api/users/notifications/UserNotifications.ts +76 -24
- package/src/api/users/primitives/$realm.ts +12 -0
- package/src/api/users/schemas/completePasswordResetRequestSchema.ts +8 -12
- package/src/api/users/schemas/completeRegistrationRequestSchema.ts +17 -20
- package/src/api/users/schemas/createUserSchema.ts +2 -2
- package/src/api/users/schemas/identityQuerySchema.ts +4 -4
- package/src/api/users/schemas/identityResourceSchema.ts +3 -2
- package/src/api/users/schemas/loginSchema.ts +4 -4
- package/src/api/users/schemas/passwordResetIntentResponseSchema.ts +6 -8
- package/src/api/users/schemas/realmConfigSchema.ts +10 -10
- package/src/api/users/schemas/registerQuerySchema.ts +6 -6
- package/src/api/users/schemas/registerRequestSchema.ts +21 -43
- package/src/api/users/schemas/registerResponseSchema.ts +2 -2
- package/src/api/users/schemas/registerSchema.ts +13 -31
- package/src/api/users/schemas/registrationIntentResponseSchema.ts +19 -23
- package/src/api/users/schemas/resetPasswordSchema.ts +10 -17
- package/src/api/users/schemas/sessionQuerySchema.ts +3 -3
- package/src/api/users/schemas/sessionResourceSchema.ts +25 -25
- package/src/api/users/schemas/updateUserSchema.ts +3 -4
- package/src/api/users/schemas/userQuerySchema.ts +7 -7
- package/src/api/users/services/RegistrationService.ts +25 -11
- package/src/api/users/services/UserService.ts +12 -6
- package/src/api/verifications/__tests__/CodeVerification.spec.ts +63 -101
- package/src/api/verifications/__tests__/LinkVerification.spec.ts +23 -92
- package/src/api/verifications/controllers/VerificationController.ts +13 -27
- package/src/api/verifications/entities/verifications.ts +13 -14
- package/src/api/verifications/schemas/requestVerificationCodeResponseSchema.ts +17 -14
- package/src/api/verifications/schemas/validateVerificationCodeResponseSchema.ts +9 -10
- package/src/api/verifications/schemas/verificationSettingsSchema.ts +65 -66
- package/src/api/verifications/schemas/verificationTypeEnumSchema.ts +2 -2
- package/src/api/verifications/services/VerificationService.ts +12 -0
- package/src/background/__tests__/BackgroundTaskProvider.spec.ts +36 -0
- package/src/batch/__tests__/$batch.spec.ts +22 -22
- package/src/batch/__tests__/startup-buffering.spec.ts +9 -9
- package/src/bin/index.ts +1 -1
- package/src/bucket/__tests__/TenantScopedBucket.spec.ts +60 -0
- package/src/bucket/providers/LocalFileStorageProvider.ts +14 -6
- package/src/bucket/providers/MemoryFileStorageProvider.ts +18 -7
- package/src/bucket/providers/R2FileStorageProvider.ts +14 -6
- package/src/bucket/providers/S3FileStorageProvider.ts +31 -15
- package/src/cache/core/primitives/$cache.ts +7 -10
- package/src/cache/database/entities/cacheEntries.ts +16 -27
- package/src/cache/database/providers/DatabaseCacheProvider.ts +15 -13
- package/src/cache/redis/providers/RedisCacheProvider.ts +6 -6
- package/src/captcha/providers/TurnstileCaptchaProvider.ts +4 -4
- package/src/cli/core/__tests__/BuildCloudflareTask.spec.ts +178 -0
- package/src/cli/core/__tests__/BuildDockerTask.spec.ts +0 -2
- package/src/cli/core/__tests__/DbCommand.spec.ts +108 -0
- package/src/cli/core/atoms/appEntryOptions.ts +5 -5
- package/src/cli/core/atoms/buildOptions.ts +76 -88
- package/src/cli/core/atoms/changelogOptions.ts +3 -3
- package/src/cli/core/atoms/devOptions.ts +3 -3
- package/src/cli/core/commands/build.ts +36 -49
- package/src/cli/core/commands/db.ts +171 -83
- package/src/cli/core/commands/dev.ts +8 -8
- package/src/cli/core/commands/gen/changelog.ts +12 -14
- package/src/cli/core/commands/gen/env.ts +6 -6
- package/src/cli/core/commands/gen/openapi.ts +6 -6
- package/src/cli/core/commands/init.ts +28 -33
- package/src/cli/core/commands/pack.ts +10 -10
- package/src/cli/core/commands/root.ts +7 -8
- package/src/cli/core/commands/test.ts +17 -20
- package/src/cli/core/index.ts +0 -3
- package/src/cli/core/tasks/BuildCloudflareTask.ts +138 -245
- package/src/cli/core/tasks/BuildPrerenderTask.ts +44 -7
- package/src/cli/core/templates/apiHelloResponseSchemaTs.ts +4 -4
- package/src/cli/devtools/atoms/devtoolsOptions.ts +6 -6
- package/src/cli/i18n/__tests__/I18nCheckService.spec.ts +48 -0
- package/src/cli/i18n/atoms/i18nOptions.ts +8 -8
- package/src/cli/i18n/services/I18nCheckService.ts +65 -11
- package/src/cli/platform/commands/SecretsCommand.ts +24 -25
- package/src/cli/platform/commands/platform.ts +40 -46
- package/src/cli/platform/index.ts +1 -1
- package/src/cli/platform-lib/__tests__/CloudflareAdapter.spec.ts +0 -4
- package/src/cli/platform-lib/__tests__/PlatformInspector.spec.ts +10 -3
- package/src/cli/platform-lib/__tests__/VercelAdapter.spec.ts +0 -2
- package/src/cli/platform-lib/adapters/CloudflareAdapter.ts +141 -50
- package/src/cli/platform-lib/adapters/VercelAdapter.ts +6 -11
- package/src/cli/platform-lib/atoms/platformOptions.ts +46 -25
- package/src/cli/platform-lib/schemas/cloudflare.ts +87 -87
- package/src/cli/platform-lib/schemas/platform.ts +51 -51
- package/src/cli/platform-lib/schemas/vercel.ts +28 -28
- package/src/cli/platform-lib/services/CloudflareApi.ts +5 -5
- package/src/cli/platform-lib/services/VercelApi.ts +4 -4
- package/src/cli/platform-lib/services/VercelCli.ts +6 -15
- package/src/cli/platform-lib/services/WranglerApi.ts +6 -15
- package/src/cli/vendor/atoms/vendorOptions.ts +9 -9
- package/src/cli/vendor/commands/VendorCommand.ts +11 -12
- package/src/command/__tests__/$command.spec.ts +82 -83
- package/src/command/__tests__/Asker.spec.ts +6 -13
- package/src/command/__tests__/CliProvider.spec.ts +136 -149
- package/src/command/__tests__/Runner.spec.ts +86 -110
- package/src/command/helpers/Asker.ts +23 -58
- package/src/command/helpers/Runner.ts +34 -110
- package/src/command/index.ts +4 -9
- package/src/command/primitives/$command.ts +10 -10
- package/src/command/providers/CliProvider.ts +183 -161
- package/src/core/Alepha.ts +62 -13
- package/src/core/__tests__/$atom.spec.ts +52 -3
- package/src/core/__tests__/$computed.spec.ts +129 -0
- package/src/core/__tests__/$env.spec.ts +13 -13
- package/src/core/__tests__/$inject.spec.ts +4 -4
- package/src/core/__tests__/$module.spec.ts +1 -1
- package/src/core/__tests__/Alepha-graph.spec.ts +1 -1
- package/src/core/__tests__/Alepha-parseEnv.spec.ts +32 -32
- package/src/core/__tests__/Alepha-start.spec.ts +3 -3
- package/src/core/__tests__/CodecManager.spec.ts +113 -94
- package/src/core/__tests__/KeylessJsonSchemaCodec.spec.ts +138 -138
- package/src/core/__tests__/SchemaValidator.spec.ts +43 -44
- package/src/core/__tests__/StateManager.persist.browser.spec.ts +87 -0
- package/src/core/__tests__/StateManager.spec.ts +423 -0
- package/src/core/__tests__/TypeBox-usecases.spec.ts +8 -8
- package/src/core/__tests__/TypeProvider.spec.ts +314 -309
- package/src/core/__tests__/dump.spec.ts +6 -6
- package/src/core/__tests__/pagination.spec.ts +4 -4
- package/src/core/__tests__/scoped-after-start.spec.ts +43 -0
- package/src/core/errors/TypeBoxError.ts +10 -4
- package/src/core/helpers/FileLike.ts +5 -5
- package/src/core/helpers/coerceStrings.ts +70 -0
- package/src/core/helpers/jsonSchemaToZod.ts +112 -0
- package/src/core/index.shared.ts +4 -1
- package/src/core/primitives/$atom.ts +95 -27
- package/src/core/primitives/$computed.ts +148 -0
- package/src/core/primitives/$env.ts +5 -5
- package/src/core/primitives/$state.ts +1 -1
- package/src/core/providers/AlsProvider.ts +26 -0
- package/src/core/providers/CodecManager.ts +1 -2
- package/src/core/providers/JsonSchemaCodec.ts +1 -2
- package/src/core/providers/KeylessJsonSchemaCodec.ts +82 -57
- package/src/core/providers/SchemaValidator.ts +48 -158
- package/src/core/providers/StateManager.ts +383 -9
- package/src/core/providers/TypeProvider.ts +80 -734
- package/src/core/providers/ZodProvider.ts +380 -0
- package/src/core/providers/zodAugment.ts +69 -0
- package/src/core/schemas/pageQuerySchema.ts +19 -21
- package/src/core/schemas/pageSchema.ts +47 -57
- package/src/crypto/__tests__/SecretProvider.spec.ts +31 -0
- package/src/crypto/providers/SecretProvider.ts +16 -10
- package/src/datetime/primitives/$throttle.ts +6 -1
- package/src/email/brevo/providers/BrevoEmailProvider.ts +4 -4
- package/src/email/cloudflare/providers/CloudflareEmailProvider.ts +6 -6
- package/src/email/core/index.ts +7 -2
- package/src/email/core/primitives/$email.ts +5 -1
- package/src/email/core/providers/LocalEmailProvider.ts +5 -5
- package/src/email/smtp/providers/NodemailerEmailProvider.ts +41 -52
- package/src/fake/__tests__/FakeProvider.spec.ts +110 -110
- package/src/fake/__tests__/keyName.example.ts +21 -21
- package/src/fake/__tests__/keyName.spec.ts +41 -41
- package/src/fake/__tests__/module.example.ts +8 -8
- package/src/fake/providers/FakeProvider.ts +122 -121
- package/src/lock/core/__tests__/lock-mutual-exclusion.spec.ts +44 -0
- package/src/lock/core/index.ts +1 -0
- package/src/lock/core/primitives/$lock.ts +13 -6
- package/src/logger/__tests__/CliFormatterProvider.spec.ts +76 -0
- package/src/logger/__tests__/Logger.spec.ts +49 -0
- package/src/logger/index.ts +25 -18
- package/src/logger/providers/CliFormatterProvider.ts +75 -0
- package/src/logger/schemas/logEntrySchema.ts +10 -10
- package/src/logger/services/Logger.ts +18 -0
- package/src/mcp/__tests__/$prompt.spec.ts +21 -23
- package/src/mcp/__tests__/$tool.spec.ts +22 -22
- package/src/mcp/__tests__/McpServerProvider.spec.ts +82 -11
- package/src/mcp/__tests__/StreamableHttpMcpTransport.spec.ts +2 -2
- package/src/mcp/__tests__/integration.spec.ts +33 -33
- package/src/mcp/primitives/$prompt.ts +11 -9
- package/src/mcp/primitives/$tool.ts +27 -86
- package/src/mcp/providers/McpServerProvider.ts +55 -0
- package/src/mcp/transports/StreamableHttpMcpTransport.ts +7 -7
- package/src/orm/__tests__/$repository-tests.ts +133 -27
- package/src/orm/__tests__/$repository.spec.ts +23 -0
- package/src/orm/__tests__/$transactional-tests.ts +4 -4
- package/src/orm/__tests__/ModelBuilder-tests.ts +28 -28
- package/src/orm/__tests__/ModelBuilder.spec.ts +124 -106
- package/src/orm/__tests__/QueryManager.spec.ts +5 -5
- package/src/orm/__tests__/delete-returning-tests.ts +11 -11
- package/src/orm/__tests__/deletedAt-tests.ts +3 -3
- package/src/orm/__tests__/enums.spec.ts +29 -25
- package/src/orm/__tests__/execute-tests.ts +8 -8
- package/src/orm/__tests__/fixtures/bigEntitySchema.ts +48 -48
- package/src/orm/__tests__/fixtures/userEntitySchema.ts +6 -6
- package/src/orm/__tests__/joins-tests.ts +30 -30
- package/src/orm/__tests__/organization-tests.ts +105 -3
- package/src/orm/__tests__/organization.spec.ts +46 -0
- package/src/orm/__tests__/orm-errors.spec.ts +10 -10
- package/src/orm/__tests__/orm-next-tests.ts +29 -29
- package/src/orm/__tests__/orm-showcase-tests.ts +9 -9
- package/src/orm/__tests__/primaryKey.spec.ts +4 -4
- package/src/orm/__tests__/query-date-encoding-tests.ts +17 -17
- package/src/orm/__tests__/ref-auto-onDelete.spec.ts +14 -14
- package/src/orm/__tests__/references.spec.ts +7 -7
- package/src/orm/__tests__/security.spec.ts +17 -17
- package/src/orm/__tests__/string-operators-tests.ts +5 -5
- package/src/orm/__tests__/timestamps-tests.ts +14 -14
- package/src/orm/__tests__/validation-tests.ts +5 -5
- package/src/orm/core/__tests__/BunSqliteProvider.bun.spec.ts +8 -8
- package/src/orm/core/constants/PG_SYMBOLS.ts +13 -1
- package/src/orm/core/entities/alephaSequences.ts +8 -8
- package/src/orm/core/helpers/pgAttr.ts +4 -4
- package/src/orm/core/primitives/$entity.ts +10 -6
- package/src/orm/core/providers/DatabaseTypeProvider.ts +46 -53
- package/src/orm/core/providers/drivers/BunSqliteProvider.ts +8 -8
- package/src/orm/core/providers/drivers/CloudflareD1Provider.ts +3 -5
- package/src/orm/core/providers/drivers/NodeSqliteProvider.ts +8 -8
- package/src/orm/core/schemas/databaseEnvSchema.ts +4 -4
- package/src/orm/core/schemas/insertSchema.ts +14 -18
- package/src/orm/core/schemas/legacyIdSchema.ts +2 -2
- package/src/orm/core/schemas/updateSchema.ts +10 -16
- package/src/orm/core/services/PgRelationManager.ts +2 -2
- package/src/orm/core/services/QueryManager.ts +13 -2
- package/src/orm/core/services/Repository.ts +88 -33
- package/src/orm/core/services/SqliteModelBuilder.ts +38 -45
- package/src/orm/postgres/__tests__/BunPostgresProvider.bun.spec.ts +4 -4
- package/src/orm/postgres/providers/CloudflareHyperdriveProvider.ts +4 -6
- package/src/orm/postgres/schemas/postgresEnvSchema.ts +6 -6
- package/src/orm/postgres/services/PostgresModelBuilder.ts +127 -114
- package/src/queue/core/__tests__/$consumer.spec.ts +4 -4
- package/src/queue/core/__tests__/WorkerProvider.spec.ts +4 -4
- package/src/queue/core/__tests__/shared.ts +6 -6
- package/src/queue/core/primitives/$consumer.ts +5 -5
- package/src/queue/core/primitives/$queue.ts +44 -61
- package/src/queue/core/providers/CloudflareQueueProvider.ts +6 -0
- package/src/queue/core/providers/WorkerProvider.ts +17 -14
- package/src/queue/redis/providers/RedisQueueProvider.ts +3 -3
- package/src/react/core/__tests__/ErrorBoundary.browser.spec.tsx +92 -0
- package/src/react/core/__tests__/Router.spec.tsx +4 -4
- package/src/react/core/__tests__/useComputed.browser.spec.tsx +192 -0
- package/src/react/core/__tests__/useQuery.browser.spec.tsx +48 -0
- package/src/react/core/__tests__/useSelector.browser.spec.tsx +105 -0
- package/src/react/core/__tests__/useStore.browser.spec.tsx +113 -0
- package/src/react/core/components/ErrorBoundary.tsx +42 -0
- package/src/react/core/hooks/useAction.ts +56 -19
- package/src/react/core/hooks/useComputed.ts +91 -0
- package/src/react/core/hooks/useSelector.ts +67 -0
- package/src/react/core/hooks/useStore.ts +36 -17
- package/src/react/core/index.ts +3 -0
- package/src/react/core/utils/shallowEqual.ts +36 -0
- package/src/react/form/__tests__/FormModel-submit-loading.spec.ts +71 -0
- package/src/react/form/__tests__/form-submitting-reactive.browser.spec.tsx +96 -0
- package/src/react/form/__tests__/useForm.browser.spec.tsx +54 -54
- package/src/react/form/errors/FormValidationError.ts +0 -2
- package/src/react/form/hooks/useForm.ts +19 -4
- package/src/react/form/hooks/useFormQuerySync.ts +0 -0
- package/src/react/form/services/FormModel.ts +124 -86
- package/src/react/form/services/parseField.ts +66 -27
- package/src/react/i18n/__tests__/I18nProvider.spec.ts +89 -0
- package/src/react/i18n/__tests__/Localize.spec.tsx +1 -1
- package/src/react/i18n/__tests__/locale-routing.spec.ts +107 -0
- package/src/react/i18n/providers/I18nProvider.ts +173 -14
- package/src/react/router/__tests__/$page.browser.spec.tsx +19 -19
- package/src/react/router/__tests__/$page.spec.tsx +21 -21
- package/src/react/router/__tests__/ReactBrowserProvider.browser.spec.ts +87 -1
- package/src/react/router/__tests__/RouterLocaleProvider.spec.ts +127 -0
- package/src/react/router/atoms/ssrManifestAtom.ts +16 -16
- package/src/react/router/components/NestedView.tsx +11 -3
- package/src/react/router/hooks/useQueryParams.ts +1 -1
- package/src/react/router/index.browser.ts +4 -0
- package/src/react/router/index.shared.ts +1 -0
- package/src/react/router/index.ts +9 -0
- package/src/react/router/primitives/$page.ts +2 -2
- package/src/react/router/providers/ReactBrowserProvider.ts +64 -13
- package/src/react/router/providers/ReactBrowserRouterProvider.ts +15 -1
- package/src/react/router/providers/ReactPageProvider.ts +38 -13
- package/src/react/router/providers/ReactServerProvider.ts +105 -16
- package/src/react/router/providers/RootComponentsProvider.ts +13 -0
- package/src/react/router/providers/RouterLocaleProvider.ts +125 -0
- package/src/react/router/providers/__tests__/RootComponentsProvider.spec.ts +15 -0
- package/src/react/router/providers/__tests__/rootComponents.ssr.browser.spec.tsx +67 -0
- package/src/react/sitemap/__tests__/$sitemap.spec.ts +131 -0
- package/src/react/sitemap/index.browser.ts +21 -0
- package/src/react/sitemap/index.ts +25 -0
- package/src/react/sitemap/primitives/$sitemap.browser.ts +26 -0
- package/src/react/sitemap/primitives/$sitemap.ts +196 -0
- package/src/react/ui/atoms/uiAtom.ts +6 -6
- package/src/react/ui/atoms/uiThemeListAtom.ts +7 -7
- package/src/react/ui/hooks/useColorMode.ts +11 -4
- package/src/react/ui/services/SchemaControl.ts +4 -4
- package/src/redis/providers/BunRedisProvider.ts +19 -11
- package/src/redis/providers/NodeRedisProvider.ts +3 -3
- package/src/scheduler/primitives/$scheduler.ts +21 -8
- package/src/security/__tests__/assertRealmScope.spec.ts +29 -0
- package/src/security/atoms/currentTenantAtom.ts +6 -6
- package/src/security/atoms/currentUserAtom.ts +2 -2
- package/src/security/primitives/$issuer.ts +24 -2
- package/src/security/providers/JwtProvider.ts +100 -0
- package/src/security/providers/SecurityProvider.ts +43 -2
- package/src/security/schemas/permissionSchema.ts +19 -19
- package/src/security/schemas/roleSchema.ts +22 -28
- package/src/security/schemas/userAccountInfoSchema.ts +47 -37
- package/src/server/auth/__tests__/appleClientSecret.spec.ts +34 -0
- package/src/server/auth/__tests__/federationRedirectReplay.spec.ts +44 -0
- package/src/server/auth/helpers/appleClientSecret.ts +24 -0
- package/src/server/auth/helpers/jtiReplayGuard.ts +41 -0
- package/src/server/auth/helpers/safeRedirectPath.ts +19 -0
- package/src/server/auth/index.ts +1 -0
- package/src/server/auth/primitives/$auth.ts +6 -6
- package/src/server/auth/primitives/$authApple.ts +10 -10
- package/src/server/auth/primitives/$authFacebook.ts +10 -10
- package/src/server/auth/primitives/$authFranceConnect.ts +10 -10
- package/src/server/auth/primitives/$authGithub.ts +10 -10
- package/src/server/auth/primitives/$authGoogle.ts +10 -10
- package/src/server/auth/primitives/$authMicrosoft.ts +14 -14
- package/src/server/auth/providers/ServerAuthProvider.ts +67 -52
- package/src/server/auth/schemas/authenticationProviderSchema.ts +9 -12
- package/src/server/auth/schemas/tokenResponseSchema.ts +2 -2
- package/src/server/auth/schemas/tokensSchema.ts +16 -16
- package/src/server/auth/schemas/userinfoResponseSchema.ts +3 -3
- package/src/server/cookies/__tests__/AtomCookieBinding.spec.ts +80 -0
- package/src/server/cookies/__tests__/AtomCookiePersistence.browser.spec.ts +169 -0
- package/src/server/cookies/__tests__/AtomCookiePersistence.spec.ts +294 -0
- package/src/server/cookies/__tests__/ServerCookiesProvider.spec.ts +82 -12
- package/src/server/cookies/index.browser.ts +4 -1
- package/src/server/cookies/index.ts +8 -1
- package/src/server/cookies/primitives/$cookie.browser.ts +1 -1
- package/src/server/cookies/primitives/$cookie.ts +16 -0
- package/src/server/cookies/providers/AtomCookiePersistence.browser.ts +133 -0
- package/src/server/cookies/providers/AtomCookiePersistence.ts +148 -0
- package/src/server/cookies/providers/ServerCookiesProvider.ts +32 -4
- package/src/server/cookies/services/CookieParser.ts +6 -1
- package/src/server/core/__tests__/$action.spec.ts +13 -13
- package/src/server/core/__tests__/$middleware.spec.ts +10 -10
- package/src/server/core/__tests__/$route.spec.ts +9 -9
- package/src/server/core/__tests__/$sse.spec.ts +26 -26
- package/src/server/core/__tests__/BunHttpServerProvider.bun.spec.ts +6 -6
- package/src/server/core/__tests__/HttpClient.spec.ts +2 -2
- package/src/server/core/__tests__/NodeHttpServerProvider.spec.ts +15 -3
- package/src/server/core/__tests__/ServerBodyParserProvider.spec.ts +14 -14
- package/src/server/core/__tests__/ServerMultipartProvider.spec.ts +33 -33
- package/src/server/core/__tests__/ServerRouterProvider-errorHandler.spec.ts +5 -1
- package/src/server/core/__tests__/ServerRouterProvider-getRoutes.spec.ts +25 -25
- package/src/server/core/__tests__/ServerRouterProvider-serializationError.spec.ts +9 -5
- package/src/server/core/__tests__/ServerRouterProvider-validationError.spec.ts +56 -24
- package/src/server/core/errors/ValidationError.ts +6 -3
- package/src/server/core/helpers/isMultipart.ts +2 -1
- package/src/server/core/index.ts +5 -2
- package/src/server/core/interfaces/ServerRequest.ts +14 -14
- package/src/server/core/primitives/$action.ts +26 -36
- package/src/server/core/primitives/$route.ts +27 -0
- package/src/server/core/primitives/$sse.ts +3 -3
- package/src/server/core/providers/BunHttpServerProvider.ts +8 -9
- package/src/server/core/providers/NodeHttpServerProvider.ts +8 -9
- package/src/server/core/providers/ServerBodyParserProvider.ts +20 -12
- package/src/server/core/providers/ServerCompressProvider.ts +9 -10
- package/src/server/core/providers/ServerHelmetProvider.ts +26 -27
- package/src/server/core/providers/ServerMultipartProvider.ts +19 -19
- package/src/server/core/providers/ServerRouterProvider.ts +44 -15
- package/src/server/core/schemas/errorSchema.ts +20 -25
- package/src/server/core/schemas/okSchema.ts +9 -14
- package/src/server/core/services/HttpClient.ts +13 -1
- package/src/server/core/services/ServerRequestParser.ts +6 -6
- package/src/server/cors/providers/ServerCorsProvider.ts +26 -28
- package/src/server/health/schemas/healthSchema.ts +6 -6
- package/src/server/links/__tests__/$remote.spec.ts +3 -3
- package/src/server/links/__tests__/BatchEndpoint.spec.ts +9 -9
- package/src/server/links/__tests__/LinkProvider.spec.ts +9 -9
- package/src/server/links/__tests__/ServerLinksProvider.spec.ts +23 -23
- package/src/server/links/__tests__/fixtures/CrudApp.ts +21 -21
- package/src/server/links/atoms/apiLinksAtom.ts +2 -2
- package/src/server/links/atoms/linkOptionsAtom.ts +6 -6
- package/src/server/links/primitives/$remote.ts +3 -3
- package/src/server/links/providers/LinkProvider.ts +3 -3
- package/src/server/links/providers/ServerLinksProvider.ts +20 -20
- package/src/server/links/schemas/apiLinksResponseSchema.ts +23 -23
- package/src/server/proxy/__tests__/$proxy.spec.ts +9 -9
- package/src/server/proxy/providers/ServerProxyProvider.ts +5 -0
- package/src/server/rate-limit/providers/ServerRateLimitProvider.ts +18 -20
- package/src/server/swagger/__tests__/$swagger.spec.ts +91 -94
- package/src/server/swagger/__tests__/ui.spec.ts +3 -3
- package/src/server/swagger/providers/ServerSwaggerProvider.ts +66 -43
- package/src/system/__tests__/NodeShellProvider.spec.ts +46 -0
- package/src/system/providers/NodeShellProvider.ts +4 -1
- package/src/topic/core/__tests__/$subscriber.spec.ts +4 -4
- package/src/topic/core/__tests__/shared.ts +8 -8
- package/src/topic/core/primitives/$subscriber.ts +5 -5
- package/src/topic/core/primitives/$topic.ts +14 -14
- package/src/topic/redis/providers/RedisTopicProvider.ts +3 -3
- package/dist/container/core/index.d.ts +0 -236
- package/dist/container/core/index.d.ts.map +0 -1
- package/dist/container/core/index.js +0 -231
- package/dist/container/core/index.js.map +0 -1
- package/dist/container/core/index.workerd.js +0 -192
- package/dist/container/core/index.workerd.js.map +0 -1
- package/src/cli/core/tasks/BuildSitemapTask.ts +0 -130
- package/src/command/helpers/PrettyAsker.ts +0 -256
- package/src/command/helpers/PrettyPrint.ts +0 -332
- package/src/container/core/__tests__/$container.spec.ts +0 -83
- package/src/container/core/index.ts +0 -50
- package/src/container/core/index.workerd.ts +0 -53
- package/src/container/core/interfaces/ContainerOptions.ts +0 -69
- package/src/container/core/primitives/$container.ts +0 -100
- package/src/container/core/providers/CloudflareContainerProvider.ts +0 -70
- package/src/container/core/providers/ContainerProvider.ts +0 -92
- package/src/container/core/providers/MockContainerProvider.ts +0 -62
- package/src/container/core/providers/NodeContainerProvider.ts +0 -53
- package/src/core/__tests__/jsonSchemaToTypeBox.spec.ts +0 -771
- package/src/core/helpers/jsonSchemaToTypeBox.ts +0 -359
- /package/dist/orm/core/{chunk-B4FMCO8f.js → rolldown-runtime-B4FMCO8f.js} +0 -0
package/dist/api/users/index.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { $atom, $context, $inject, $module, Alepha, AlephaError,
|
|
1
|
+
import { $atom, $context, $inject, $module, Alepha, AlephaError, z } from "alepha";
|
|
2
2
|
import { $audit } from "alepha/api/audits";
|
|
3
3
|
import { $bucket } from "alepha/bucket";
|
|
4
4
|
import { $issuer, $permission, $secure, CryptoProvider, InvalidCredentialsError, SecurityProvider } from "alepha/security";
|
|
5
|
-
import { $action, BadRequestError, ConflictError, HttpError, UnauthorizedError, okSchema } from "alepha/server";
|
|
5
|
+
import { $action, BadRequestError, ConflictError, HttpError, NotFoundError, UnauthorizedError, okSchema } from "alepha/server";
|
|
6
6
|
import { $entity, $repository, db, pageQuerySchema, sql } from "alepha/orm";
|
|
7
7
|
import { $logger } from "alepha/logger";
|
|
8
|
+
import { AlephaApiVerification, VerificationService } from "alepha/api/verifications";
|
|
8
9
|
import { $client } from "alepha/server/links";
|
|
9
10
|
import { $notification } from "alepha/api/notifications";
|
|
10
11
|
import { CaptchaProvider } from "alepha/captcha";
|
|
11
12
|
import { $authApple, $authCredentials, $authFacebook, $authFranceConnect, $authGithub, $authGoogle, $authMicrosoft, ServerAuthProvider, authenticationProviderSchema } from "alepha/server/auth";
|
|
12
13
|
import { $etag } from "alepha/server/etag";
|
|
13
|
-
import { AlephaApiVerification, VerificationService } from "alepha/api/verifications";
|
|
14
14
|
import { $cache, CacheProvider } from "alepha/cache";
|
|
15
15
|
import { DatabaseCacheProvider } from "alepha/cache/database";
|
|
16
16
|
import { DateTimeProvider } from "alepha/datetime";
|
|
@@ -108,34 +108,34 @@ var UserBuckets = class {
|
|
|
108
108
|
};
|
|
109
109
|
//#endregion
|
|
110
110
|
//#region ../../src/api/users/schemas/identityQuerySchema.ts
|
|
111
|
-
const identityQuerySchema =
|
|
112
|
-
userId:
|
|
113
|
-
provider:
|
|
111
|
+
const identityQuerySchema = pageQuerySchema.extend({
|
|
112
|
+
userId: z.uuid().optional(),
|
|
113
|
+
provider: z.string().optional()
|
|
114
114
|
});
|
|
115
115
|
//#endregion
|
|
116
116
|
//#region ../../src/api/users/entities/users.ts
|
|
117
117
|
const DEFAULT_USER_REALM_NAME = "default";
|
|
118
118
|
const users = $entity({
|
|
119
119
|
name: "users",
|
|
120
|
-
schema:
|
|
121
|
-
id: db.primaryKey(
|
|
120
|
+
schema: z.object({
|
|
121
|
+
id: db.primaryKey(z.uuid()),
|
|
122
122
|
version: db.version(),
|
|
123
123
|
createdAt: db.createdAt(),
|
|
124
124
|
updatedAt: db.updatedAt(),
|
|
125
|
-
realm: db.default(
|
|
126
|
-
username:
|
|
125
|
+
realm: db.default(z.text(), DEFAULT_USER_REALM_NAME),
|
|
126
|
+
username: z.shortText({
|
|
127
127
|
minLength: 3,
|
|
128
128
|
maxLength: 30
|
|
129
|
-
})),
|
|
130
|
-
email:
|
|
131
|
-
phoneNumber:
|
|
132
|
-
roles: db.default(
|
|
133
|
-
firstName:
|
|
134
|
-
lastName:
|
|
135
|
-
picture:
|
|
136
|
-
enabled: db.default(
|
|
137
|
-
emailVerified: db.default(
|
|
138
|
-
lastLoginAt:
|
|
129
|
+
}).optional(),
|
|
130
|
+
email: z.string().meta({ format: "email" }).optional(),
|
|
131
|
+
phoneNumber: z.e164().optional(),
|
|
132
|
+
roles: db.default(z.array(z.string()), []),
|
|
133
|
+
firstName: z.string().optional(),
|
|
134
|
+
lastName: z.string().optional(),
|
|
135
|
+
picture: z.string().optional(),
|
|
136
|
+
enabled: db.default(z.boolean(), true),
|
|
137
|
+
emailVerified: db.default(z.boolean(), false),
|
|
138
|
+
lastLoginAt: z.datetime().optional(),
|
|
139
139
|
organizationId: db.organization()
|
|
140
140
|
}),
|
|
141
141
|
indexes: [
|
|
@@ -158,16 +158,16 @@ const users = $entity({
|
|
|
158
158
|
//#region ../../src/api/users/entities/identities.ts
|
|
159
159
|
const identities = $entity({
|
|
160
160
|
name: "identities",
|
|
161
|
-
schema:
|
|
162
|
-
id: db.primaryKey(
|
|
161
|
+
schema: z.object({
|
|
162
|
+
id: db.primaryKey(z.uuid()),
|
|
163
163
|
version: db.version(),
|
|
164
164
|
createdAt: db.createdAt(),
|
|
165
165
|
updatedAt: db.updatedAt(),
|
|
166
|
-
userId: db.ref(
|
|
167
|
-
password:
|
|
168
|
-
provider:
|
|
169
|
-
providerUserId:
|
|
170
|
-
providerData:
|
|
166
|
+
userId: db.ref(z.uuid(), () => users.cols.id),
|
|
167
|
+
password: z.text().optional(),
|
|
168
|
+
provider: z.text(),
|
|
169
|
+
providerUserId: z.text().optional(),
|
|
170
|
+
providerData: z.json().optional()
|
|
171
171
|
}),
|
|
172
172
|
indexes: [
|
|
173
173
|
"userId",
|
|
@@ -181,78 +181,55 @@ const identities = $entity({
|
|
|
181
181
|
});
|
|
182
182
|
//#endregion
|
|
183
183
|
//#region ../../src/api/users/schemas/identityResourceSchema.ts
|
|
184
|
-
const identityResourceSchema =
|
|
184
|
+
const identityResourceSchema = identities.schema.omit({ password: true });
|
|
185
185
|
//#endregion
|
|
186
186
|
//#region ../../src/api/users/atoms/realmAuthSettingsAtom.ts
|
|
187
|
-
const fieldRequirement = (description) =>
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
]
|
|
192
|
-
const usernameFieldRequirement = (description) =>
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
]
|
|
187
|
+
const fieldRequirement = (description) => z.union([
|
|
188
|
+
z.const("none"),
|
|
189
|
+
z.const("optional"),
|
|
190
|
+
z.const("required")
|
|
191
|
+
]).describe(description);
|
|
192
|
+
const usernameFieldRequirement = (description) => z.union([
|
|
193
|
+
z.const("none"),
|
|
194
|
+
z.const("optional"),
|
|
195
|
+
z.const("required"),
|
|
196
|
+
z.const("email")
|
|
197
|
+
]).describe(description);
|
|
198
198
|
const realmAuthSettingsAtom = $atom({
|
|
199
199
|
name: "alepha.api.users.realmAuthSettings",
|
|
200
|
-
schema:
|
|
201
|
-
displayName:
|
|
202
|
-
description:
|
|
203
|
-
logoUrl:
|
|
204
|
-
registrationAllowed:
|
|
200
|
+
schema: z.object({
|
|
201
|
+
displayName: z.string().describe("Display name shown on auth pages (e.g., 'Customer Portal')").optional(),
|
|
202
|
+
description: z.string().describe("Description shown on auth pages").optional(),
|
|
203
|
+
logoUrl: z.string().describe("Logo URL for auth pages").optional(),
|
|
204
|
+
registrationAllowed: z.boolean().describe("Enable user self-registration"),
|
|
205
205
|
email: fieldRequirement("Email address field requirement for user accounts"),
|
|
206
206
|
username: usernameFieldRequirement("Username field requirement for user accounts"),
|
|
207
|
-
usernameRegExp:
|
|
208
|
-
usernameBlocklist:
|
|
207
|
+
usernameRegExp: z.string().describe("Regular expression that usernames must match (if username is enabled)"),
|
|
208
|
+
usernameBlocklist: z.array(z.text()).describe("Usernames that the slugger / manual registration must reject. Default empty so apps can register `admin`/`root`/`me`/etc. if they want; populate it explicitly for handles you want to keep off-limits."),
|
|
209
209
|
phoneNumber: fieldRequirement("Phone number field requirement for user accounts"),
|
|
210
|
-
verifyEmailRequired:
|
|
211
|
-
verifyPhoneRequired:
|
|
210
|
+
verifyEmailRequired: z.boolean().describe("Require email verification for user accounts"),
|
|
211
|
+
verifyPhoneRequired: z.boolean().describe("Require phone verification for user accounts"),
|
|
212
212
|
firstNameLastName: fieldRequirement("First and last name field requirement for user accounts"),
|
|
213
|
-
resetPasswordAllowed:
|
|
214
|
-
captchaRequired:
|
|
215
|
-
adminEmails:
|
|
216
|
-
adminUsernames:
|
|
217
|
-
defaultRoles:
|
|
218
|
-
verifyEmailUrl:
|
|
219
|
-
passwordPolicy:
|
|
220
|
-
minLength:
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
requireUppercase: t.boolean({ description: "Require at least one uppercase letter" }),
|
|
226
|
-
requireLowercase: t.boolean({ description: "Require at least one lowercase letter" }),
|
|
227
|
-
requireNumbers: t.boolean({ description: "Require at least one number" }),
|
|
228
|
-
requireSpecialCharacters: t.boolean({ description: "Require at least one special character" })
|
|
229
|
-
}),
|
|
230
|
-
loginRateLimit: t.object({
|
|
231
|
-
ipMaxAttempts: t.integer({
|
|
232
|
-
description: "Max failed login attempts per IP before temporary lockout",
|
|
233
|
-
default: 15,
|
|
234
|
-
minimum: 1
|
|
235
|
-
}),
|
|
236
|
-
accountMaxAttempts: t.integer({
|
|
237
|
-
description: "Max failed login attempts per account before temporary lockout",
|
|
238
|
-
default: 5,
|
|
239
|
-
minimum: 1
|
|
240
|
-
}),
|
|
241
|
-
windowMs: t.integer({
|
|
242
|
-
description: "Rate limit window duration in milliseconds",
|
|
243
|
-
default: 900 * 1e3,
|
|
244
|
-
minimum: 1e3
|
|
245
|
-
})
|
|
213
|
+
resetPasswordAllowed: z.boolean().describe("Enable forgot password functionality"),
|
|
214
|
+
captchaRequired: z.boolean().describe("Require captcha verification on registration (needs a CaptchaProvider registered, e.g. TurnstileCaptchaProvider)"),
|
|
215
|
+
adminEmails: z.array(z.email()).describe("List of email addresses that are automatically promoted to admin role on login"),
|
|
216
|
+
adminUsernames: z.array(z.text()).describe("List of usernames that are automatically promoted to admin role on login"),
|
|
217
|
+
defaultRoles: z.array(z.string()).describe("Default roles assigned to newly registered users"),
|
|
218
|
+
verifyEmailUrl: z.string().describe("Base URL for email verification links (used when verification method is 'link'). Token and email are appended as query params.").optional(),
|
|
219
|
+
passwordPolicy: z.object({
|
|
220
|
+
minLength: z.integer().min(1).describe("Minimum password length").default(8),
|
|
221
|
+
requireUppercase: z.boolean().describe("Require at least one uppercase letter"),
|
|
222
|
+
requireLowercase: z.boolean().describe("Require at least one lowercase letter"),
|
|
223
|
+
requireNumbers: z.boolean().describe("Require at least one number"),
|
|
224
|
+
requireSpecialCharacters: z.boolean().describe("Require at least one special character")
|
|
246
225
|
}),
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
226
|
+
loginRateLimit: z.object({
|
|
227
|
+
ipMaxAttempts: z.integer().min(1).describe("Max failed login attempts per IP before temporary lockout").default(15),
|
|
228
|
+
accountMaxAttempts: z.integer().min(1).describe("Max failed login attempts per account before temporary lockout").default(5),
|
|
229
|
+
windowMs: z.integer().min(1e3).describe("Rate limit window duration in milliseconds").default(900 * 1e3)
|
|
251
230
|
}),
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
minimum: 1e3
|
|
255
|
-
})) })
|
|
231
|
+
registrationIpMaxAttempts: z.integer().min(1).describe("Max registration attempts per IP before temporary lockout. Default 10 protects against signup abuse; raise it in dev/e2e environments where a single localhost IP spawns many test users.").default(10),
|
|
232
|
+
refreshToken: z.object({ expirationIdle: z.integer().min(1e3).describe("Maximum time in milliseconds a refresh token may stay unused before being invalidated. When set, sessions whose last refresh is older than this window are rejected and deleted, even if the absolute `expiresAt` has not been reached. Recommended for SaaS auth posture (SOC2/ISO27001). Leave undefined to disable idle invalidation (default).").optional() })
|
|
256
233
|
}),
|
|
257
234
|
default: {
|
|
258
235
|
registrationAllowed: true,
|
|
@@ -289,13 +266,13 @@ const realmAuthSettingsAtom = $atom({
|
|
|
289
266
|
//#region ../../src/api/users/entities/sessions.ts
|
|
290
267
|
const sessions = $entity({
|
|
291
268
|
name: "sessions",
|
|
292
|
-
schema:
|
|
293
|
-
id: db.primaryKey(
|
|
269
|
+
schema: z.object({
|
|
270
|
+
id: db.primaryKey(z.uuid()),
|
|
294
271
|
version: db.version(),
|
|
295
272
|
createdAt: db.createdAt(),
|
|
296
273
|
updatedAt: db.updatedAt(),
|
|
297
|
-
refreshToken:
|
|
298
|
-
userId: db.ref(
|
|
274
|
+
refreshToken: z.uuid(),
|
|
275
|
+
userId: db.ref(z.uuid(), () => users.cols.id),
|
|
299
276
|
/**
|
|
300
277
|
* OAuth client this session was minted for, when it was created via the
|
|
301
278
|
* OAuth 2.1 authorization flow — the `client_id` of an `oauth_clients`
|
|
@@ -303,30 +280,30 @@ const sessions = $entity({
|
|
|
303
280
|
* key: `sessions` is a core entity and must not depend on the optional
|
|
304
281
|
* OAuth module's table; the join to `oauth_clients` is done at query time.
|
|
305
282
|
*/
|
|
306
|
-
clientId:
|
|
307
|
-
expiresAt:
|
|
283
|
+
clientId: z.text({ maxLength: 64 }).optional(),
|
|
284
|
+
expiresAt: z.datetime(),
|
|
308
285
|
/**
|
|
309
286
|
* Last time the session was used to refresh an access token.
|
|
310
287
|
* Used by realm `refreshToken.expirationIdle` to invalidate idle sessions.
|
|
311
288
|
* `null` on existing rows pre-migration — falls back to `createdAt`.
|
|
312
289
|
*/
|
|
313
|
-
lastUsedAt:
|
|
314
|
-
ip:
|
|
290
|
+
lastUsedAt: z.datetime().optional(),
|
|
291
|
+
ip: z.text().optional(),
|
|
315
292
|
/**
|
|
316
293
|
* ISO 3166-1 alpha-2 country code derived from the request geo headers
|
|
317
294
|
* (`cf-ipcountry` on Cloudflare, CDN equivalents elsewhere) at login time.
|
|
318
295
|
* `null` on pre-migration rows and where geo isn't available.
|
|
319
296
|
*/
|
|
320
|
-
country:
|
|
321
|
-
userAgent:
|
|
322
|
-
os:
|
|
323
|
-
browser:
|
|
324
|
-
device:
|
|
297
|
+
country: z.text({ maxLength: 2 }).optional(),
|
|
298
|
+
userAgent: z.object({
|
|
299
|
+
os: z.text(),
|
|
300
|
+
browser: z.text(),
|
|
301
|
+
device: z.enum([
|
|
325
302
|
"MOBILE",
|
|
326
303
|
"DESKTOP",
|
|
327
304
|
"TABLET"
|
|
328
305
|
])
|
|
329
|
-
}))
|
|
306
|
+
}).optional()
|
|
330
307
|
}),
|
|
331
308
|
indexes: [
|
|
332
309
|
"userId",
|
|
@@ -493,6 +470,7 @@ var AdminIdentityController = class {
|
|
|
493
470
|
url = "/identities";
|
|
494
471
|
group = "admin:identities";
|
|
495
472
|
identityService = $inject(IdentityService);
|
|
473
|
+
securityProvider = $inject(SecurityProvider);
|
|
496
474
|
/**
|
|
497
475
|
* Find identities with pagination and filtering.
|
|
498
476
|
*/
|
|
@@ -502,12 +480,12 @@ var AdminIdentityController = class {
|
|
|
502
480
|
use: [$secure({ permissions: ["admin:identity:read"] })],
|
|
503
481
|
description: "Find identities with pagination and filtering",
|
|
504
482
|
schema: {
|
|
505
|
-
query:
|
|
506
|
-
response:
|
|
483
|
+
query: identityQuerySchema.extend({ userRealmName: z.string().optional() }),
|
|
484
|
+
response: z.page(identityResourceSchema)
|
|
507
485
|
},
|
|
508
|
-
handler: ({ query }) => {
|
|
486
|
+
handler: ({ query, user }) => {
|
|
509
487
|
const { userRealmName, ...q } = query;
|
|
510
|
-
return this.identityService.findIdentities(q, userRealmName);
|
|
488
|
+
return this.identityService.findIdentities(q, this.securityProvider.assertRealmScope(user, userRealmName));
|
|
511
489
|
}
|
|
512
490
|
});
|
|
513
491
|
/**
|
|
@@ -519,11 +497,11 @@ var AdminIdentityController = class {
|
|
|
519
497
|
use: [$secure({ permissions: ["admin:identity:read"] })],
|
|
520
498
|
description: "Get an identity by ID",
|
|
521
499
|
schema: {
|
|
522
|
-
params:
|
|
523
|
-
query:
|
|
500
|
+
params: z.object({ id: z.uuid() }),
|
|
501
|
+
query: z.object({ userRealmName: z.string().optional() }),
|
|
524
502
|
response: identityResourceSchema
|
|
525
503
|
},
|
|
526
|
-
handler: ({ params, query }) => this.identityService.getIdentityById(params.id, query.userRealmName)
|
|
504
|
+
handler: ({ params, query, user }) => this.identityService.getIdentityById(params.id, this.securityProvider.assertRealmScope(user, query.userRealmName))
|
|
527
505
|
});
|
|
528
506
|
/**
|
|
529
507
|
* Delete an identity.
|
|
@@ -535,12 +513,12 @@ var AdminIdentityController = class {
|
|
|
535
513
|
use: [$secure({ permissions: ["admin:identity:delete"] })],
|
|
536
514
|
description: "Delete an identity",
|
|
537
515
|
schema: {
|
|
538
|
-
params:
|
|
539
|
-
query:
|
|
516
|
+
params: z.object({ id: z.uuid() }),
|
|
517
|
+
query: z.object({ userRealmName: z.string().optional() }),
|
|
540
518
|
response: okSchema
|
|
541
519
|
},
|
|
542
|
-
handler: async ({ params, query }) => {
|
|
543
|
-
await this.identityService.deleteIdentity(params.id, query.userRealmName);
|
|
520
|
+
handler: async ({ params, query, user }) => {
|
|
521
|
+
await this.identityService.deleteIdentity(params.id, this.securityProvider.assertRealmScope(user, query.userRealmName));
|
|
544
522
|
return {
|
|
545
523
|
ok: true,
|
|
546
524
|
id: params.id
|
|
@@ -550,7 +528,7 @@ var AdminIdentityController = class {
|
|
|
550
528
|
};
|
|
551
529
|
//#endregion
|
|
552
530
|
//#region ../../src/api/users/schemas/sessionQuerySchema.ts
|
|
553
|
-
const sessionQuerySchema =
|
|
531
|
+
const sessionQuerySchema = pageQuerySchema.extend({ userId: z.uuid().optional() });
|
|
554
532
|
//#endregion
|
|
555
533
|
//#region ../../src/api/users/schemas/sessionResourceSchema.ts
|
|
556
534
|
/**
|
|
@@ -559,36 +537,36 @@ const sessionQuerySchema = t.extend(pageQuerySchema, { userId: t.optional(t.uuid
|
|
|
559
537
|
* back via a left join, so it's optional (a session whose user was deleted
|
|
560
538
|
* still returns; `user` is undefined).
|
|
561
539
|
*/
|
|
562
|
-
const sessionUserSummarySchema =
|
|
563
|
-
id:
|
|
564
|
-
email:
|
|
565
|
-
username:
|
|
540
|
+
const sessionUserSummarySchema = z.object({
|
|
541
|
+
id: z.uuid(),
|
|
542
|
+
email: z.string().meta({ format: "email" }).optional(),
|
|
543
|
+
username: z.shortText({
|
|
566
544
|
minLength: 3,
|
|
567
545
|
maxLength: 30
|
|
568
|
-
})),
|
|
569
|
-
firstName:
|
|
570
|
-
lastName:
|
|
546
|
+
}).optional(),
|
|
547
|
+
firstName: z.string().optional(),
|
|
548
|
+
lastName: z.string().optional()
|
|
571
549
|
});
|
|
572
|
-
const sessionResourceSchema =
|
|
573
|
-
id:
|
|
574
|
-
version:
|
|
575
|
-
createdAt:
|
|
576
|
-
updatedAt:
|
|
577
|
-
refreshToken:
|
|
578
|
-
userId:
|
|
579
|
-
expiresAt:
|
|
580
|
-
ip:
|
|
581
|
-
country:
|
|
582
|
-
userAgent:
|
|
583
|
-
os:
|
|
584
|
-
browser:
|
|
585
|
-
device:
|
|
550
|
+
const sessionResourceSchema = z.object({
|
|
551
|
+
id: z.uuid(),
|
|
552
|
+
version: z.number(),
|
|
553
|
+
createdAt: z.datetime(),
|
|
554
|
+
updatedAt: z.datetime(),
|
|
555
|
+
refreshToken: z.uuid(),
|
|
556
|
+
userId: z.uuid(),
|
|
557
|
+
expiresAt: z.datetime(),
|
|
558
|
+
ip: z.string().optional(),
|
|
559
|
+
country: z.string().optional(),
|
|
560
|
+
userAgent: z.object({
|
|
561
|
+
os: z.string(),
|
|
562
|
+
browser: z.string(),
|
|
563
|
+
device: z.enum([
|
|
586
564
|
"MOBILE",
|
|
587
565
|
"DESKTOP",
|
|
588
566
|
"TABLET"
|
|
589
567
|
])
|
|
590
|
-
})),
|
|
591
|
-
user:
|
|
568
|
+
}).optional(),
|
|
569
|
+
user: sessionUserSummarySchema.optional()
|
|
592
570
|
});
|
|
593
571
|
//#endregion
|
|
594
572
|
//#region ../../src/api/users/services/SessionCrudService.ts
|
|
@@ -679,6 +657,7 @@ var AdminSessionController = class {
|
|
|
679
657
|
url = "/sessions";
|
|
680
658
|
group = "admin:sessions";
|
|
681
659
|
sessionService = $inject(SessionCrudService);
|
|
660
|
+
securityProvider = $inject(SecurityProvider);
|
|
682
661
|
/**
|
|
683
662
|
* Find sessions with pagination and filtering.
|
|
684
663
|
*/
|
|
@@ -688,12 +667,12 @@ var AdminSessionController = class {
|
|
|
688
667
|
use: [$secure({ permissions: ["admin:session:read"] })],
|
|
689
668
|
description: "Find sessions with pagination and filtering",
|
|
690
669
|
schema: {
|
|
691
|
-
query:
|
|
692
|
-
response:
|
|
670
|
+
query: sessionQuerySchema.extend({ userRealmName: z.string().optional() }),
|
|
671
|
+
response: z.page(sessionResourceSchema)
|
|
693
672
|
},
|
|
694
|
-
handler: ({ query }) => {
|
|
673
|
+
handler: ({ query, user }) => {
|
|
695
674
|
const { userRealmName, ...q } = query;
|
|
696
|
-
return this.sessionService.findSessions(q, userRealmName);
|
|
675
|
+
return this.sessionService.findSessions(q, this.securityProvider.assertRealmScope(user, userRealmName));
|
|
697
676
|
}
|
|
698
677
|
});
|
|
699
678
|
/**
|
|
@@ -705,11 +684,11 @@ var AdminSessionController = class {
|
|
|
705
684
|
use: [$secure({ permissions: ["admin:session:read"] })],
|
|
706
685
|
description: "Get a session by ID",
|
|
707
686
|
schema: {
|
|
708
|
-
params:
|
|
709
|
-
query:
|
|
687
|
+
params: z.object({ id: z.uuid() }),
|
|
688
|
+
query: z.object({ userRealmName: z.string().optional() }),
|
|
710
689
|
response: sessionResourceSchema
|
|
711
690
|
},
|
|
712
|
-
handler: ({ params, query }) => this.sessionService.getSessionById(params.id, query.userRealmName)
|
|
691
|
+
handler: ({ params, query, user }) => this.sessionService.getSessionById(params.id, this.securityProvider.assertRealmScope(user, query.userRealmName))
|
|
713
692
|
});
|
|
714
693
|
/**
|
|
715
694
|
* Delete a session.
|
|
@@ -721,12 +700,12 @@ var AdminSessionController = class {
|
|
|
721
700
|
use: [$secure({ permissions: ["admin:session:delete"] })],
|
|
722
701
|
description: "Delete a session",
|
|
723
702
|
schema: {
|
|
724
|
-
params:
|
|
725
|
-
query:
|
|
703
|
+
params: z.object({ id: z.uuid() }),
|
|
704
|
+
query: z.object({ userRealmName: z.string().optional() }),
|
|
726
705
|
response: okSchema
|
|
727
706
|
},
|
|
728
|
-
handler: async ({ params, query }) => {
|
|
729
|
-
await this.sessionService.deleteSession(params.id, query.userRealmName);
|
|
707
|
+
handler: async ({ params, query, user }) => {
|
|
708
|
+
await this.sessionService.deleteSession(params.id, this.securityProvider.assertRealmScope(user, query.userRealmName));
|
|
730
709
|
return {
|
|
731
710
|
ok: true,
|
|
732
711
|
id: params.id
|
|
@@ -743,43 +722,40 @@ var AdminSessionController = class {
|
|
|
743
722
|
use: [$secure({ permissions: ["admin:session:delete"] })],
|
|
744
723
|
description: "Delete many sessions",
|
|
745
724
|
schema: {
|
|
746
|
-
query:
|
|
747
|
-
body:
|
|
748
|
-
|
|
749
|
-
maxItems: 1e3
|
|
750
|
-
}) }),
|
|
751
|
-
response: t.object({ deleted: t.array(t.string()) })
|
|
725
|
+
query: z.object({ userRealmName: z.string().optional() }),
|
|
726
|
+
body: z.object({ ids: z.array(z.uuid()).min(1).max(1e3) }),
|
|
727
|
+
response: z.object({ deleted: z.array(z.string()) })
|
|
752
728
|
},
|
|
753
|
-
handler: async ({ body, query }) => {
|
|
754
|
-
return { deleted: await this.sessionService.deleteSessions(body.ids, query.userRealmName) };
|
|
729
|
+
handler: async ({ body, query, user }) => {
|
|
730
|
+
return { deleted: await this.sessionService.deleteSessions(body.ids, this.securityProvider.assertRealmScope(user, query.userRealmName)) };
|
|
755
731
|
}
|
|
756
732
|
});
|
|
757
733
|
};
|
|
758
734
|
//#endregion
|
|
759
735
|
//#region ../../src/api/users/schemas/createUserSchema.ts
|
|
760
|
-
const createUserSchema =
|
|
736
|
+
const createUserSchema = users.insertSchema.omit({ realm: true });
|
|
761
737
|
//#endregion
|
|
762
738
|
//#region ../../src/api/users/schemas/updateUserSchema.ts
|
|
763
|
-
const updateUserSchema =
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
739
|
+
const updateUserSchema = users.insertSchema.omit({
|
|
740
|
+
id: true,
|
|
741
|
+
version: true,
|
|
742
|
+
createdAt: true,
|
|
743
|
+
updatedAt: true
|
|
744
|
+
}).partial();
|
|
769
745
|
//#endregion
|
|
770
746
|
//#region ../../src/api/users/schemas/userQuerySchema.ts
|
|
771
|
-
const userQuerySchema =
|
|
747
|
+
const userQuerySchema = pageQuerySchema.extend({
|
|
772
748
|
/**
|
|
773
749
|
* Free-text search applied (case-insensitive) across `email`,
|
|
774
750
|
* `username`, `firstName`, and `lastName`. Matches with a leading and
|
|
775
751
|
* trailing wildcard, so `?search=foo` finds any user whose email,
|
|
776
752
|
* username, or name contains `foo`.
|
|
777
753
|
*/
|
|
778
|
-
search:
|
|
779
|
-
email:
|
|
780
|
-
enabled:
|
|
781
|
-
emailVerified:
|
|
782
|
-
roles:
|
|
754
|
+
search: z.string().optional(),
|
|
755
|
+
email: z.string().optional(),
|
|
756
|
+
enabled: z.boolean().optional(),
|
|
757
|
+
emailVerified: z.boolean().optional(),
|
|
758
|
+
roles: z.array(z.string()).optional()
|
|
783
759
|
});
|
|
784
760
|
//#endregion
|
|
785
761
|
//#region ../../src/api/users/schemas/userResourceSchema.ts
|
|
@@ -808,10 +784,25 @@ var UserNotifications = class {
|
|
|
808
784
|
<p>Best regards,<br>The Team</p>
|
|
809
785
|
`
|
|
810
786
|
},
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
787
|
+
translations: { fr: { email: {
|
|
788
|
+
subject: "Réinitialisez votre mot de passe",
|
|
789
|
+
body: (it) => `
|
|
790
|
+
<h1>Réinitialisez votre mot de passe</h1>
|
|
791
|
+
<p>Bonjour,</p>
|
|
792
|
+
<p>Nous avons reçu une demande de réinitialisation de votre mot de passe. Utilisez le code ci-dessous pour confirmer votre identité :</p>
|
|
793
|
+
<p style="margin: 30px 0; text-align: center;">
|
|
794
|
+
<span style="font-size: 32px; font-weight: bold; letter-spacing: 8px; font-family: monospace; background-color: #f5f5f5; padding: 16px 24px; border-radius: 8px; display: inline-block;">
|
|
795
|
+
${it.code}
|
|
796
|
+
</span>
|
|
797
|
+
</p>
|
|
798
|
+
<p>Ce code expire dans ${it.expiresInMinutes} minutes.</p>
|
|
799
|
+
<p>Si vous n'avez pas demandé de réinitialisation, vous pouvez ignorer cet e-mail : votre mot de passe restera inchangé.</p>
|
|
800
|
+
`
|
|
801
|
+
} } },
|
|
802
|
+
schema: z.object({
|
|
803
|
+
email: z.string().meta({ format: "email" }),
|
|
804
|
+
code: z.string(),
|
|
805
|
+
expiresInMinutes: z.number()
|
|
815
806
|
})
|
|
816
807
|
});
|
|
817
808
|
emailVerification = $notification({
|
|
@@ -835,10 +826,25 @@ var UserNotifications = class {
|
|
|
835
826
|
<p>Best regards,<br>The Team</p>
|
|
836
827
|
`
|
|
837
828
|
},
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
829
|
+
translations: { fr: { email: {
|
|
830
|
+
subject: "Vérifiez votre adresse e-mail",
|
|
831
|
+
body: (it) => `
|
|
832
|
+
<h1>Vérifiez votre adresse e-mail</h1>
|
|
833
|
+
<p>Bonjour,</p>
|
|
834
|
+
<p>Merci de votre inscription ! Utilisez le code ci-dessous pour vérifier votre adresse e-mail :</p>
|
|
835
|
+
<p style="margin: 30px 0; text-align: center;">
|
|
836
|
+
<span style="font-size: 32px; font-weight: bold; letter-spacing: 8px; font-family: monospace; background-color: #f5f5f5; padding: 16px 24px; border-radius: 8px; display: inline-block;">
|
|
837
|
+
${it.code}
|
|
838
|
+
</span>
|
|
839
|
+
</p>
|
|
840
|
+
<p>Ce code expire dans ${it.expiresInMinutes} minutes.</p>
|
|
841
|
+
<p>Si vous n'avez pas créé de compte, ignorez cet e-mail.</p>
|
|
842
|
+
`
|
|
843
|
+
} } },
|
|
844
|
+
schema: z.object({
|
|
845
|
+
email: z.string().meta({ format: "email" }),
|
|
846
|
+
code: z.string(),
|
|
847
|
+
expiresInMinutes: z.number()
|
|
842
848
|
})
|
|
843
849
|
});
|
|
844
850
|
phoneVerification = $notification({
|
|
@@ -847,10 +853,10 @@ var UserNotifications = class {
|
|
|
847
853
|
critical: true,
|
|
848
854
|
sensitive: true,
|
|
849
855
|
sms: { message: (it) => `Your verification code is: ${it.code}. This code expires in ${it.expiresInMinutes} minutes.` },
|
|
850
|
-
schema:
|
|
851
|
-
phoneNumber:
|
|
852
|
-
code:
|
|
853
|
-
expiresInMinutes:
|
|
856
|
+
schema: z.object({
|
|
857
|
+
phoneNumber: z.string(),
|
|
858
|
+
code: z.string(),
|
|
859
|
+
expiresInMinutes: z.number()
|
|
854
860
|
})
|
|
855
861
|
});
|
|
856
862
|
passwordResetLink = $notification({
|
|
@@ -876,10 +882,10 @@ var UserNotifications = class {
|
|
|
876
882
|
<p>Best regards,<br>The Team</p>
|
|
877
883
|
`
|
|
878
884
|
},
|
|
879
|
-
schema:
|
|
880
|
-
email:
|
|
881
|
-
resetUrl:
|
|
882
|
-
expiresInMinutes:
|
|
885
|
+
schema: z.object({
|
|
886
|
+
email: z.string().meta({ format: "email" }),
|
|
887
|
+
resetUrl: z.string(),
|
|
888
|
+
expiresInMinutes: z.number()
|
|
883
889
|
})
|
|
884
890
|
});
|
|
885
891
|
accountLockout = $notification({
|
|
@@ -898,9 +904,19 @@ var UserNotifications = class {
|
|
|
898
904
|
<p>Best regards,<br>The Team</p>
|
|
899
905
|
`
|
|
900
906
|
},
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
907
|
+
translations: { fr: { email: {
|
|
908
|
+
subject: "Compte temporairement verrouillé",
|
|
909
|
+
body: (it) => `
|
|
910
|
+
<h1>Compte temporairement verrouillé</h1>
|
|
911
|
+
<p>Bonjour,</p>
|
|
912
|
+
<p>Votre compte a été temporairement verrouillé suite à un trop grand nombre de tentatives de connexion échouées.</p>
|
|
913
|
+
<p>Si c'était bien vous, patientez ${it.lockoutMinutes} minutes avant de réessayer. Mot de passe oublié ? Utilisez la réinitialisation de mot de passe.</p>
|
|
914
|
+
<p>Si ce n'était pas vous, quelqu'un essaie peut-être d'accéder à votre compte. Nous vous recommandons de changer votre mot de passe au plus vite.</p>
|
|
915
|
+
`
|
|
916
|
+
} } },
|
|
917
|
+
schema: z.object({
|
|
918
|
+
email: z.string().meta({ format: "email" }),
|
|
919
|
+
lockoutMinutes: z.number()
|
|
904
920
|
})
|
|
905
921
|
});
|
|
906
922
|
emailVerificationLink = $notification({
|
|
@@ -926,10 +942,10 @@ var UserNotifications = class {
|
|
|
926
942
|
<p>Best regards,<br>The Team</p>
|
|
927
943
|
`
|
|
928
944
|
},
|
|
929
|
-
schema:
|
|
930
|
-
email:
|
|
931
|
-
verifyUrl:
|
|
932
|
-
expiresInMinutes:
|
|
945
|
+
schema: z.object({
|
|
946
|
+
email: z.string().meta({ format: "email" }),
|
|
947
|
+
verifyUrl: z.string(),
|
|
948
|
+
expiresInMinutes: z.number()
|
|
933
949
|
})
|
|
934
950
|
});
|
|
935
951
|
};
|
|
@@ -939,6 +955,7 @@ var UserService = class {
|
|
|
939
955
|
alepha = $inject(Alepha);
|
|
940
956
|
log = $logger();
|
|
941
957
|
verificationController = $client();
|
|
958
|
+
verificationService = $inject(VerificationService);
|
|
942
959
|
realmProvider = $inject(RealmProvider);
|
|
943
960
|
cryptoProvider = $inject(CryptoProvider);
|
|
944
961
|
userAudits(realmName) {
|
|
@@ -976,9 +993,9 @@ var UserService = class {
|
|
|
976
993
|
return true;
|
|
977
994
|
}
|
|
978
995
|
try {
|
|
979
|
-
const verification = await this.
|
|
980
|
-
|
|
981
|
-
|
|
996
|
+
const verification = await this.verificationService.createVerification({
|
|
997
|
+
type: method,
|
|
998
|
+
target: email
|
|
982
999
|
});
|
|
983
1000
|
if (method === "link") {
|
|
984
1001
|
const realmSettings = await this.realmProvider.getRealm(userRealmName).getSettings();
|
|
@@ -1306,15 +1323,15 @@ var AdminUserController = class {
|
|
|
1306
1323
|
use: [$secure({ permissions: ["admin:user:read"] })],
|
|
1307
1324
|
description: "List roles available in a realm",
|
|
1308
1325
|
schema: {
|
|
1309
|
-
query:
|
|
1310
|
-
response:
|
|
1311
|
-
name:
|
|
1312
|
-
default:
|
|
1313
|
-
description:
|
|
1326
|
+
query: z.object({ userRealmName: z.string().optional() }),
|
|
1327
|
+
response: z.array(z.object({
|
|
1328
|
+
name: z.string(),
|
|
1329
|
+
default: z.boolean().optional(),
|
|
1330
|
+
description: z.string().optional()
|
|
1314
1331
|
}))
|
|
1315
1332
|
},
|
|
1316
|
-
handler: ({ query }) => {
|
|
1317
|
-
return this.securityProvider.getRoles(query.userRealmName).map((r) => ({
|
|
1333
|
+
handler: ({ query, user }) => {
|
|
1334
|
+
return this.securityProvider.getRoles(this.securityProvider.assertRealmScope(user, query.userRealmName)).map((r) => ({
|
|
1318
1335
|
name: r.name,
|
|
1319
1336
|
default: r.default,
|
|
1320
1337
|
description: r.description
|
|
@@ -1330,12 +1347,12 @@ var AdminUserController = class {
|
|
|
1330
1347
|
use: [$secure({ permissions: ["admin:user:read"] })],
|
|
1331
1348
|
description: "Find users with pagination and filtering",
|
|
1332
1349
|
schema: {
|
|
1333
|
-
query:
|
|
1334
|
-
response:
|
|
1350
|
+
query: userQuerySchema.extend({ userRealmName: z.string().optional() }),
|
|
1351
|
+
response: z.page(userResourceSchema)
|
|
1335
1352
|
},
|
|
1336
|
-
handler: ({ query }) => {
|
|
1353
|
+
handler: ({ query, user }) => {
|
|
1337
1354
|
const { userRealmName, ...q } = query;
|
|
1338
|
-
return this.userService.findUsers(q, userRealmName);
|
|
1355
|
+
return this.userService.findUsers(q, this.securityProvider.assertRealmScope(user, userRealmName));
|
|
1339
1356
|
}
|
|
1340
1357
|
});
|
|
1341
1358
|
/**
|
|
@@ -1347,11 +1364,11 @@ var AdminUserController = class {
|
|
|
1347
1364
|
use: [$secure({ permissions: ["admin:user:read"] })],
|
|
1348
1365
|
description: "Get a user by ID",
|
|
1349
1366
|
schema: {
|
|
1350
|
-
params:
|
|
1351
|
-
query:
|
|
1367
|
+
params: z.object({ id: z.uuid() }),
|
|
1368
|
+
query: z.object({ userRealmName: z.string().optional() }),
|
|
1352
1369
|
response: userResourceSchema
|
|
1353
1370
|
},
|
|
1354
|
-
handler: ({ params, query }) => this.userService.getUserById(params.id, query.userRealmName)
|
|
1371
|
+
handler: ({ params, query, user }) => this.userService.getUserById(params.id, this.securityProvider.assertRealmScope(user, query.userRealmName))
|
|
1355
1372
|
});
|
|
1356
1373
|
/**
|
|
1357
1374
|
* Create a new user.
|
|
@@ -1363,11 +1380,11 @@ var AdminUserController = class {
|
|
|
1363
1380
|
use: [$secure({ permissions: ["admin:user:create"] })],
|
|
1364
1381
|
description: "Create a new user",
|
|
1365
1382
|
schema: {
|
|
1366
|
-
query:
|
|
1383
|
+
query: z.object({ userRealmName: z.string().optional() }),
|
|
1367
1384
|
body: createUserSchema,
|
|
1368
1385
|
response: userResourceSchema
|
|
1369
1386
|
},
|
|
1370
|
-
handler: ({ body, query }) => this.userService.createUser(body, query.userRealmName)
|
|
1387
|
+
handler: ({ body, query, user }) => this.userService.createUser(body, this.securityProvider.assertRealmScope(user, query.userRealmName))
|
|
1371
1388
|
});
|
|
1372
1389
|
/**
|
|
1373
1390
|
* Update a user.
|
|
@@ -1379,12 +1396,12 @@ var AdminUserController = class {
|
|
|
1379
1396
|
use: [$secure({ permissions: ["admin:user:update"] })],
|
|
1380
1397
|
description: "Update a user",
|
|
1381
1398
|
schema: {
|
|
1382
|
-
params:
|
|
1383
|
-
query:
|
|
1399
|
+
params: z.object({ id: z.uuid() }),
|
|
1400
|
+
query: z.object({ userRealmName: z.string().optional() }),
|
|
1384
1401
|
body: updateUserSchema,
|
|
1385
1402
|
response: userResourceSchema
|
|
1386
1403
|
},
|
|
1387
|
-
handler: ({ params, body, query }) => this.userService.updateUser(params.id, body, query.userRealmName)
|
|
1404
|
+
handler: ({ params, body, query, user }) => this.userService.updateUser(params.id, body, this.securityProvider.assertRealmScope(user, query.userRealmName))
|
|
1388
1405
|
});
|
|
1389
1406
|
/**
|
|
1390
1407
|
* Set (or reset) a user's password. Admin-only flow — does NOT
|
|
@@ -1398,13 +1415,13 @@ var AdminUserController = class {
|
|
|
1398
1415
|
use: [$secure({ permissions: ["admin:user:update"] })],
|
|
1399
1416
|
description: "Set a user's password",
|
|
1400
1417
|
schema: {
|
|
1401
|
-
params:
|
|
1402
|
-
query:
|
|
1403
|
-
body:
|
|
1418
|
+
params: z.object({ id: z.uuid() }),
|
|
1419
|
+
query: z.object({ userRealmName: z.string().optional() }),
|
|
1420
|
+
body: z.object({ password: z.string().min(1) }),
|
|
1404
1421
|
response: okSchema
|
|
1405
1422
|
},
|
|
1406
|
-
handler: async ({ params, body, query }) => {
|
|
1407
|
-
await this.userService.setPassword(params.id, body.password, query.userRealmName);
|
|
1423
|
+
handler: async ({ params, body, query, user }) => {
|
|
1424
|
+
await this.userService.setPassword(params.id, body.password, this.securityProvider.assertRealmScope(user, query.userRealmName));
|
|
1408
1425
|
return {
|
|
1409
1426
|
ok: true,
|
|
1410
1427
|
id: params.id
|
|
@@ -1421,12 +1438,12 @@ var AdminUserController = class {
|
|
|
1421
1438
|
use: [$secure({ permissions: ["admin:user:delete"] })],
|
|
1422
1439
|
description: "Delete a user",
|
|
1423
1440
|
schema: {
|
|
1424
|
-
params:
|
|
1425
|
-
query:
|
|
1441
|
+
params: z.object({ id: z.uuid() }),
|
|
1442
|
+
query: z.object({ userRealmName: z.string().optional() }),
|
|
1426
1443
|
response: okSchema
|
|
1427
1444
|
},
|
|
1428
|
-
handler: async ({ params, query }) => {
|
|
1429
|
-
await this.userService.deleteUser(params.id, query.userRealmName);
|
|
1445
|
+
handler: async ({ params, query, user }) => {
|
|
1446
|
+
await this.userService.deleteUser(params.id, this.securityProvider.assertRealmScope(user, query.userRealmName));
|
|
1430
1447
|
return {
|
|
1431
1448
|
ok: true,
|
|
1432
1449
|
id: params.id
|
|
@@ -1445,17 +1462,15 @@ var AdminUserController = class {
|
|
|
1445
1462
|
use: [$secure({ permissions: ["admin:user:delete"] })],
|
|
1446
1463
|
description: "Delete many users",
|
|
1447
1464
|
schema: {
|
|
1448
|
-
query:
|
|
1449
|
-
body:
|
|
1450
|
-
|
|
1451
|
-
maxItems: 1e3
|
|
1452
|
-
}) }),
|
|
1453
|
-
response: t.object({ deleted: t.array(t.uuid()) })
|
|
1465
|
+
query: z.object({ userRealmName: z.string().optional() }),
|
|
1466
|
+
body: z.object({ ids: z.array(z.uuid()).min(1).max(1e3) }),
|
|
1467
|
+
response: z.object({ deleted: z.array(z.uuid()) })
|
|
1454
1468
|
},
|
|
1455
|
-
handler: async ({ body, query }) => {
|
|
1469
|
+
handler: async ({ body, query, user }) => {
|
|
1470
|
+
const realm = this.securityProvider.assertRealmScope(user, query.userRealmName);
|
|
1456
1471
|
const deleted = [];
|
|
1457
1472
|
for (const id of body.ids) {
|
|
1458
|
-
await this.userService.deleteUser(id,
|
|
1473
|
+
await this.userService.deleteUser(id, realm);
|
|
1459
1474
|
deleted.push(id);
|
|
1460
1475
|
}
|
|
1461
1476
|
return { deleted };
|
|
@@ -1463,12 +1478,110 @@ var AdminUserController = class {
|
|
|
1463
1478
|
});
|
|
1464
1479
|
};
|
|
1465
1480
|
//#endregion
|
|
1481
|
+
//#region ../../src/api/users/controllers/MySessionController.ts
|
|
1482
|
+
/**
|
|
1483
|
+
* A session as exposed to ITS OWNER — `refreshToken` is deliberately
|
|
1484
|
+
* omitted (returning it would let any XSS exfiltrate a long-lived
|
|
1485
|
+
* credential); `current` flags the session backing the calling request.
|
|
1486
|
+
*/
|
|
1487
|
+
const mySessionSchema = z.object({
|
|
1488
|
+
id: z.uuid(),
|
|
1489
|
+
createdAt: z.datetime(),
|
|
1490
|
+
expiresAt: z.datetime(),
|
|
1491
|
+
lastUsedAt: z.datetime().optional(),
|
|
1492
|
+
ip: z.string().optional(),
|
|
1493
|
+
country: z.string().optional(),
|
|
1494
|
+
userAgent: z.object({
|
|
1495
|
+
os: z.string(),
|
|
1496
|
+
browser: z.string(),
|
|
1497
|
+
device: z.enum([
|
|
1498
|
+
"MOBILE",
|
|
1499
|
+
"DESKTOP",
|
|
1500
|
+
"TABLET"
|
|
1501
|
+
])
|
|
1502
|
+
}).optional(),
|
|
1503
|
+
current: z.boolean()
|
|
1504
|
+
});
|
|
1505
|
+
/**
|
|
1506
|
+
* Self-service session management — the "where am I signed in?" page of an
|
|
1507
|
+
* account area. Counterpart of {@link AdminSessionController}, scoped to the
|
|
1508
|
+
* CALLER's own sessions: list them, revoke one (a stolen laptop), or revoke
|
|
1509
|
+
* everything except the current one.
|
|
1510
|
+
*/
|
|
1511
|
+
var MySessionController = class {
|
|
1512
|
+
realmProvider = $inject(RealmProvider);
|
|
1513
|
+
sessions(realm) {
|
|
1514
|
+
return this.realmProvider.sessionRepository(realm);
|
|
1515
|
+
}
|
|
1516
|
+
toMySession(session, currentSessionId) {
|
|
1517
|
+
return {
|
|
1518
|
+
id: session.id,
|
|
1519
|
+
createdAt: session.createdAt,
|
|
1520
|
+
expiresAt: session.expiresAt,
|
|
1521
|
+
lastUsedAt: session.lastUsedAt,
|
|
1522
|
+
ip: session.ip,
|
|
1523
|
+
country: session.country,
|
|
1524
|
+
userAgent: session.userAgent,
|
|
1525
|
+
current: session.id === currentSessionId
|
|
1526
|
+
};
|
|
1527
|
+
}
|
|
1528
|
+
listMySessions = $action({
|
|
1529
|
+
method: "GET",
|
|
1530
|
+
path: "/users/me/sessions",
|
|
1531
|
+
use: [$secure()],
|
|
1532
|
+
description: "List the caller's active sessions",
|
|
1533
|
+
schema: { response: z.array(mySessionSchema) },
|
|
1534
|
+
handler: async ({ user }) => {
|
|
1535
|
+
return (await this.sessions(user.realm).findMany({
|
|
1536
|
+
where: { userId: { eq: user.id } },
|
|
1537
|
+
orderBy: [{
|
|
1538
|
+
column: "createdAt",
|
|
1539
|
+
direction: "desc"
|
|
1540
|
+
}]
|
|
1541
|
+
})).map((s) => this.toMySession(s, user.sessionId));
|
|
1542
|
+
}
|
|
1543
|
+
});
|
|
1544
|
+
deleteMySession = $action({
|
|
1545
|
+
method: "DELETE",
|
|
1546
|
+
path: "/users/me/sessions/:id",
|
|
1547
|
+
use: [$secure()],
|
|
1548
|
+
description: "Revoke one of the caller's sessions",
|
|
1549
|
+
schema: {
|
|
1550
|
+
params: z.object({ id: z.uuid() }),
|
|
1551
|
+
response: z.object({ ok: z.boolean() })
|
|
1552
|
+
},
|
|
1553
|
+
handler: async ({ params, user }) => {
|
|
1554
|
+
const repo = this.sessions(user.realm);
|
|
1555
|
+
const session = await repo.findOne({ where: {
|
|
1556
|
+
id: { eq: params.id },
|
|
1557
|
+
userId: { eq: user.id }
|
|
1558
|
+
} });
|
|
1559
|
+
if (!session) throw new NotFoundError("Session not found");
|
|
1560
|
+
await repo.deleteById(session.id);
|
|
1561
|
+
return { ok: true };
|
|
1562
|
+
}
|
|
1563
|
+
});
|
|
1564
|
+
deleteMyOtherSessions = $action({
|
|
1565
|
+
method: "POST",
|
|
1566
|
+
path: "/users/me/sessions/revoke-others",
|
|
1567
|
+
use: [$secure()],
|
|
1568
|
+
description: "Revoke every caller session except the current one",
|
|
1569
|
+
schema: { response: z.object({ revoked: z.integer() }) },
|
|
1570
|
+
handler: async ({ user }) => {
|
|
1571
|
+
const repo = this.sessions(user.realm);
|
|
1572
|
+
const others = (await repo.findMany({ where: { userId: { eq: user.id } } })).filter((s) => s.id !== user.sessionId);
|
|
1573
|
+
for (const s of others) await repo.deleteById(s.id);
|
|
1574
|
+
return { revoked: others.length };
|
|
1575
|
+
}
|
|
1576
|
+
});
|
|
1577
|
+
};
|
|
1578
|
+
//#endregion
|
|
1466
1579
|
//#region ../../src/api/users/schemas/realmConfigSchema.ts
|
|
1467
|
-
const realmConfigSchema =
|
|
1580
|
+
const realmConfigSchema = z.object({
|
|
1468
1581
|
settings: realmAuthSettingsAtom.schema,
|
|
1469
|
-
realmName:
|
|
1470
|
-
authenticationMethods:
|
|
1471
|
-
captchaSiteKey:
|
|
1582
|
+
realmName: z.string(),
|
|
1583
|
+
authenticationMethods: z.array(authenticationProviderSchema),
|
|
1584
|
+
captchaSiteKey: z.string().describe("Public site key for the captcha widget (when settings.captchaRequired is true)").optional()
|
|
1472
1585
|
});
|
|
1473
1586
|
//#endregion
|
|
1474
1587
|
//#region ../../src/api/users/controllers/RealmController.ts
|
|
@@ -1492,7 +1605,7 @@ var RealmController = class {
|
|
|
1492
1605
|
path: `${this.url}/config`,
|
|
1493
1606
|
use: [$etag()],
|
|
1494
1607
|
schema: {
|
|
1495
|
-
query:
|
|
1608
|
+
query: z.object({ realmName: z.string().optional() }),
|
|
1496
1609
|
response: realmConfigSchema
|
|
1497
1610
|
},
|
|
1498
1611
|
handler: async ({ query }) => {
|
|
@@ -1511,9 +1624,9 @@ var RealmController = class {
|
|
|
1511
1624
|
group: this.group,
|
|
1512
1625
|
path: `${this.url}/check-username`,
|
|
1513
1626
|
schema: {
|
|
1514
|
-
query:
|
|
1515
|
-
body:
|
|
1516
|
-
response:
|
|
1627
|
+
query: z.object({ realmName: z.text().optional() }),
|
|
1628
|
+
body: z.object({ username: z.text() }),
|
|
1629
|
+
response: z.object({ available: z.boolean() })
|
|
1517
1630
|
},
|
|
1518
1631
|
handler: async ({ query, body }) => {
|
|
1519
1632
|
const realmName = query.realmName;
|
|
@@ -1529,21 +1642,18 @@ var RealmController = class {
|
|
|
1529
1642
|
* Requires the intent ID from Phase 1, the verification code,
|
|
1530
1643
|
* and the new password.
|
|
1531
1644
|
*/
|
|
1532
|
-
const completePasswordResetRequestSchema =
|
|
1533
|
-
intentId:
|
|
1534
|
-
code:
|
|
1535
|
-
newPassword:
|
|
1536
|
-
minLength: 8,
|
|
1537
|
-
description: "New password (minimum 8 characters)"
|
|
1538
|
-
})
|
|
1645
|
+
const completePasswordResetRequestSchema = z.object({
|
|
1646
|
+
intentId: z.uuid().describe("The intent ID from createPasswordResetIntent"),
|
|
1647
|
+
code: z.string().describe("6-digit verification code sent via email"),
|
|
1648
|
+
newPassword: z.string().min(8).describe("New password (minimum 8 characters)")
|
|
1539
1649
|
});
|
|
1540
1650
|
//#endregion
|
|
1541
1651
|
//#region ../../src/api/users/schemas/completeRegistrationRequestSchema.ts
|
|
1542
|
-
const completeRegistrationRequestSchema =
|
|
1543
|
-
intentId:
|
|
1544
|
-
emailCode:
|
|
1545
|
-
phoneCode:
|
|
1546
|
-
captchaToken:
|
|
1652
|
+
const completeRegistrationRequestSchema = z.object({
|
|
1653
|
+
intentId: z.uuid().describe("The registration intent ID from the first phase"),
|
|
1654
|
+
emailCode: z.string().describe("Email verification code (if email verification required)").optional(),
|
|
1655
|
+
phoneCode: z.string().describe("Phone verification code (if phone verification required)").optional(),
|
|
1656
|
+
captchaToken: z.string().describe("Captcha token (if captcha required)").optional()
|
|
1547
1657
|
});
|
|
1548
1658
|
//#endregion
|
|
1549
1659
|
//#region ../../src/api/users/schemas/passwordResetIntentResponseSchema.ts
|
|
@@ -1553,9 +1663,9 @@ const completeRegistrationRequestSchema = t.object({
|
|
|
1553
1663
|
* Contains the intent ID needed for Phase 2 completion,
|
|
1554
1664
|
* along with expiration time.
|
|
1555
1665
|
*/
|
|
1556
|
-
const passwordResetIntentResponseSchema =
|
|
1557
|
-
intentId:
|
|
1558
|
-
expiresAt:
|
|
1666
|
+
const passwordResetIntentResponseSchema = z.object({
|
|
1667
|
+
intentId: z.uuid().describe("Unique identifier for this password reset intent"),
|
|
1668
|
+
expiresAt: z.datetime().describe("ISO timestamp when this intent expires")
|
|
1559
1669
|
});
|
|
1560
1670
|
//#endregion
|
|
1561
1671
|
//#region ../../src/api/users/schemas/registerQuerySchema.ts
|
|
@@ -1563,41 +1673,32 @@ const passwordResetIntentResponseSchema = t.object({
|
|
|
1563
1673
|
* Schema for user registration query parameters.
|
|
1564
1674
|
* Allows specifying a custom user realm.
|
|
1565
1675
|
*/
|
|
1566
|
-
const registerQuerySchema =
|
|
1676
|
+
const registerQuerySchema = z.object({ userRealmName: z.text({ description: "The user realm to register the user in (defaults to 'default')" }).optional() });
|
|
1567
1677
|
//#endregion
|
|
1568
1678
|
//#region ../../src/api/users/schemas/registerRequestSchema.ts
|
|
1569
1679
|
/**
|
|
1570
1680
|
* Schema for user registration request body.
|
|
1571
1681
|
* Password is always required, other fields depend on realm settings.
|
|
1572
1682
|
*/
|
|
1573
|
-
const registerRequestSchema =
|
|
1574
|
-
password:
|
|
1575
|
-
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
|
|
1580
|
-
|
|
1581
|
-
|
|
1582
|
-
email: t.optional(t.string({
|
|
1583
|
-
format: "email",
|
|
1584
|
-
description: "User's email address"
|
|
1585
|
-
})),
|
|
1586
|
-
phoneNumber: t.optional(t.string({ description: "User's phone number" })),
|
|
1587
|
-
firstName: t.optional(t.string({ description: "User's first name" })),
|
|
1588
|
-
lastName: t.optional(t.string({ description: "User's last name" })),
|
|
1589
|
-
picture: t.optional(t.string({ description: "User's profile picture URL" })),
|
|
1590
|
-
captchaToken: t.optional(t.string({ description: "Captcha response token (if captcha is required)" }))
|
|
1683
|
+
const registerRequestSchema = z.object({
|
|
1684
|
+
password: z.string().min(8).describe("Password for the account"),
|
|
1685
|
+
username: z.string().min(3).describe("Unique username for the account").optional(),
|
|
1686
|
+
email: z.string().meta({ format: "email" }).describe("User's email address").optional(),
|
|
1687
|
+
phoneNumber: z.string().describe("User's phone number").optional(),
|
|
1688
|
+
firstName: z.string().describe("User's first name").optional(),
|
|
1689
|
+
lastName: z.string().describe("User's last name").optional(),
|
|
1690
|
+
picture: z.string().describe("User's profile picture URL").optional(),
|
|
1691
|
+
captchaToken: z.string().describe("Captcha response token (if captcha is required)").optional()
|
|
1591
1692
|
});
|
|
1592
1693
|
//#endregion
|
|
1593
1694
|
//#region ../../src/api/users/schemas/registrationIntentResponseSchema.ts
|
|
1594
|
-
const registrationIntentResponseSchema =
|
|
1595
|
-
intentId:
|
|
1596
|
-
expectCaptcha:
|
|
1597
|
-
captchaSiteKey:
|
|
1598
|
-
expectEmailVerification:
|
|
1599
|
-
expectPhoneVerification:
|
|
1600
|
-
expiresAt:
|
|
1695
|
+
const registrationIntentResponseSchema = z.object({
|
|
1696
|
+
intentId: z.uuid().describe("Unique identifier for the registration intent"),
|
|
1697
|
+
expectCaptcha: z.boolean().describe("Whether captcha verification is required"),
|
|
1698
|
+
captchaSiteKey: z.string().describe("Public site key the client should render (when expectCaptcha is true)").optional(),
|
|
1699
|
+
expectEmailVerification: z.boolean().describe("Whether email verification is required"),
|
|
1700
|
+
expectPhoneVerification: z.boolean().describe("Whether phone verification is required"),
|
|
1701
|
+
expiresAt: z.datetime().describe("When the registration intent expires")
|
|
1601
1702
|
});
|
|
1602
1703
|
//#endregion
|
|
1603
1704
|
//#region ../../src/api/users/services/CredentialService.ts
|
|
@@ -1992,6 +2093,7 @@ var RegistrationService = class {
|
|
|
1992
2093
|
dateTimeProvider = $inject(DateTimeProvider);
|
|
1993
2094
|
cryptoProvider = $inject(CryptoProvider);
|
|
1994
2095
|
verificationController = $client();
|
|
2096
|
+
verificationService = $inject(VerificationService);
|
|
1995
2097
|
realmProvider = $inject(RealmProvider);
|
|
1996
2098
|
credentialService = $inject(CredentialService);
|
|
1997
2099
|
captchaProvider = $inject(CaptchaProvider);
|
|
@@ -2072,6 +2174,10 @@ var RegistrationService = class {
|
|
|
2072
2174
|
this.log.debug("Registration rejected: phone required", { userRealmName });
|
|
2073
2175
|
throw new BadRequestError("Phone number is required");
|
|
2074
2176
|
}
|
|
2177
|
+
if (realmSettings?.firstNameLastName === "required" && (!body.firstName?.trim() || !body.lastName?.trim())) {
|
|
2178
|
+
this.log.debug("Registration rejected: first/last name required", { userRealmName });
|
|
2179
|
+
throw new BadRequestError("First name and last name are required");
|
|
2180
|
+
}
|
|
2075
2181
|
if (realmSettings?.username === "email") {
|
|
2076
2182
|
if (!body.email) throw new BadRequestError("Email is required to derive a username from email");
|
|
2077
2183
|
const base = this.usernameSlugger.slug(body.email);
|
|
@@ -2244,9 +2350,9 @@ var RegistrationService = class {
|
|
|
2244
2350
|
*/
|
|
2245
2351
|
async sendEmailVerification(email, realmName) {
|
|
2246
2352
|
this.log.debug("Sending email verification code", { email });
|
|
2247
|
-
const verification = await this.
|
|
2248
|
-
|
|
2249
|
-
|
|
2353
|
+
const verification = await this.verificationService.createVerification({
|
|
2354
|
+
type: "code",
|
|
2355
|
+
target: email
|
|
2250
2356
|
});
|
|
2251
2357
|
await this.userNotifications(realmName).emailVerification.push({
|
|
2252
2358
|
contact: email,
|
|
@@ -2264,9 +2370,9 @@ var RegistrationService = class {
|
|
|
2264
2370
|
async sendPhoneVerification(phoneNumber, realmName) {
|
|
2265
2371
|
this.log.debug("Sending phone verification code", { phoneNumber });
|
|
2266
2372
|
try {
|
|
2267
|
-
const verification = await this.
|
|
2268
|
-
|
|
2269
|
-
|
|
2373
|
+
const verification = await this.verificationService.createVerification({
|
|
2374
|
+
type: "code",
|
|
2375
|
+
target: phoneNumber
|
|
2270
2376
|
});
|
|
2271
2377
|
await this.userNotifications(realmName).phoneVerification.push({
|
|
2272
2378
|
contact: phoneNumber,
|
|
@@ -2367,8 +2473,8 @@ var UserController = class {
|
|
|
2367
2473
|
method: "POST",
|
|
2368
2474
|
path: `${this.url}/password-reset`,
|
|
2369
2475
|
schema: {
|
|
2370
|
-
query:
|
|
2371
|
-
body:
|
|
2476
|
+
query: z.object({ userRealmName: z.string().optional() }),
|
|
2477
|
+
body: z.object({ email: z.email() }),
|
|
2372
2478
|
response: passwordResetIntentResponseSchema
|
|
2373
2479
|
},
|
|
2374
2480
|
handler: ({ body, query }) => this.credentialService.createPasswordResetIntent(body.email, query.userRealmName)
|
|
@@ -2397,11 +2503,11 @@ var UserController = class {
|
|
|
2397
2503
|
path: "/users/password-reset/request",
|
|
2398
2504
|
group: this.group,
|
|
2399
2505
|
schema: {
|
|
2400
|
-
query:
|
|
2401
|
-
body:
|
|
2402
|
-
response:
|
|
2403
|
-
success:
|
|
2404
|
-
message:
|
|
2506
|
+
query: z.object({ userRealmName: z.string().optional() }),
|
|
2507
|
+
body: z.object({ email: z.email() }),
|
|
2508
|
+
response: z.object({
|
|
2509
|
+
success: z.boolean(),
|
|
2510
|
+
message: z.string()
|
|
2405
2511
|
})
|
|
2406
2512
|
},
|
|
2407
2513
|
handler: async ({ body, query }) => {
|
|
@@ -2419,14 +2525,14 @@ var UserController = class {
|
|
|
2419
2525
|
path: "/users/password-reset/validate",
|
|
2420
2526
|
group: this.group,
|
|
2421
2527
|
schema: {
|
|
2422
|
-
query:
|
|
2423
|
-
email:
|
|
2424
|
-
token:
|
|
2425
|
-
userRealmName:
|
|
2528
|
+
query: z.object({
|
|
2529
|
+
email: z.email(),
|
|
2530
|
+
token: z.string(),
|
|
2531
|
+
userRealmName: z.string().optional()
|
|
2426
2532
|
}),
|
|
2427
|
-
response:
|
|
2428
|
-
valid:
|
|
2429
|
-
email:
|
|
2533
|
+
response: z.object({
|
|
2534
|
+
valid: z.boolean(),
|
|
2535
|
+
email: z.email().optional()
|
|
2430
2536
|
})
|
|
2431
2537
|
},
|
|
2432
2538
|
handler: async ({ query }) => {
|
|
@@ -2447,15 +2553,15 @@ var UserController = class {
|
|
|
2447
2553
|
path: "/users/password-reset/reset",
|
|
2448
2554
|
group: this.group,
|
|
2449
2555
|
schema: {
|
|
2450
|
-
query:
|
|
2451
|
-
body:
|
|
2452
|
-
email:
|
|
2453
|
-
token:
|
|
2454
|
-
newPassword:
|
|
2556
|
+
query: z.object({ userRealmName: z.string().optional() }),
|
|
2557
|
+
body: z.object({
|
|
2558
|
+
email: z.email(),
|
|
2559
|
+
token: z.string(),
|
|
2560
|
+
newPassword: z.string().min(8)
|
|
2455
2561
|
}),
|
|
2456
|
-
response:
|
|
2457
|
-
success:
|
|
2458
|
-
message:
|
|
2562
|
+
response: z.object({
|
|
2563
|
+
success: z.boolean(),
|
|
2564
|
+
message: z.string()
|
|
2459
2565
|
})
|
|
2460
2566
|
},
|
|
2461
2567
|
handler: async ({ body, query }) => {
|
|
@@ -2476,17 +2582,14 @@ var UserController = class {
|
|
|
2476
2582
|
path: "/users/email-verification/request",
|
|
2477
2583
|
group: this.group,
|
|
2478
2584
|
schema: {
|
|
2479
|
-
query:
|
|
2480
|
-
userRealmName:
|
|
2481
|
-
method:
|
|
2482
|
-
default: "code",
|
|
2483
|
-
description: "Verification method: \"code\" sends a 6-digit code, \"link\" sends a clickable verification link. When using \"link\", configure verifyEmailUrl in realm settings."
|
|
2484
|
-
}))
|
|
2585
|
+
query: z.object({
|
|
2586
|
+
userRealmName: z.string().optional(),
|
|
2587
|
+
method: z.enum(["code", "link"]).describe("Verification method: \"code\" sends a 6-digit code, \"link\" sends a clickable verification link. When using \"link\", configure verifyEmailUrl in realm settings.").default("code").optional()
|
|
2485
2588
|
}),
|
|
2486
|
-
body:
|
|
2487
|
-
response:
|
|
2488
|
-
success:
|
|
2489
|
-
message:
|
|
2589
|
+
body: z.object({ email: z.email() }),
|
|
2590
|
+
response: z.object({
|
|
2591
|
+
success: z.boolean(),
|
|
2592
|
+
message: z.string()
|
|
2490
2593
|
})
|
|
2491
2594
|
},
|
|
2492
2595
|
handler: async ({ body, query }) => {
|
|
@@ -2506,14 +2609,14 @@ var UserController = class {
|
|
|
2506
2609
|
path: "/users/email-verification/verify",
|
|
2507
2610
|
group: this.group,
|
|
2508
2611
|
schema: {
|
|
2509
|
-
query:
|
|
2510
|
-
body:
|
|
2511
|
-
email:
|
|
2512
|
-
token:
|
|
2612
|
+
query: z.object({ userRealmName: z.string().optional() }),
|
|
2613
|
+
body: z.object({
|
|
2614
|
+
email: z.email(),
|
|
2615
|
+
token: z.string()
|
|
2513
2616
|
}),
|
|
2514
|
-
response:
|
|
2515
|
-
success:
|
|
2516
|
-
message:
|
|
2617
|
+
response: z.object({
|
|
2618
|
+
success: z.boolean(),
|
|
2619
|
+
message: z.string()
|
|
2517
2620
|
})
|
|
2518
2621
|
},
|
|
2519
2622
|
handler: async ({ body, query }) => {
|
|
@@ -2532,11 +2635,11 @@ var UserController = class {
|
|
|
2532
2635
|
group: this.group,
|
|
2533
2636
|
use: [$secure()],
|
|
2534
2637
|
schema: {
|
|
2535
|
-
query:
|
|
2536
|
-
email:
|
|
2537
|
-
userRealmName:
|
|
2638
|
+
query: z.object({
|
|
2639
|
+
email: z.email(),
|
|
2640
|
+
userRealmName: z.string().optional()
|
|
2538
2641
|
}),
|
|
2539
|
-
response:
|
|
2642
|
+
response: z.object({ verified: z.boolean() })
|
|
2540
2643
|
},
|
|
2541
2644
|
handler: async ({ query }) => {
|
|
2542
2645
|
return { verified: await this.userService.isEmailVerified(query.email, query.userRealmName) };
|
|
@@ -3222,6 +3325,7 @@ const $realm = (options = {}) => {
|
|
|
3222
3325
|
...options.issuer,
|
|
3223
3326
|
name,
|
|
3224
3327
|
secret: options.secret ?? securityProvider.secretKey,
|
|
3328
|
+
signing: options.signing,
|
|
3225
3329
|
resolvers: customResolvers,
|
|
3226
3330
|
roles: options.issuer?.roles ?? [{
|
|
3227
3331
|
name: "admin",
|
|
@@ -3270,7 +3374,10 @@ const $realm = (options = {}) => {
|
|
|
3270
3374
|
id: user.id,
|
|
3271
3375
|
roles: user.roles,
|
|
3272
3376
|
name: composedName,
|
|
3377
|
+
firstName: user.firstName,
|
|
3378
|
+
lastName: user.lastName,
|
|
3273
3379
|
email: user.email,
|
|
3380
|
+
emailVerified: user.emailVerified,
|
|
3274
3381
|
username: user.username,
|
|
3275
3382
|
picture: user.picture,
|
|
3276
3383
|
organization: user.organizationId ?? void 0,
|
|
@@ -3325,57 +3432,34 @@ const $realm = (options = {}) => {
|
|
|
3325
3432
|
};
|
|
3326
3433
|
//#endregion
|
|
3327
3434
|
//#region ../../src/api/users/schemas/loginSchema.ts
|
|
3328
|
-
const loginSchema =
|
|
3329
|
-
username:
|
|
3435
|
+
const loginSchema = z.object({
|
|
3436
|
+
username: z.text({
|
|
3330
3437
|
minLength: 3,
|
|
3331
3438
|
maxLength: 100,
|
|
3332
3439
|
description: "Username or email address for login"
|
|
3333
3440
|
}),
|
|
3334
|
-
password:
|
|
3441
|
+
password: z.text({
|
|
3335
3442
|
minLength: 8,
|
|
3336
3443
|
description: "User password"
|
|
3337
3444
|
})
|
|
3338
3445
|
});
|
|
3339
3446
|
//#endregion
|
|
3340
3447
|
//#region ../../src/api/users/schemas/registerSchema.ts
|
|
3341
|
-
const registerSchema =
|
|
3342
|
-
username:
|
|
3343
|
-
|
|
3344
|
-
|
|
3345
|
-
|
|
3346
|
-
|
|
3347
|
-
|
|
3348
|
-
email: t.email({ description: "Email address for the new account" }),
|
|
3349
|
-
password: t.string({
|
|
3350
|
-
minLength: 8,
|
|
3351
|
-
description: "Password for the new account"
|
|
3352
|
-
}),
|
|
3353
|
-
confirmPassword: t.string({
|
|
3354
|
-
minLength: 8,
|
|
3355
|
-
description: "Confirmation of the password"
|
|
3356
|
-
}),
|
|
3357
|
-
firstName: t.optional(t.string({
|
|
3358
|
-
maxLength: 100,
|
|
3359
|
-
description: "User's first name"
|
|
3360
|
-
})),
|
|
3361
|
-
lastName: t.optional(t.string({
|
|
3362
|
-
maxLength: 100,
|
|
3363
|
-
description: "User's last name"
|
|
3364
|
-
}))
|
|
3448
|
+
const registerSchema = z.object({
|
|
3449
|
+
username: z.string().min(3).max(20).regex(/^[a-zA-Z0-9_]+$/).describe("Username for the new account"),
|
|
3450
|
+
email: z.email().describe("Email address for the new account"),
|
|
3451
|
+
password: z.string().min(8).describe("Password for the new account"),
|
|
3452
|
+
confirmPassword: z.string().min(8).describe("Confirmation of the password"),
|
|
3453
|
+
firstName: z.string().max(100).describe("User's first name").optional(),
|
|
3454
|
+
lastName: z.string().max(100).describe("User's last name").optional()
|
|
3365
3455
|
});
|
|
3366
3456
|
//#endregion
|
|
3367
3457
|
//#region ../../src/api/users/schemas/resetPasswordSchema.ts
|
|
3368
|
-
const resetPasswordRequestSchema =
|
|
3369
|
-
const resetPasswordSchema =
|
|
3370
|
-
token:
|
|
3371
|
-
password:
|
|
3372
|
-
|
|
3373
|
-
description: "New password"
|
|
3374
|
-
}),
|
|
3375
|
-
confirmPassword: t.string({
|
|
3376
|
-
minLength: 8,
|
|
3377
|
-
description: "Confirmation of the new password"
|
|
3378
|
-
})
|
|
3458
|
+
const resetPasswordRequestSchema = z.object({ email: z.email().describe("Email address to send password reset link") });
|
|
3459
|
+
const resetPasswordSchema = z.object({
|
|
3460
|
+
token: z.string().describe("Password reset token from email"),
|
|
3461
|
+
password: z.string().min(8).describe("New password"),
|
|
3462
|
+
confirmPassword: z.string().min(8).describe("Confirmation of the new password")
|
|
3379
3463
|
});
|
|
3380
3464
|
//#endregion
|
|
3381
3465
|
//#region ../../src/api/users/index.ts
|
|
@@ -3408,6 +3492,7 @@ const AlephaApiUsers = $module({
|
|
|
3408
3492
|
UserController,
|
|
3409
3493
|
AdminUserController,
|
|
3410
3494
|
AdminSessionController,
|
|
3495
|
+
MySessionController,
|
|
3411
3496
|
AdminIdentityController,
|
|
3412
3497
|
RealmController
|
|
3413
3498
|
],
|
|
@@ -3420,6 +3505,6 @@ const AlephaApiUsers = $module({
|
|
|
3420
3505
|
]
|
|
3421
3506
|
});
|
|
3422
3507
|
//#endregion
|
|
3423
|
-
export { $realm, AdminIdentityController, AdminSessionController, AdminUserController, AlephaApiUsers, CredentialService, DEFAULT_USER_REALM_NAME, IdentityService, RealmController, RealmProvider, RegistrationService, SessionAudits, SessionCrudService, SessionService, UserAudits, UserBuckets, UserController, UserJobs, UserNotifications, UserService, UsernameSlugger, completePasswordResetRequestSchema, completeRegistrationRequestSchema, createUserSchema, identities, identityQuerySchema, identityResourceSchema, loginSchema, passwordResetIntentResponseSchema, realmAuthSettingsAtom, realmConfigSchema, registerSchema, registrationIntentResponseSchema, resetPasswordRequestSchema, resetPasswordSchema, sessionQuerySchema, sessionResourceSchema, sessionUserSummarySchema, sessions, updateUserSchema, userQuerySchema, userResourceSchema, users };
|
|
3508
|
+
export { $realm, AdminIdentityController, AdminSessionController, AdminUserController, AlephaApiUsers, CredentialService, DEFAULT_USER_REALM_NAME, IdentityService, MySessionController, RealmController, RealmProvider, RegistrationService, SessionAudits, SessionCrudService, SessionService, UserAudits, UserBuckets, UserController, UserJobs, UserNotifications, UserService, UsernameSlugger, completePasswordResetRequestSchema, completeRegistrationRequestSchema, createUserSchema, identities, identityQuerySchema, identityResourceSchema, loginSchema, mySessionSchema, passwordResetIntentResponseSchema, realmAuthSettingsAtom, realmConfigSchema, registerSchema, registrationIntentResponseSchema, resetPasswordRequestSchema, resetPasswordSchema, sessionQuerySchema, sessionResourceSchema, sessionUserSummarySchema, sessions, updateUserSchema, userQuerySchema, userResourceSchema, users };
|
|
3424
3509
|
|
|
3425
3510
|
//# sourceMappingURL=index.js.map
|