alepha 0.23.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 +247 -235
- 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 -1143
- package/dist/api/users/index.d.ts.map +1 -1
- package/dist/api/users/index.js +456 -392
- 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 +167 -155
- 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 +205 -442
- package/dist/cli/core/index.d.ts.map +1 -1
- package/dist/cli/core/index.js +259 -284
- 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 +8 -34
- package/dist/cli/i18n/index.d.ts.map +1 -1
- package/dist/cli/i18n/index.js +6 -6
- 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 +351 -404
- package/dist/cli/platform-lib/index.d.ts.map +1 -1
- package/dist/cli/platform-lib/index.js +218 -239
- 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 +83 -195
- 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 +27 -90
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +42 -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 -5
- package/dist/react/form/index.d.ts.map +1 -1
- package/dist/react/form/index.js +91 -56
- 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 +4 -5
- package/dist/react/i18n/index.d.ts.map +1 -1
- package/dist/react/i18n/index.js +2 -2
- 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 +60 -24
- package/dist/react/router/index.browser.js.map +1 -1
- package/dist/react/router/index.d.ts +378 -377
- package/dist/react/router/index.d.ts.map +1 -1
- package/dist/react/router/index.js +77 -41
- package/dist/react/router/index.js.map +1 -1
- package/dist/react/sitemap/index.d.ts +0 -1
- package/dist/react/sitemap/index.d.ts.map +1 -1
- package/dist/react/sitemap/index.js.map +1 -1
- 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 +198 -274
- package/dist/server/auth/index.d.ts.map +1 -1
- package/dist/server/auth/index.js +83 -621
- 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 +72 -5
- package/dist/server/cookies/index.d.ts.map +1 -1
- package/dist/server/cookies/index.js +103 -9
- 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 +116 -85
- package/dist/server/core/index.d.ts.map +1 -1
- package/dist/server/core/index.js +105 -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 +22 -35
- 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 -10
- 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 -26
- package/src/api/users/providers/RealmProvider.ts +0 -15
- 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 -24
- 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 -76
- 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 -39
- 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/tasks/BuildCloudflareTask.ts +103 -230
- package/src/cli/core/templates/apiHelloResponseSchemaTs.ts +4 -4
- package/src/cli/devtools/atoms/devtoolsOptions.ts +6 -6
- package/src/cli/i18n/atoms/i18nOptions.ts +8 -8
- 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 +13 -14
- 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 +11 -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/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 +2 -2
- package/src/react/form/__tests__/form-submitting-reactive.browser.spec.tsx +5 -5
- 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 +67 -47
- package/src/react/form/services/parseField.ts +66 -27
- package/src/react/i18n/__tests__/Localize.spec.tsx +1 -1
- package/src/react/i18n/providers/I18nProvider.ts +2 -2
- 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/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/primitives/$page.ts +2 -2
- package/src/react/router/providers/ReactBrowserProvider.ts +64 -13
- package/src/react/router/providers/ReactPageProvider.ts +26 -12
- package/src/react/router/providers/ReactServerProvider.ts +13 -15
- package/src/react/sitemap/__tests__/$sitemap.spec.ts +2 -2
- 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/index.ts +0 -3
- 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 +49 -48
- 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 +14 -14
- 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 +13 -5
- 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 +6 -14
- package/src/server/core/primitives/$action.ts +26 -36
- 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/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/src/server/auth/__tests__/authFederationClient.spec.ts +0 -40
- package/src/server/auth/__tests__/federationAssertion.spec.ts +0 -146
- package/src/server/auth/helpers/federationAssertion.ts +0 -74
- package/src/server/auth/primitives/$authFederationBroker.ts +0 -273
- package/src/server/auth/primitives/$authFederationClient.ts +0 -89
- /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
|
-
import { $authApple, $authCredentials, $authFacebook, $
|
|
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",
|
|
@@ -380,10 +357,6 @@ var RealmProvider = class {
|
|
|
380
357
|
}
|
|
381
358
|
},
|
|
382
359
|
features,
|
|
383
|
-
federated: realmOptions.identities?.federated ? {
|
|
384
|
-
brokerUrl: realmOptions.identities.federated.brokerUrl,
|
|
385
|
-
providers: realmOptions.identities.federated.providers
|
|
386
|
-
} : void 0,
|
|
387
360
|
getSettings: async function() {
|
|
388
361
|
if (this.settingsParameter) return await this.settingsParameter.get();
|
|
389
362
|
return this.settings;
|
|
@@ -497,6 +470,7 @@ var AdminIdentityController = class {
|
|
|
497
470
|
url = "/identities";
|
|
498
471
|
group = "admin:identities";
|
|
499
472
|
identityService = $inject(IdentityService);
|
|
473
|
+
securityProvider = $inject(SecurityProvider);
|
|
500
474
|
/**
|
|
501
475
|
* Find identities with pagination and filtering.
|
|
502
476
|
*/
|
|
@@ -506,12 +480,12 @@ var AdminIdentityController = class {
|
|
|
506
480
|
use: [$secure({ permissions: ["admin:identity:read"] })],
|
|
507
481
|
description: "Find identities with pagination and filtering",
|
|
508
482
|
schema: {
|
|
509
|
-
query:
|
|
510
|
-
response:
|
|
483
|
+
query: identityQuerySchema.extend({ userRealmName: z.string().optional() }),
|
|
484
|
+
response: z.page(identityResourceSchema)
|
|
511
485
|
},
|
|
512
|
-
handler: ({ query }) => {
|
|
486
|
+
handler: ({ query, user }) => {
|
|
513
487
|
const { userRealmName, ...q } = query;
|
|
514
|
-
return this.identityService.findIdentities(q, userRealmName);
|
|
488
|
+
return this.identityService.findIdentities(q, this.securityProvider.assertRealmScope(user, userRealmName));
|
|
515
489
|
}
|
|
516
490
|
});
|
|
517
491
|
/**
|
|
@@ -523,11 +497,11 @@ var AdminIdentityController = class {
|
|
|
523
497
|
use: [$secure({ permissions: ["admin:identity:read"] })],
|
|
524
498
|
description: "Get an identity by ID",
|
|
525
499
|
schema: {
|
|
526
|
-
params:
|
|
527
|
-
query:
|
|
500
|
+
params: z.object({ id: z.uuid() }),
|
|
501
|
+
query: z.object({ userRealmName: z.string().optional() }),
|
|
528
502
|
response: identityResourceSchema
|
|
529
503
|
},
|
|
530
|
-
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))
|
|
531
505
|
});
|
|
532
506
|
/**
|
|
533
507
|
* Delete an identity.
|
|
@@ -539,12 +513,12 @@ var AdminIdentityController = class {
|
|
|
539
513
|
use: [$secure({ permissions: ["admin:identity:delete"] })],
|
|
540
514
|
description: "Delete an identity",
|
|
541
515
|
schema: {
|
|
542
|
-
params:
|
|
543
|
-
query:
|
|
516
|
+
params: z.object({ id: z.uuid() }),
|
|
517
|
+
query: z.object({ userRealmName: z.string().optional() }),
|
|
544
518
|
response: okSchema
|
|
545
519
|
},
|
|
546
|
-
handler: async ({ params, query }) => {
|
|
547
|
-
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));
|
|
548
522
|
return {
|
|
549
523
|
ok: true,
|
|
550
524
|
id: params.id
|
|
@@ -554,7 +528,7 @@ var AdminIdentityController = class {
|
|
|
554
528
|
};
|
|
555
529
|
//#endregion
|
|
556
530
|
//#region ../../src/api/users/schemas/sessionQuerySchema.ts
|
|
557
|
-
const sessionQuerySchema =
|
|
531
|
+
const sessionQuerySchema = pageQuerySchema.extend({ userId: z.uuid().optional() });
|
|
558
532
|
//#endregion
|
|
559
533
|
//#region ../../src/api/users/schemas/sessionResourceSchema.ts
|
|
560
534
|
/**
|
|
@@ -563,36 +537,36 @@ const sessionQuerySchema = t.extend(pageQuerySchema, { userId: t.optional(t.uuid
|
|
|
563
537
|
* back via a left join, so it's optional (a session whose user was deleted
|
|
564
538
|
* still returns; `user` is undefined).
|
|
565
539
|
*/
|
|
566
|
-
const sessionUserSummarySchema =
|
|
567
|
-
id:
|
|
568
|
-
email:
|
|
569
|
-
username:
|
|
540
|
+
const sessionUserSummarySchema = z.object({
|
|
541
|
+
id: z.uuid(),
|
|
542
|
+
email: z.string().meta({ format: "email" }).optional(),
|
|
543
|
+
username: z.shortText({
|
|
570
544
|
minLength: 3,
|
|
571
545
|
maxLength: 30
|
|
572
|
-
})),
|
|
573
|
-
firstName:
|
|
574
|
-
lastName:
|
|
546
|
+
}).optional(),
|
|
547
|
+
firstName: z.string().optional(),
|
|
548
|
+
lastName: z.string().optional()
|
|
575
549
|
});
|
|
576
|
-
const sessionResourceSchema =
|
|
577
|
-
id:
|
|
578
|
-
version:
|
|
579
|
-
createdAt:
|
|
580
|
-
updatedAt:
|
|
581
|
-
refreshToken:
|
|
582
|
-
userId:
|
|
583
|
-
expiresAt:
|
|
584
|
-
ip:
|
|
585
|
-
country:
|
|
586
|
-
userAgent:
|
|
587
|
-
os:
|
|
588
|
-
browser:
|
|
589
|
-
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([
|
|
590
564
|
"MOBILE",
|
|
591
565
|
"DESKTOP",
|
|
592
566
|
"TABLET"
|
|
593
567
|
])
|
|
594
|
-
})),
|
|
595
|
-
user:
|
|
568
|
+
}).optional(),
|
|
569
|
+
user: sessionUserSummarySchema.optional()
|
|
596
570
|
});
|
|
597
571
|
//#endregion
|
|
598
572
|
//#region ../../src/api/users/services/SessionCrudService.ts
|
|
@@ -683,6 +657,7 @@ var AdminSessionController = class {
|
|
|
683
657
|
url = "/sessions";
|
|
684
658
|
group = "admin:sessions";
|
|
685
659
|
sessionService = $inject(SessionCrudService);
|
|
660
|
+
securityProvider = $inject(SecurityProvider);
|
|
686
661
|
/**
|
|
687
662
|
* Find sessions with pagination and filtering.
|
|
688
663
|
*/
|
|
@@ -692,12 +667,12 @@ var AdminSessionController = class {
|
|
|
692
667
|
use: [$secure({ permissions: ["admin:session:read"] })],
|
|
693
668
|
description: "Find sessions with pagination and filtering",
|
|
694
669
|
schema: {
|
|
695
|
-
query:
|
|
696
|
-
response:
|
|
670
|
+
query: sessionQuerySchema.extend({ userRealmName: z.string().optional() }),
|
|
671
|
+
response: z.page(sessionResourceSchema)
|
|
697
672
|
},
|
|
698
|
-
handler: ({ query }) => {
|
|
673
|
+
handler: ({ query, user }) => {
|
|
699
674
|
const { userRealmName, ...q } = query;
|
|
700
|
-
return this.sessionService.findSessions(q, userRealmName);
|
|
675
|
+
return this.sessionService.findSessions(q, this.securityProvider.assertRealmScope(user, userRealmName));
|
|
701
676
|
}
|
|
702
677
|
});
|
|
703
678
|
/**
|
|
@@ -709,11 +684,11 @@ var AdminSessionController = class {
|
|
|
709
684
|
use: [$secure({ permissions: ["admin:session:read"] })],
|
|
710
685
|
description: "Get a session by ID",
|
|
711
686
|
schema: {
|
|
712
|
-
params:
|
|
713
|
-
query:
|
|
687
|
+
params: z.object({ id: z.uuid() }),
|
|
688
|
+
query: z.object({ userRealmName: z.string().optional() }),
|
|
714
689
|
response: sessionResourceSchema
|
|
715
690
|
},
|
|
716
|
-
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))
|
|
717
692
|
});
|
|
718
693
|
/**
|
|
719
694
|
* Delete a session.
|
|
@@ -725,12 +700,12 @@ var AdminSessionController = class {
|
|
|
725
700
|
use: [$secure({ permissions: ["admin:session:delete"] })],
|
|
726
701
|
description: "Delete a session",
|
|
727
702
|
schema: {
|
|
728
|
-
params:
|
|
729
|
-
query:
|
|
703
|
+
params: z.object({ id: z.uuid() }),
|
|
704
|
+
query: z.object({ userRealmName: z.string().optional() }),
|
|
730
705
|
response: okSchema
|
|
731
706
|
},
|
|
732
|
-
handler: async ({ params, query }) => {
|
|
733
|
-
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));
|
|
734
709
|
return {
|
|
735
710
|
ok: true,
|
|
736
711
|
id: params.id
|
|
@@ -747,43 +722,40 @@ var AdminSessionController = class {
|
|
|
747
722
|
use: [$secure({ permissions: ["admin:session:delete"] })],
|
|
748
723
|
description: "Delete many sessions",
|
|
749
724
|
schema: {
|
|
750
|
-
query:
|
|
751
|
-
body:
|
|
752
|
-
|
|
753
|
-
maxItems: 1e3
|
|
754
|
-
}) }),
|
|
755
|
-
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()) })
|
|
756
728
|
},
|
|
757
|
-
handler: async ({ body, query }) => {
|
|
758
|
-
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)) };
|
|
759
731
|
}
|
|
760
732
|
});
|
|
761
733
|
};
|
|
762
734
|
//#endregion
|
|
763
735
|
//#region ../../src/api/users/schemas/createUserSchema.ts
|
|
764
|
-
const createUserSchema =
|
|
736
|
+
const createUserSchema = users.insertSchema.omit({ realm: true });
|
|
765
737
|
//#endregion
|
|
766
738
|
//#region ../../src/api/users/schemas/updateUserSchema.ts
|
|
767
|
-
const updateUserSchema =
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
739
|
+
const updateUserSchema = users.insertSchema.omit({
|
|
740
|
+
id: true,
|
|
741
|
+
version: true,
|
|
742
|
+
createdAt: true,
|
|
743
|
+
updatedAt: true
|
|
744
|
+
}).partial();
|
|
773
745
|
//#endregion
|
|
774
746
|
//#region ../../src/api/users/schemas/userQuerySchema.ts
|
|
775
|
-
const userQuerySchema =
|
|
747
|
+
const userQuerySchema = pageQuerySchema.extend({
|
|
776
748
|
/**
|
|
777
749
|
* Free-text search applied (case-insensitive) across `email`,
|
|
778
750
|
* `username`, `firstName`, and `lastName`. Matches with a leading and
|
|
779
751
|
* trailing wildcard, so `?search=foo` finds any user whose email,
|
|
780
752
|
* username, or name contains `foo`.
|
|
781
753
|
*/
|
|
782
|
-
search:
|
|
783
|
-
email:
|
|
784
|
-
enabled:
|
|
785
|
-
emailVerified:
|
|
786
|
-
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()
|
|
787
759
|
});
|
|
788
760
|
//#endregion
|
|
789
761
|
//#region ../../src/api/users/schemas/userResourceSchema.ts
|
|
@@ -812,10 +784,25 @@ var UserNotifications = class {
|
|
|
812
784
|
<p>Best regards,<br>The Team</p>
|
|
813
785
|
`
|
|
814
786
|
},
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
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()
|
|
819
806
|
})
|
|
820
807
|
});
|
|
821
808
|
emailVerification = $notification({
|
|
@@ -839,10 +826,25 @@ var UserNotifications = class {
|
|
|
839
826
|
<p>Best regards,<br>The Team</p>
|
|
840
827
|
`
|
|
841
828
|
},
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
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()
|
|
846
848
|
})
|
|
847
849
|
});
|
|
848
850
|
phoneVerification = $notification({
|
|
@@ -851,10 +853,10 @@ var UserNotifications = class {
|
|
|
851
853
|
critical: true,
|
|
852
854
|
sensitive: true,
|
|
853
855
|
sms: { message: (it) => `Your verification code is: ${it.code}. This code expires in ${it.expiresInMinutes} minutes.` },
|
|
854
|
-
schema:
|
|
855
|
-
phoneNumber:
|
|
856
|
-
code:
|
|
857
|
-
expiresInMinutes:
|
|
856
|
+
schema: z.object({
|
|
857
|
+
phoneNumber: z.string(),
|
|
858
|
+
code: z.string(),
|
|
859
|
+
expiresInMinutes: z.number()
|
|
858
860
|
})
|
|
859
861
|
});
|
|
860
862
|
passwordResetLink = $notification({
|
|
@@ -880,10 +882,10 @@ var UserNotifications = class {
|
|
|
880
882
|
<p>Best regards,<br>The Team</p>
|
|
881
883
|
`
|
|
882
884
|
},
|
|
883
|
-
schema:
|
|
884
|
-
email:
|
|
885
|
-
resetUrl:
|
|
886
|
-
expiresInMinutes:
|
|
885
|
+
schema: z.object({
|
|
886
|
+
email: z.string().meta({ format: "email" }),
|
|
887
|
+
resetUrl: z.string(),
|
|
888
|
+
expiresInMinutes: z.number()
|
|
887
889
|
})
|
|
888
890
|
});
|
|
889
891
|
accountLockout = $notification({
|
|
@@ -902,9 +904,19 @@ var UserNotifications = class {
|
|
|
902
904
|
<p>Best regards,<br>The Team</p>
|
|
903
905
|
`
|
|
904
906
|
},
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
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()
|
|
908
920
|
})
|
|
909
921
|
});
|
|
910
922
|
emailVerificationLink = $notification({
|
|
@@ -930,10 +942,10 @@ var UserNotifications = class {
|
|
|
930
942
|
<p>Best regards,<br>The Team</p>
|
|
931
943
|
`
|
|
932
944
|
},
|
|
933
|
-
schema:
|
|
934
|
-
email:
|
|
935
|
-
verifyUrl:
|
|
936
|
-
expiresInMinutes:
|
|
945
|
+
schema: z.object({
|
|
946
|
+
email: z.string().meta({ format: "email" }),
|
|
947
|
+
verifyUrl: z.string(),
|
|
948
|
+
expiresInMinutes: z.number()
|
|
937
949
|
})
|
|
938
950
|
});
|
|
939
951
|
};
|
|
@@ -943,6 +955,7 @@ var UserService = class {
|
|
|
943
955
|
alepha = $inject(Alepha);
|
|
944
956
|
log = $logger();
|
|
945
957
|
verificationController = $client();
|
|
958
|
+
verificationService = $inject(VerificationService);
|
|
946
959
|
realmProvider = $inject(RealmProvider);
|
|
947
960
|
cryptoProvider = $inject(CryptoProvider);
|
|
948
961
|
userAudits(realmName) {
|
|
@@ -980,9 +993,9 @@ var UserService = class {
|
|
|
980
993
|
return true;
|
|
981
994
|
}
|
|
982
995
|
try {
|
|
983
|
-
const verification = await this.
|
|
984
|
-
|
|
985
|
-
|
|
996
|
+
const verification = await this.verificationService.createVerification({
|
|
997
|
+
type: method,
|
|
998
|
+
target: email
|
|
986
999
|
});
|
|
987
1000
|
if (method === "link") {
|
|
988
1001
|
const realmSettings = await this.realmProvider.getRealm(userRealmName).getSettings();
|
|
@@ -1310,15 +1323,15 @@ var AdminUserController = class {
|
|
|
1310
1323
|
use: [$secure({ permissions: ["admin:user:read"] })],
|
|
1311
1324
|
description: "List roles available in a realm",
|
|
1312
1325
|
schema: {
|
|
1313
|
-
query:
|
|
1314
|
-
response:
|
|
1315
|
-
name:
|
|
1316
|
-
default:
|
|
1317
|
-
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()
|
|
1318
1331
|
}))
|
|
1319
1332
|
},
|
|
1320
|
-
handler: ({ query }) => {
|
|
1321
|
-
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) => ({
|
|
1322
1335
|
name: r.name,
|
|
1323
1336
|
default: r.default,
|
|
1324
1337
|
description: r.description
|
|
@@ -1334,12 +1347,12 @@ var AdminUserController = class {
|
|
|
1334
1347
|
use: [$secure({ permissions: ["admin:user:read"] })],
|
|
1335
1348
|
description: "Find users with pagination and filtering",
|
|
1336
1349
|
schema: {
|
|
1337
|
-
query:
|
|
1338
|
-
response:
|
|
1350
|
+
query: userQuerySchema.extend({ userRealmName: z.string().optional() }),
|
|
1351
|
+
response: z.page(userResourceSchema)
|
|
1339
1352
|
},
|
|
1340
|
-
handler: ({ query }) => {
|
|
1353
|
+
handler: ({ query, user }) => {
|
|
1341
1354
|
const { userRealmName, ...q } = query;
|
|
1342
|
-
return this.userService.findUsers(q, userRealmName);
|
|
1355
|
+
return this.userService.findUsers(q, this.securityProvider.assertRealmScope(user, userRealmName));
|
|
1343
1356
|
}
|
|
1344
1357
|
});
|
|
1345
1358
|
/**
|
|
@@ -1351,11 +1364,11 @@ var AdminUserController = class {
|
|
|
1351
1364
|
use: [$secure({ permissions: ["admin:user:read"] })],
|
|
1352
1365
|
description: "Get a user by ID",
|
|
1353
1366
|
schema: {
|
|
1354
|
-
params:
|
|
1355
|
-
query:
|
|
1367
|
+
params: z.object({ id: z.uuid() }),
|
|
1368
|
+
query: z.object({ userRealmName: z.string().optional() }),
|
|
1356
1369
|
response: userResourceSchema
|
|
1357
1370
|
},
|
|
1358
|
-
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))
|
|
1359
1372
|
});
|
|
1360
1373
|
/**
|
|
1361
1374
|
* Create a new user.
|
|
@@ -1367,11 +1380,11 @@ var AdminUserController = class {
|
|
|
1367
1380
|
use: [$secure({ permissions: ["admin:user:create"] })],
|
|
1368
1381
|
description: "Create a new user",
|
|
1369
1382
|
schema: {
|
|
1370
|
-
query:
|
|
1383
|
+
query: z.object({ userRealmName: z.string().optional() }),
|
|
1371
1384
|
body: createUserSchema,
|
|
1372
1385
|
response: userResourceSchema
|
|
1373
1386
|
},
|
|
1374
|
-
handler: ({ body, query }) => this.userService.createUser(body, query.userRealmName)
|
|
1387
|
+
handler: ({ body, query, user }) => this.userService.createUser(body, this.securityProvider.assertRealmScope(user, query.userRealmName))
|
|
1375
1388
|
});
|
|
1376
1389
|
/**
|
|
1377
1390
|
* Update a user.
|
|
@@ -1383,12 +1396,12 @@ var AdminUserController = class {
|
|
|
1383
1396
|
use: [$secure({ permissions: ["admin:user:update"] })],
|
|
1384
1397
|
description: "Update a user",
|
|
1385
1398
|
schema: {
|
|
1386
|
-
params:
|
|
1387
|
-
query:
|
|
1399
|
+
params: z.object({ id: z.uuid() }),
|
|
1400
|
+
query: z.object({ userRealmName: z.string().optional() }),
|
|
1388
1401
|
body: updateUserSchema,
|
|
1389
1402
|
response: userResourceSchema
|
|
1390
1403
|
},
|
|
1391
|
-
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))
|
|
1392
1405
|
});
|
|
1393
1406
|
/**
|
|
1394
1407
|
* Set (or reset) a user's password. Admin-only flow — does NOT
|
|
@@ -1402,13 +1415,13 @@ var AdminUserController = class {
|
|
|
1402
1415
|
use: [$secure({ permissions: ["admin:user:update"] })],
|
|
1403
1416
|
description: "Set a user's password",
|
|
1404
1417
|
schema: {
|
|
1405
|
-
params:
|
|
1406
|
-
query:
|
|
1407
|
-
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) }),
|
|
1408
1421
|
response: okSchema
|
|
1409
1422
|
},
|
|
1410
|
-
handler: async ({ params, body, query }) => {
|
|
1411
|
-
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));
|
|
1412
1425
|
return {
|
|
1413
1426
|
ok: true,
|
|
1414
1427
|
id: params.id
|
|
@@ -1425,12 +1438,12 @@ var AdminUserController = class {
|
|
|
1425
1438
|
use: [$secure({ permissions: ["admin:user:delete"] })],
|
|
1426
1439
|
description: "Delete a user",
|
|
1427
1440
|
schema: {
|
|
1428
|
-
params:
|
|
1429
|
-
query:
|
|
1441
|
+
params: z.object({ id: z.uuid() }),
|
|
1442
|
+
query: z.object({ userRealmName: z.string().optional() }),
|
|
1430
1443
|
response: okSchema
|
|
1431
1444
|
},
|
|
1432
|
-
handler: async ({ params, query }) => {
|
|
1433
|
-
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));
|
|
1434
1447
|
return {
|
|
1435
1448
|
ok: true,
|
|
1436
1449
|
id: params.id
|
|
@@ -1449,17 +1462,15 @@ var AdminUserController = class {
|
|
|
1449
1462
|
use: [$secure({ permissions: ["admin:user:delete"] })],
|
|
1450
1463
|
description: "Delete many users",
|
|
1451
1464
|
schema: {
|
|
1452
|
-
query:
|
|
1453
|
-
body:
|
|
1454
|
-
|
|
1455
|
-
maxItems: 1e3
|
|
1456
|
-
}) }),
|
|
1457
|
-
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()) })
|
|
1458
1468
|
},
|
|
1459
|
-
handler: async ({ body, query }) => {
|
|
1469
|
+
handler: async ({ body, query, user }) => {
|
|
1470
|
+
const realm = this.securityProvider.assertRealmScope(user, query.userRealmName);
|
|
1460
1471
|
const deleted = [];
|
|
1461
1472
|
for (const id of body.ids) {
|
|
1462
|
-
await this.userService.deleteUser(id,
|
|
1473
|
+
await this.userService.deleteUser(id, realm);
|
|
1463
1474
|
deleted.push(id);
|
|
1464
1475
|
}
|
|
1465
1476
|
return { deleted };
|
|
@@ -1467,20 +1478,110 @@ var AdminUserController = class {
|
|
|
1467
1478
|
});
|
|
1468
1479
|
};
|
|
1469
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
|
|
1470
1579
|
//#region ../../src/api/users/schemas/realmConfigSchema.ts
|
|
1471
|
-
const realmConfigSchema =
|
|
1580
|
+
const realmConfigSchema = z.object({
|
|
1472
1581
|
settings: realmAuthSettingsAtom.schema,
|
|
1473
|
-
realmName:
|
|
1474
|
-
authenticationMethods:
|
|
1475
|
-
captchaSiteKey:
|
|
1476
|
-
/**
|
|
1477
|
-
* Federated (broker) social login. When present, the login UI renders one
|
|
1478
|
-
* button per provider linking to `{brokerUrl}/auth/federated/start`.
|
|
1479
|
-
*/
|
|
1480
|
-
federated: t.optional(t.object({
|
|
1481
|
-
brokerUrl: t.string({ description: "Broker origin that performs the OIDC dance." }),
|
|
1482
|
-
providers: t.array(t.union([t.const("google"), t.const("apple")]), { description: "Federated providers to surface as login buttons." })
|
|
1483
|
-
}))
|
|
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()
|
|
1484
1585
|
});
|
|
1485
1586
|
//#endregion
|
|
1486
1587
|
//#region ../../src/api/users/controllers/RealmController.ts
|
|
@@ -1504,7 +1605,7 @@ var RealmController = class {
|
|
|
1504
1605
|
path: `${this.url}/config`,
|
|
1505
1606
|
use: [$etag()],
|
|
1506
1607
|
schema: {
|
|
1507
|
-
query:
|
|
1608
|
+
query: z.object({ realmName: z.string().optional() }),
|
|
1508
1609
|
response: realmConfigSchema
|
|
1509
1610
|
},
|
|
1510
1611
|
handler: async ({ query }) => {
|
|
@@ -1515,8 +1616,7 @@ var RealmController = class {
|
|
|
1515
1616
|
settings,
|
|
1516
1617
|
realmName,
|
|
1517
1618
|
authenticationMethods: this.serverAuthProvider.getAuthenticationProviders({ realmName }),
|
|
1518
|
-
captchaSiteKey: settings.captchaRequired ? this.captchaProvider.getSiteKey() : void 0
|
|
1519
|
-
federated: realm.federated
|
|
1619
|
+
captchaSiteKey: settings.captchaRequired ? this.captchaProvider.getSiteKey() : void 0
|
|
1520
1620
|
};
|
|
1521
1621
|
}
|
|
1522
1622
|
});
|
|
@@ -1524,9 +1624,9 @@ var RealmController = class {
|
|
|
1524
1624
|
group: this.group,
|
|
1525
1625
|
path: `${this.url}/check-username`,
|
|
1526
1626
|
schema: {
|
|
1527
|
-
query:
|
|
1528
|
-
body:
|
|
1529
|
-
response:
|
|
1627
|
+
query: z.object({ realmName: z.text().optional() }),
|
|
1628
|
+
body: z.object({ username: z.text() }),
|
|
1629
|
+
response: z.object({ available: z.boolean() })
|
|
1530
1630
|
},
|
|
1531
1631
|
handler: async ({ query, body }) => {
|
|
1532
1632
|
const realmName = query.realmName;
|
|
@@ -1542,21 +1642,18 @@ var RealmController = class {
|
|
|
1542
1642
|
* Requires the intent ID from Phase 1, the verification code,
|
|
1543
1643
|
* and the new password.
|
|
1544
1644
|
*/
|
|
1545
|
-
const completePasswordResetRequestSchema =
|
|
1546
|
-
intentId:
|
|
1547
|
-
code:
|
|
1548
|
-
newPassword:
|
|
1549
|
-
minLength: 8,
|
|
1550
|
-
description: "New password (minimum 8 characters)"
|
|
1551
|
-
})
|
|
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)")
|
|
1552
1649
|
});
|
|
1553
1650
|
//#endregion
|
|
1554
1651
|
//#region ../../src/api/users/schemas/completeRegistrationRequestSchema.ts
|
|
1555
|
-
const completeRegistrationRequestSchema =
|
|
1556
|
-
intentId:
|
|
1557
|
-
emailCode:
|
|
1558
|
-
phoneCode:
|
|
1559
|
-
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()
|
|
1560
1657
|
});
|
|
1561
1658
|
//#endregion
|
|
1562
1659
|
//#region ../../src/api/users/schemas/passwordResetIntentResponseSchema.ts
|
|
@@ -1566,9 +1663,9 @@ const completeRegistrationRequestSchema = t.object({
|
|
|
1566
1663
|
* Contains the intent ID needed for Phase 2 completion,
|
|
1567
1664
|
* along with expiration time.
|
|
1568
1665
|
*/
|
|
1569
|
-
const passwordResetIntentResponseSchema =
|
|
1570
|
-
intentId:
|
|
1571
|
-
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")
|
|
1572
1669
|
});
|
|
1573
1670
|
//#endregion
|
|
1574
1671
|
//#region ../../src/api/users/schemas/registerQuerySchema.ts
|
|
@@ -1576,41 +1673,32 @@ const passwordResetIntentResponseSchema = t.object({
|
|
|
1576
1673
|
* Schema for user registration query parameters.
|
|
1577
1674
|
* Allows specifying a custom user realm.
|
|
1578
1675
|
*/
|
|
1579
|
-
const registerQuerySchema =
|
|
1676
|
+
const registerQuerySchema = z.object({ userRealmName: z.text({ description: "The user realm to register the user in (defaults to 'default')" }).optional() });
|
|
1580
1677
|
//#endregion
|
|
1581
1678
|
//#region ../../src/api/users/schemas/registerRequestSchema.ts
|
|
1582
1679
|
/**
|
|
1583
1680
|
* Schema for user registration request body.
|
|
1584
1681
|
* Password is always required, other fields depend on realm settings.
|
|
1585
1682
|
*/
|
|
1586
|
-
const registerRequestSchema =
|
|
1587
|
-
password:
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
email: t.optional(t.string({
|
|
1596
|
-
format: "email",
|
|
1597
|
-
description: "User's email address"
|
|
1598
|
-
})),
|
|
1599
|
-
phoneNumber: t.optional(t.string({ description: "User's phone number" })),
|
|
1600
|
-
firstName: t.optional(t.string({ description: "User's first name" })),
|
|
1601
|
-
lastName: t.optional(t.string({ description: "User's last name" })),
|
|
1602
|
-
picture: t.optional(t.string({ description: "User's profile picture URL" })),
|
|
1603
|
-
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()
|
|
1604
1692
|
});
|
|
1605
1693
|
//#endregion
|
|
1606
1694
|
//#region ../../src/api/users/schemas/registrationIntentResponseSchema.ts
|
|
1607
|
-
const registrationIntentResponseSchema =
|
|
1608
|
-
intentId:
|
|
1609
|
-
expectCaptcha:
|
|
1610
|
-
captchaSiteKey:
|
|
1611
|
-
expectEmailVerification:
|
|
1612
|
-
expectPhoneVerification:
|
|
1613
|
-
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")
|
|
1614
1702
|
});
|
|
1615
1703
|
//#endregion
|
|
1616
1704
|
//#region ../../src/api/users/services/CredentialService.ts
|
|
@@ -2005,6 +2093,7 @@ var RegistrationService = class {
|
|
|
2005
2093
|
dateTimeProvider = $inject(DateTimeProvider);
|
|
2006
2094
|
cryptoProvider = $inject(CryptoProvider);
|
|
2007
2095
|
verificationController = $client();
|
|
2096
|
+
verificationService = $inject(VerificationService);
|
|
2008
2097
|
realmProvider = $inject(RealmProvider);
|
|
2009
2098
|
credentialService = $inject(CredentialService);
|
|
2010
2099
|
captchaProvider = $inject(CaptchaProvider);
|
|
@@ -2085,6 +2174,10 @@ var RegistrationService = class {
|
|
|
2085
2174
|
this.log.debug("Registration rejected: phone required", { userRealmName });
|
|
2086
2175
|
throw new BadRequestError("Phone number is required");
|
|
2087
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
|
+
}
|
|
2088
2181
|
if (realmSettings?.username === "email") {
|
|
2089
2182
|
if (!body.email) throw new BadRequestError("Email is required to derive a username from email");
|
|
2090
2183
|
const base = this.usernameSlugger.slug(body.email);
|
|
@@ -2257,9 +2350,9 @@ var RegistrationService = class {
|
|
|
2257
2350
|
*/
|
|
2258
2351
|
async sendEmailVerification(email, realmName) {
|
|
2259
2352
|
this.log.debug("Sending email verification code", { email });
|
|
2260
|
-
const verification = await this.
|
|
2261
|
-
|
|
2262
|
-
|
|
2353
|
+
const verification = await this.verificationService.createVerification({
|
|
2354
|
+
type: "code",
|
|
2355
|
+
target: email
|
|
2263
2356
|
});
|
|
2264
2357
|
await this.userNotifications(realmName).emailVerification.push({
|
|
2265
2358
|
contact: email,
|
|
@@ -2277,9 +2370,9 @@ var RegistrationService = class {
|
|
|
2277
2370
|
async sendPhoneVerification(phoneNumber, realmName) {
|
|
2278
2371
|
this.log.debug("Sending phone verification code", { phoneNumber });
|
|
2279
2372
|
try {
|
|
2280
|
-
const verification = await this.
|
|
2281
|
-
|
|
2282
|
-
|
|
2373
|
+
const verification = await this.verificationService.createVerification({
|
|
2374
|
+
type: "code",
|
|
2375
|
+
target: phoneNumber
|
|
2283
2376
|
});
|
|
2284
2377
|
await this.userNotifications(realmName).phoneVerification.push({
|
|
2285
2378
|
contact: phoneNumber,
|
|
@@ -2380,8 +2473,8 @@ var UserController = class {
|
|
|
2380
2473
|
method: "POST",
|
|
2381
2474
|
path: `${this.url}/password-reset`,
|
|
2382
2475
|
schema: {
|
|
2383
|
-
query:
|
|
2384
|
-
body:
|
|
2476
|
+
query: z.object({ userRealmName: z.string().optional() }),
|
|
2477
|
+
body: z.object({ email: z.email() }),
|
|
2385
2478
|
response: passwordResetIntentResponseSchema
|
|
2386
2479
|
},
|
|
2387
2480
|
handler: ({ body, query }) => this.credentialService.createPasswordResetIntent(body.email, query.userRealmName)
|
|
@@ -2410,11 +2503,11 @@ var UserController = class {
|
|
|
2410
2503
|
path: "/users/password-reset/request",
|
|
2411
2504
|
group: this.group,
|
|
2412
2505
|
schema: {
|
|
2413
|
-
query:
|
|
2414
|
-
body:
|
|
2415
|
-
response:
|
|
2416
|
-
success:
|
|
2417
|
-
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()
|
|
2418
2511
|
})
|
|
2419
2512
|
},
|
|
2420
2513
|
handler: async ({ body, query }) => {
|
|
@@ -2432,14 +2525,14 @@ var UserController = class {
|
|
|
2432
2525
|
path: "/users/password-reset/validate",
|
|
2433
2526
|
group: this.group,
|
|
2434
2527
|
schema: {
|
|
2435
|
-
query:
|
|
2436
|
-
email:
|
|
2437
|
-
token:
|
|
2438
|
-
userRealmName:
|
|
2528
|
+
query: z.object({
|
|
2529
|
+
email: z.email(),
|
|
2530
|
+
token: z.string(),
|
|
2531
|
+
userRealmName: z.string().optional()
|
|
2439
2532
|
}),
|
|
2440
|
-
response:
|
|
2441
|
-
valid:
|
|
2442
|
-
email:
|
|
2533
|
+
response: z.object({
|
|
2534
|
+
valid: z.boolean(),
|
|
2535
|
+
email: z.email().optional()
|
|
2443
2536
|
})
|
|
2444
2537
|
},
|
|
2445
2538
|
handler: async ({ query }) => {
|
|
@@ -2460,15 +2553,15 @@ var UserController = class {
|
|
|
2460
2553
|
path: "/users/password-reset/reset",
|
|
2461
2554
|
group: this.group,
|
|
2462
2555
|
schema: {
|
|
2463
|
-
query:
|
|
2464
|
-
body:
|
|
2465
|
-
email:
|
|
2466
|
-
token:
|
|
2467
|
-
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)
|
|
2468
2561
|
}),
|
|
2469
|
-
response:
|
|
2470
|
-
success:
|
|
2471
|
-
message:
|
|
2562
|
+
response: z.object({
|
|
2563
|
+
success: z.boolean(),
|
|
2564
|
+
message: z.string()
|
|
2472
2565
|
})
|
|
2473
2566
|
},
|
|
2474
2567
|
handler: async ({ body, query }) => {
|
|
@@ -2489,17 +2582,14 @@ var UserController = class {
|
|
|
2489
2582
|
path: "/users/email-verification/request",
|
|
2490
2583
|
group: this.group,
|
|
2491
2584
|
schema: {
|
|
2492
|
-
query:
|
|
2493
|
-
userRealmName:
|
|
2494
|
-
method:
|
|
2495
|
-
default: "code",
|
|
2496
|
-
description: "Verification method: \"code\" sends a 6-digit code, \"link\" sends a clickable verification link. When using \"link\", configure verifyEmailUrl in realm settings."
|
|
2497
|
-
}))
|
|
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()
|
|
2498
2588
|
}),
|
|
2499
|
-
body:
|
|
2500
|
-
response:
|
|
2501
|
-
success:
|
|
2502
|
-
message:
|
|
2589
|
+
body: z.object({ email: z.email() }),
|
|
2590
|
+
response: z.object({
|
|
2591
|
+
success: z.boolean(),
|
|
2592
|
+
message: z.string()
|
|
2503
2593
|
})
|
|
2504
2594
|
},
|
|
2505
2595
|
handler: async ({ body, query }) => {
|
|
@@ -2519,14 +2609,14 @@ var UserController = class {
|
|
|
2519
2609
|
path: "/users/email-verification/verify",
|
|
2520
2610
|
group: this.group,
|
|
2521
2611
|
schema: {
|
|
2522
|
-
query:
|
|
2523
|
-
body:
|
|
2524
|
-
email:
|
|
2525
|
-
token:
|
|
2612
|
+
query: z.object({ userRealmName: z.string().optional() }),
|
|
2613
|
+
body: z.object({
|
|
2614
|
+
email: z.email(),
|
|
2615
|
+
token: z.string()
|
|
2526
2616
|
}),
|
|
2527
|
-
response:
|
|
2528
|
-
success:
|
|
2529
|
-
message:
|
|
2617
|
+
response: z.object({
|
|
2618
|
+
success: z.boolean(),
|
|
2619
|
+
message: z.string()
|
|
2530
2620
|
})
|
|
2531
2621
|
},
|
|
2532
2622
|
handler: async ({ body, query }) => {
|
|
@@ -2545,11 +2635,11 @@ var UserController = class {
|
|
|
2545
2635
|
group: this.group,
|
|
2546
2636
|
use: [$secure()],
|
|
2547
2637
|
schema: {
|
|
2548
|
-
query:
|
|
2549
|
-
email:
|
|
2550
|
-
userRealmName:
|
|
2638
|
+
query: z.object({
|
|
2639
|
+
email: z.email(),
|
|
2640
|
+
userRealmName: z.string().optional()
|
|
2551
2641
|
}),
|
|
2552
|
-
response:
|
|
2642
|
+
response: z.object({ verified: z.boolean() })
|
|
2553
2643
|
},
|
|
2554
2644
|
handler: async ({ query }) => {
|
|
2555
2645
|
return { verified: await this.userService.isEmailVerified(query.email, query.userRealmName) };
|
|
@@ -3235,6 +3325,7 @@ const $realm = (options = {}) => {
|
|
|
3235
3325
|
...options.issuer,
|
|
3236
3326
|
name,
|
|
3237
3327
|
secret: options.secret ?? securityProvider.secretKey,
|
|
3328
|
+
signing: options.signing,
|
|
3238
3329
|
resolvers: customResolvers,
|
|
3239
3330
|
roles: options.issuer?.roles ?? [{
|
|
3240
3331
|
name: "admin",
|
|
@@ -3283,7 +3374,10 @@ const $realm = (options = {}) => {
|
|
|
3283
3374
|
id: user.id,
|
|
3284
3375
|
roles: user.roles,
|
|
3285
3376
|
name: composedName,
|
|
3377
|
+
firstName: user.firstName,
|
|
3378
|
+
lastName: user.lastName,
|
|
3286
3379
|
email: user.email,
|
|
3380
|
+
emailVerified: user.emailVerified,
|
|
3287
3381
|
username: user.username,
|
|
3288
3382
|
picture: user.picture,
|
|
3289
3383
|
organization: user.organizationId ?? void 0,
|
|
@@ -3322,14 +3416,6 @@ const $realm = (options = {}) => {
|
|
|
3322
3416
|
if (identities.microsoft) auth.microsoft = $authMicrosoft(realm);
|
|
3323
3417
|
if (identities.franceconnect) auth.franceconnect = $authFranceConnect(realm);
|
|
3324
3418
|
alepha.with(() => auth);
|
|
3325
|
-
if (identities.federated) {
|
|
3326
|
-
const fed = $authFederationClient({
|
|
3327
|
-
realm,
|
|
3328
|
-
brokerUrl: identities.federated.brokerUrl,
|
|
3329
|
-
publicKeyPem: identities.federated.publicKey
|
|
3330
|
-
});
|
|
3331
|
-
alepha.with(() => ({ federationCallback: fed.callback }));
|
|
3332
|
-
}
|
|
3333
3419
|
}
|
|
3334
3420
|
if (features.parameters) {
|
|
3335
3421
|
alepha.with(AlephaApiParameters);
|
|
@@ -3346,57 +3432,34 @@ const $realm = (options = {}) => {
|
|
|
3346
3432
|
};
|
|
3347
3433
|
//#endregion
|
|
3348
3434
|
//#region ../../src/api/users/schemas/loginSchema.ts
|
|
3349
|
-
const loginSchema =
|
|
3350
|
-
username:
|
|
3435
|
+
const loginSchema = z.object({
|
|
3436
|
+
username: z.text({
|
|
3351
3437
|
minLength: 3,
|
|
3352
3438
|
maxLength: 100,
|
|
3353
3439
|
description: "Username or email address for login"
|
|
3354
3440
|
}),
|
|
3355
|
-
password:
|
|
3441
|
+
password: z.text({
|
|
3356
3442
|
minLength: 8,
|
|
3357
3443
|
description: "User password"
|
|
3358
3444
|
})
|
|
3359
3445
|
});
|
|
3360
3446
|
//#endregion
|
|
3361
3447
|
//#region ../../src/api/users/schemas/registerSchema.ts
|
|
3362
|
-
const registerSchema =
|
|
3363
|
-
username:
|
|
3364
|
-
|
|
3365
|
-
|
|
3366
|
-
|
|
3367
|
-
|
|
3368
|
-
|
|
3369
|
-
email: t.email({ description: "Email address for the new account" }),
|
|
3370
|
-
password: t.string({
|
|
3371
|
-
minLength: 8,
|
|
3372
|
-
description: "Password for the new account"
|
|
3373
|
-
}),
|
|
3374
|
-
confirmPassword: t.string({
|
|
3375
|
-
minLength: 8,
|
|
3376
|
-
description: "Confirmation of the password"
|
|
3377
|
-
}),
|
|
3378
|
-
firstName: t.optional(t.string({
|
|
3379
|
-
maxLength: 100,
|
|
3380
|
-
description: "User's first name"
|
|
3381
|
-
})),
|
|
3382
|
-
lastName: t.optional(t.string({
|
|
3383
|
-
maxLength: 100,
|
|
3384
|
-
description: "User's last name"
|
|
3385
|
-
}))
|
|
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()
|
|
3386
3455
|
});
|
|
3387
3456
|
//#endregion
|
|
3388
3457
|
//#region ../../src/api/users/schemas/resetPasswordSchema.ts
|
|
3389
|
-
const resetPasswordRequestSchema =
|
|
3390
|
-
const resetPasswordSchema =
|
|
3391
|
-
token:
|
|
3392
|
-
password:
|
|
3393
|
-
|
|
3394
|
-
description: "New password"
|
|
3395
|
-
}),
|
|
3396
|
-
confirmPassword: t.string({
|
|
3397
|
-
minLength: 8,
|
|
3398
|
-
description: "Confirmation of the new password"
|
|
3399
|
-
})
|
|
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")
|
|
3400
3463
|
});
|
|
3401
3464
|
//#endregion
|
|
3402
3465
|
//#region ../../src/api/users/index.ts
|
|
@@ -3429,6 +3492,7 @@ const AlephaApiUsers = $module({
|
|
|
3429
3492
|
UserController,
|
|
3430
3493
|
AdminUserController,
|
|
3431
3494
|
AdminSessionController,
|
|
3495
|
+
MySessionController,
|
|
3432
3496
|
AdminIdentityController,
|
|
3433
3497
|
RealmController
|
|
3434
3498
|
],
|
|
@@ -3441,6 +3505,6 @@ const AlephaApiUsers = $module({
|
|
|
3441
3505
|
]
|
|
3442
3506
|
});
|
|
3443
3507
|
//#endregion
|
|
3444
|
-
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 };
|
|
3445
3509
|
|
|
3446
3510
|
//# sourceMappingURL=index.js.map
|