alepha 0.19.1 → 0.19.2
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/LICENSE +1 -1
- package/README.md +6 -9
- package/dist/api/audits/index.d.ts +378 -346
- package/dist/api/audits/index.d.ts.map +1 -1
- package/dist/api/files/index.d.ts +216 -184
- package/dist/api/files/index.d.ts.map +1 -1
- package/dist/api/jobs/index.d.ts +528 -496
- package/dist/api/jobs/index.d.ts.map +1 -1
- package/dist/api/jobs/index.js +3 -3
- package/dist/api/jobs/index.js.map +1 -1
- package/dist/api/keys/index.d.ts +207 -207
- package/dist/api/keys/index.d.ts.map +1 -1
- package/dist/api/notifications/index.d.ts +152 -152
- package/dist/api/notifications/index.d.ts.map +1 -1
- package/dist/api/organizations/index.browser.js +48 -0
- package/dist/api/organizations/index.browser.js.map +1 -0
- package/dist/api/organizations/index.d.ts +516 -0
- package/dist/api/organizations/index.d.ts.map +1 -0
- package/dist/api/organizations/index.js +202 -0
- package/dist/api/organizations/index.js.map +1 -0
- package/dist/api/parameters/index.d.ts +391 -358
- package/dist/api/parameters/index.d.ts.map +1 -1
- package/dist/api/parameters/index.js +5 -1
- package/dist/api/parameters/index.js.map +1 -1
- package/dist/api/users/index.browser.js +7 -5
- package/dist/api/users/index.browser.js.map +1 -1
- package/dist/api/users/index.d.ts +978 -913
- package/dist/api/users/index.d.ts.map +1 -1
- package/dist/api/users/index.js +160 -112
- package/dist/api/users/index.js.map +1 -1
- package/dist/api/verifications/index.d.ts +135 -135
- package/dist/api/verifications/index.d.ts.map +1 -1
- package/dist/api/verifications/index.js +2 -2
- package/dist/api/verifications/index.js.map +1 -1
- package/dist/batch/index.d.ts +6 -6
- package/dist/batch/index.d.ts.map +1 -1
- package/dist/billing/index.d.ts +1048 -0
- package/dist/billing/index.d.ts.map +1 -0
- package/dist/billing/index.js +713 -0
- package/dist/billing/index.js.map +1 -0
- package/dist/bin/index.js +0 -2
- package/dist/bin/index.js.map +1 -1
- package/dist/bucket/index.d.ts +10 -10
- package/dist/bucket/index.d.ts.map +1 -1
- package/dist/bucket/index.js +2 -2
- package/dist/bucket/index.js.map +1 -1
- package/dist/cache/core/index.d.ts +9 -9
- package/dist/cache/core/index.d.ts.map +1 -1
- package/dist/cache/core/index.js +2 -2
- package/dist/cache/core/index.js.map +1 -1
- package/dist/cache/core/index.workerd.js +2 -2
- package/dist/cache/core/index.workerd.js.map +1 -1
- package/dist/cache/redis/index.d.ts +6 -6
- 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/cli/config/index.d.ts +12 -2
- package/dist/cli/config/index.d.ts.map +1 -1
- package/dist/cli/config/index.js +4 -0
- package/dist/cli/config/index.js.map +1 -1
- package/dist/cli/core/index.d.ts +183 -140
- package/dist/cli/core/index.d.ts.map +1 -1
- package/dist/cli/core/index.js +279 -89
- package/dist/cli/core/index.js.map +1 -1
- package/dist/cli/devtools/index.d.ts +45 -0
- package/dist/cli/devtools/index.d.ts.map +1 -0
- package/dist/cli/devtools/index.js +170 -0
- package/dist/cli/devtools/index.js.map +1 -0
- package/dist/cli/platform/index.d.ts +383 -492
- package/dist/cli/platform/index.d.ts.map +1 -1
- package/dist/cli/platform/index.js +42 -511
- package/dist/cli/platform/index.js.map +1 -1
- package/dist/cli/vendor/index.d.ts +196 -0
- package/dist/cli/vendor/index.d.ts.map +1 -0
- package/dist/cli/vendor/index.js +384 -0
- package/dist/cli/vendor/index.js.map +1 -0
- package/dist/command/index.d.ts +18 -18
- package/dist/command/index.d.ts.map +1 -1
- package/dist/command/index.js +2 -2
- package/dist/command/index.js.map +1 -1
- package/dist/core/index.browser.js +4 -4
- package/dist/core/index.browser.js.map +1 -1
- package/dist/core/index.d.ts +10 -10
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +4 -4
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.native.js +4 -4
- package/dist/core/index.native.js.map +1 -1
- package/dist/core/index.workerd.js +4 -4
- package/dist/core/index.workerd.js.map +1 -1
- package/dist/crypto/index.d.ts +7 -7
- package/dist/crypto/index.d.ts.map +1 -1
- package/dist/datetime/index.d.ts +4 -4
- package/dist/datetime/index.d.ts.map +1 -1
- package/dist/email/brevo/index.d.ts +4 -4
- package/dist/email/brevo/index.d.ts.map +1 -1
- package/dist/email/core/index.d.ts +15 -11
- package/dist/email/core/index.d.ts.map +1 -1
- package/dist/email/core/index.js +12 -35
- package/dist/email/core/index.js.map +1 -1
- package/dist/email/smtp/index.d.ts +12 -12
- package/dist/email/smtp/index.d.ts.map +1 -1
- package/dist/email/smtp/index.js +7 -4
- package/dist/email/smtp/index.js.map +1 -1
- package/dist/fake/index.d.ts +4 -8
- package/dist/fake/index.d.ts.map +1 -1
- package/dist/fake/index.js +55 -889
- package/dist/fake/index.js.map +1 -1
- package/dist/lock/core/index.d.ts +13 -13
- package/dist/lock/core/index.d.ts.map +1 -1
- package/dist/lock/core/index.js +2 -2
- package/dist/lock/core/index.js.map +1 -1
- package/dist/lock/redis/index.d.ts +4 -4
- package/dist/lock/redis/index.d.ts.map +1 -1
- package/dist/logger/index.d.ts +16 -15
- package/dist/logger/index.d.ts.map +1 -1
- package/dist/logger/index.js +5 -2
- package/dist/logger/index.js.map +1 -1
- package/dist/mcp/index.d.ts +11 -11
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +2 -2
- package/dist/mcp/index.js.map +1 -1
- package/dist/orm/core/index.browser.js +11 -1
- package/dist/orm/core/index.browser.js.map +1 -1
- package/dist/orm/core/index.bun.js +53 -16
- package/dist/orm/core/index.bun.js.map +1 -1
- package/dist/orm/core/index.d.ts +95 -51
- package/dist/orm/core/index.d.ts.map +1 -1
- package/dist/orm/core/index.js +55 -14
- package/dist/orm/core/index.js.map +1 -1
- package/dist/orm/postgres/index.d.ts +18 -17
- package/dist/orm/postgres/index.d.ts.map +1 -1
- package/dist/queue/core/index.d.ts +14 -14
- package/dist/queue/core/index.d.ts.map +1 -1
- package/dist/queue/core/index.js +2 -2
- package/dist/queue/core/index.js.map +1 -1
- package/dist/queue/core/index.workerd.js +2 -2
- package/dist/queue/core/index.workerd.js.map +1 -1
- package/dist/queue/redis/index.d.ts +4 -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.d.ts +9 -9
- package/dist/react/auth/index.d.ts.map +1 -1
- package/dist/react/core/index.d.ts +6 -6
- package/dist/react/core/index.d.ts.map +1 -1
- package/dist/react/core/index.js +5 -4
- package/dist/react/core/index.js.map +1 -1
- package/dist/react/form/index.d.ts +4 -4
- package/dist/react/form/index.d.ts.map +1 -1
- package/dist/react/head/index.d.ts +4 -4
- package/dist/react/head/index.d.ts.map +1 -1
- package/dist/react/i18n/index.d.ts +9 -9
- package/dist/react/i18n/index.d.ts.map +1 -1
- package/dist/react/intro/index.d.ts +2 -2
- package/dist/react/intro/index.d.ts.map +1 -1
- package/dist/react/intro/index.js +1 -1
- package/dist/react/intro/index.js.map +1 -1
- package/dist/react/router/index.browser.js +4 -5
- package/dist/react/router/index.browser.js.map +1 -1
- package/dist/react/router/index.d.ts +215 -215
- package/dist/react/router/index.d.ts.map +1 -1
- package/dist/react/router/index.js +6 -7
- package/dist/react/router/index.js.map +1 -1
- package/dist/react/testing/index.d.ts +2 -2
- package/dist/react/testing/index.d.ts.map +1 -1
- package/dist/react/testing/index.js +2 -4
- package/dist/react/testing/index.js.map +1 -1
- package/dist/redis/index.d.ts +19 -19
- package/dist/redis/index.d.ts.map +1 -1
- package/dist/retry/index.d.ts +4 -4
- package/dist/retry/index.d.ts.map +1 -1
- package/dist/scheduler/index.d.ts +13 -13
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js +2 -2
- package/dist/scheduler/index.js.map +1 -1
- package/dist/scheduler/index.workerd.js +2 -2
- package/dist/scheduler/index.workerd.js.map +1 -1
- package/dist/security/index.browser.js +1 -1
- package/dist/security/index.browser.js.map +1 -1
- package/dist/security/index.d.ts +47 -47
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js +9 -12
- package/dist/security/index.js.map +1 -1
- package/dist/server/auth/index.d.ts +170 -169
- package/dist/server/auth/index.d.ts.map +1 -1
- package/dist/server/auth/index.js +16 -2
- package/dist/server/auth/index.js.map +1 -1
- package/dist/server/cookies/index.d.ts +7 -7
- package/dist/server/cookies/index.d.ts.map +1 -1
- package/dist/server/core/index.d.ts +76 -76
- package/dist/server/core/index.d.ts.map +1 -1
- package/dist/server/core/index.js +23 -17
- package/dist/server/core/index.js.map +1 -1
- package/dist/server/cors/index.d.ts +13 -13
- package/dist/server/cors/index.d.ts.map +1 -1
- package/dist/server/cors/index.js +2 -2
- package/dist/server/cors/index.js.map +1 -1
- package/dist/server/etag/index.d.ts +9 -9
- package/dist/server/etag/index.d.ts.map +1 -1
- package/dist/server/health/index.d.ts +20 -20
- package/dist/server/health/index.d.ts.map +1 -1
- package/dist/server/links/index.browser.js +2 -2
- package/dist/server/links/index.browser.js.map +1 -1
- package/dist/server/links/index.d.ts +66 -66
- package/dist/server/links/index.d.ts.map +1 -1
- package/dist/server/links/index.js +4 -4
- package/dist/server/links/index.js.map +1 -1
- package/dist/server/metrics/index.d.ts +7 -7
- package/dist/server/metrics/index.d.ts.map +1 -1
- package/dist/server/proxy/index.d.ts +5 -5
- package/dist/server/proxy/index.d.ts.map +1 -1
- package/dist/server/rate-limit/index.d.ts +12 -12
- package/dist/server/rate-limit/index.d.ts.map +1 -1
- package/dist/server/rate-limit/index.js +2 -2
- package/dist/server/rate-limit/index.js.map +1 -1
- package/dist/server/static/index.d.ts +5 -5
- package/dist/server/static/index.d.ts.map +1 -1
- package/dist/server/swagger/index.d.ts +7 -7
- package/dist/server/swagger/index.d.ts.map +1 -1
- package/dist/server/swagger/index.js +2 -2
- package/dist/server/swagger/index.js.map +1 -1
- package/dist/sms/index.d.ts +11 -7
- package/dist/sms/index.d.ts.map +1 -1
- package/dist/sms/index.js +9 -15
- package/dist/sms/index.js.map +1 -1
- package/dist/system/index.d.ts +4 -4
- package/dist/system/index.d.ts.map +1 -1
- package/dist/topic/core/index.d.ts +6 -6
- package/dist/topic/core/index.d.ts.map +1 -1
- package/dist/topic/redis/index.d.ts +7 -7
- 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/dist/websocket/index.d.ts +36 -36
- package/dist/websocket/index.d.ts.map +1 -1
- package/dist/websocket/index.js +2 -2
- package/dist/websocket/index.js.map +1 -1
- package/package.json +36 -14
- package/src/api/jobs/{services → __tests__}/JobService.spec.ts +1 -1
- package/src/api/jobs/providers/JobProvider.ts +3 -3
- package/src/api/keys/{services → __tests__}/ApiKeyService.spec.ts +1 -1
- package/src/api/organizations/__tests__/OrganizationService.spec.ts +193 -0
- package/src/api/organizations/controllers/AdminOrganizationController.ts +103 -0
- package/src/api/organizations/entities/organizations.ts +20 -0
- package/src/api/organizations/index.browser.ts +10 -0
- package/src/api/organizations/index.ts +31 -0
- package/src/api/organizations/schemas/createOrganizationSchema.ts +10 -0
- package/src/api/organizations/schemas/organizationQuerySchema.ts +10 -0
- package/src/api/organizations/schemas/organizationResourceSchema.ts +6 -0
- package/src/api/organizations/schemas/updateOrganizationSchema.ts +7 -0
- package/src/api/organizations/services/OrganizationService.ts +75 -0
- package/src/api/parameters/services/ParameterProvider.ts +6 -1
- package/src/api/users/{services → __tests__}/SessionService.spec.ts +67 -0
- package/src/api/users/{jobs → __tests__}/UserJobs.spec.ts +1 -1
- package/src/api/users/entities/users.ts +9 -3
- package/src/api/users/index.ts +23 -4
- package/src/api/users/primitives/$realm.ts +6 -4
- package/src/api/users/providers/RealmProvider.ts +1 -1
- package/src/api/users/services/RegistrationService.ts +1 -1
- package/src/api/users/services/SessionService.ts +92 -5
- package/src/api/users/services/UserService.ts +1 -1
- package/src/api/verifications/{jobs → __tests__}/VerificationJobs.spec.ts +4 -2
- package/src/api/verifications/parameters/VerificationParameters.ts +2 -2
- package/src/billing/__tests__/BillingService.spec.ts +136 -0
- package/src/billing/__tests__/PaymentMethodService.spec.ts +78 -0
- package/src/billing/controllers/AdminBillingController.ts +149 -0
- package/src/billing/controllers/BillingController.ts +108 -0
- package/src/billing/entities/paymentIntents.ts +34 -0
- package/src/billing/entities/paymentMethods.ts +24 -0
- package/src/billing/entities/refunds.ts +22 -0
- package/src/billing/errors/BillingError.ts +5 -0
- package/src/billing/index.ts +76 -0
- package/src/billing/providers/BillingProvider.ts +79 -0
- package/src/billing/providers/MemoryBillingProvider.ts +139 -0
- package/src/billing/schemas/intentSchemas.ts +60 -0
- package/src/billing/schemas/paymentMethodSchemas.ts +13 -0
- package/src/billing/schemas/refundSchemas.ts +6 -0
- package/src/billing/services/BillingService.ts +325 -0
- package/src/billing/services/PaymentMethodService.ts +82 -0
- package/src/bin/index.ts +0 -2
- package/src/bucket/providers/LocalFileStorageProvider.ts +2 -2
- package/src/cache/core/{primitives → __tests__}/$cache.middleware.spec.ts +1 -1
- package/src/cache/core/{providers → __tests__}/MemoryCacheProvider.spec.ts +1 -1
- package/src/cache/core/primitives/$cache.ts +2 -2
- package/src/cache/redis/providers/RedisCacheProvider.ts +2 -2
- package/src/cli/config/defineConfig.ts +20 -0
- package/src/cli/core/{services → __tests__}/ProjectScaffolder.spec.ts +1 -1
- package/src/cli/core/{commands/gen → __tests__}/changelog.spec.ts +1 -1
- package/src/cli/core/{commands → __tests__}/init.spec.ts +2 -8
- package/src/cli/core/atoms/devOptions.ts +0 -5
- package/src/cli/core/commands/build.ts +2 -2
- package/src/cli/core/commands/dev.ts +165 -30
- package/src/cli/core/commands/gen/changelog.ts +2 -2
- package/src/cli/core/commands/init.ts +2 -7
- package/src/cli/core/commands/verify.ts +0 -1
- package/src/cli/core/providers/AppEntryProvider.ts +2 -2
- package/src/cli/core/providers/ViteDevServerProvider.ts +54 -66
- package/src/cli/core/services/PackageManagerUtils.ts +8 -3
- package/src/cli/core/services/ProjectScaffolder.ts +18 -18
- package/src/cli/core/tasks/BuildClientTask.ts +8 -0
- package/src/cli/core/tasks/BuildServerTask.ts +17 -4
- package/src/cli/core/templates/alephaConfigTs.ts +0 -6
- package/src/cli/core/templates/webAdminDashboardTsx.ts +17 -0
- package/src/cli/core/templates/webAppRouterTs.ts +85 -2
- package/src/cli/devtools/atoms/devtoolsOptions.ts +26 -0
- package/src/cli/devtools/index.ts +194 -0
- package/src/cli/platform/{adapters → __tests__}/CloudflareAdapter.spec.ts +2 -2
- package/src/cli/platform/{providers → __tests__}/GitHubSecretStore.spec.ts +1 -1
- package/src/cli/platform/{services → __tests__}/NamingService.spec.ts +1 -1
- package/src/cli/platform/{providers → __tests__}/PlatformCacheProvider.spec.ts +1 -1
- package/src/cli/platform/{services → __tests__}/PlatformInspector.spec.ts +1 -1
- package/src/cli/platform/{services → __tests__}/PlatformOrchestrator.spec.ts +3 -3
- package/src/cli/platform/{services → __tests__}/SecretFilterService.spec.ts +1 -1
- package/src/cli/platform/{commands → __tests__}/SecretsCommand.spec.ts +1 -1
- package/src/cli/platform/{adapters → __tests__}/VercelAdapter.spec.ts +2 -2
- package/src/cli/platform/atoms/platformOptions.ts +2 -10
- package/src/cli/platform/commands/SecretsCommand.ts +2 -2
- package/src/cli/platform/commands/platform.ts +2 -11
- package/src/cli/platform/index.ts +34 -11
- package/src/cli/platform/services/PlatformInspector.ts +2 -2
- package/src/cli/platform/services/PlatformOrchestrator.ts +0 -9
- package/src/cli/vendor/__tests__/VendorService.spec.ts +407 -0
- package/src/cli/vendor/atoms/vendorOptions.ts +41 -0
- package/src/cli/vendor/commands/VendorCommand.ts +204 -0
- package/src/cli/vendor/index.ts +43 -0
- package/src/cli/vendor/services/VendorService.ts +338 -0
- package/src/command/{providers → __tests__}/CliProvider.spec.ts +1 -1
- package/src/command/{helpers → __tests__}/EnvUtils.spec.ts +1 -1
- package/src/command/providers/CliProvider.ts +2 -2
- package/src/core/{primitives → __tests__}/$atom.spec.ts +2 -2
- package/src/core/{primitives → __tests__}/$memoize.spec.ts +1 -1
- package/src/core/{primitives → __tests__}/$mode.spec.ts +1 -1
- package/src/core/{primitives → __tests__}/$pipeline.spec.ts +1 -1
- package/src/core/{primitives → __tests__}/$scope.spec.ts +2 -2
- package/src/core/{providers → __tests__}/KeylessJsonSchemaCodec.spec.ts +1 -1
- package/src/core/{providers → __tests__}/SchemaValidator.spec.ts +1 -1
- package/src/core/{helpers → __tests__}/jsonSchemaToTypeBox.spec.ts +1 -1
- package/src/core/index.shared.ts +1 -1
- package/src/core/primitives/{$use.ts → $state.ts} +4 -4
- package/src/crypto/{providers → __tests__}/BrowserCryptoProvider.browser.spec.ts +1 -1
- package/src/crypto/{providers → __tests__}/CryptoProvider.spec.ts +1 -1
- package/src/datetime/{primitives → __tests__}/$debounce.spec.ts +1 -1
- package/src/datetime/{primitives → __tests__}/$throttle.spec.ts +1 -1
- package/src/datetime/{primitives → __tests__}/$timeout.spec.ts +1 -1
- package/src/email/brevo/{providers → __tests__}/BrevoEmailProvider.spec.ts +1 -1
- package/src/email/core/{providers → __tests__}/LocalEmailProvider.spec.ts +39 -150
- package/src/email/core/providers/LocalEmailProvider.ts +13 -51
- package/src/email/smtp/providers/NodemailerEmailProvider.ts +2 -2
- package/src/lock/core/{primitives → __tests__}/$lock.middleware.spec.ts +1 -1
- package/src/lock/core/primitives/$lock.ts +2 -2
- package/src/logger/index.ts +10 -4
- package/src/mcp/transports/SseMcpTransport.ts +2 -2
- package/src/orm/__tests__/ModelBuilder-tests.ts +53 -0
- package/src/orm/__tests__/ModelBuilder.spec.ts +80 -0
- package/src/orm/__tests__/organization-tests.ts +200 -0
- package/src/orm/__tests__/organization.spec.ts +103 -0
- package/src/orm/core/{providers/drivers → __tests__}/BunSqliteProvider.bun.spec.ts +5 -2
- package/src/orm/core/constants/PG_SYMBOLS.ts +2 -0
- package/src/orm/core/index.shared.ts +1 -0
- package/src/orm/core/primitives/$entity.ts +31 -0
- package/src/orm/core/providers/DatabaseTypeProvider.ts +11 -0
- package/src/orm/core/providers/DrizzleKitProvider.ts +1 -1
- package/src/orm/core/providers/drivers/BunSqliteProvider.ts +2 -2
- package/src/orm/core/providers/drivers/NodeSqliteProvider.ts +3 -3
- package/src/orm/core/services/ModelBuilder.ts +11 -0
- package/src/orm/core/services/QueryManager.ts +16 -2
- package/src/orm/core/services/Repository.ts +70 -10
- package/src/orm/postgres/{providers → __tests__}/BunPostgresProvider.bun.spec.ts +1 -1
- package/src/queue/core/providers/WorkerProvider.ts +2 -2
- package/src/queue/redis/providers/RedisQueueProvider.ts +2 -2
- package/src/react/core/{hooks → __tests__}/useAction.browser.spec.tsx +1 -1
- package/src/react/core/hooks/useAction.ts +7 -6
- package/src/react/head/{providers → __tests__}/BrowserHeadProvider.browser.spec.ts +1 -1
- package/src/react/head/{helpers → __tests__}/SeoExpander.spec.ts +1 -1
- package/src/react/i18n/{providers → __tests__}/I18nProvider.spec.ts +1 -1
- package/src/react/i18n/{hooks → __tests__}/useI18n.browser.spec.tsx +1 -1
- package/src/react/intro/components/GettingStartedDevtoolsSlide.tsx +1 -1
- package/src/react/router/{providers → __tests__}/ReactBrowserProvider.browser.spec.ts +1 -1
- package/src/react/router/providers/ReactBrowserProvider.ts +2 -2
- package/src/react/router/providers/ReactPageProvider.ts +2 -2
- package/src/react/router/providers/ReactServerProvider.ts +3 -3
- package/src/redis/{providers → __tests__}/BunRedisProvider.bun.spec.ts +4 -4
- package/src/retry/{primitives → __tests__}/$retry.middleware.spec.ts +1 -1
- package/src/router/{TemplatedPathParser.spec.ts → __tests__/TemplatedPathParser.spec.ts} +1 -1
- package/src/scheduler/primitives/$scheduler.ts +2 -2
- package/src/security/{primitives → __tests__}/$secure-browser.spec.ts +1 -1
- package/src/security/{primitives → __tests__}/$secure.spec.ts +1 -1
- package/src/security/primitives/$issuer.ts +1 -1
- package/src/security/providers/JwtProvider.ts +6 -10
- package/src/security/providers/SecurityProvider.ts +6 -11
- package/src/security/schemas/userAccountInfoSchema.ts +3 -3
- package/src/server/auth/providers/ServerAuthProvider.ts +24 -2
- package/src/server/cookies/{services → __tests__}/CookieParser.spec.ts +1 -1
- package/src/server/core/{primitives → __tests__}/$circuit.spec.ts +1 -1
- package/src/server/core/{providers → __tests__}/NodeHttpServerProvider.spec.ts +1 -1
- package/src/server/core/{providers → __tests__}/ServerBodyParserProvider.spec.ts +31 -1
- package/src/server/core/{providers → __tests__}/ServerCompressProvider.spec.ts +1 -1
- package/src/server/core/{providers → __tests__}/ServerHelmetProvider.spec.ts +4 -1
- package/src/server/core/{providers → __tests__}/ServerMultipartProvider.spec.ts +1 -1
- package/src/server/core/{services → __tests__}/ServerRequestParser.spec.ts +1 -1
- package/src/server/core/primitives/$action.ts +2 -2
- package/src/server/core/primitives/$sse.ts +2 -2
- package/src/server/core/providers/ServerBodyParserProvider.ts +21 -12
- package/src/server/core/providers/ServerCompressProvider.ts +2 -2
- package/src/server/core/providers/ServerHelmetProvider.ts +2 -2
- package/src/server/core/providers/ServerMultipartProvider.ts +2 -2
- package/src/server/core/providers/ServerRouterProvider.ts +1 -5
- package/src/server/cors/{primitives → __tests__}/$cors.spec.ts +1 -1
- package/src/server/cors/providers/ServerCorsProvider.ts +2 -2
- package/src/server/links/{services → __tests__}/BatchCollector.spec.ts +1 -1
- package/src/server/links/providers/LinkProvider.ts +2 -2
- package/src/server/links/providers/RemotePrimitiveProvider.ts +2 -2
- package/src/server/links/providers/ServerLinksProvider.ts +2 -2
- package/src/server/rate-limit/{primitives → __tests__}/$rateLimit.spec.ts +1 -1
- package/src/server/rate-limit/providers/ServerRateLimitProvider.ts +2 -2
- package/src/server/swagger/providers/ServerSwaggerProvider.ts +2 -2
- package/src/sms/{providers → __tests__}/LocalSmsProvider.spec.ts +35 -29
- package/src/sms/providers/LocalSmsProvider.ts +13 -24
- package/src/system/{providers → __tests__}/MemoryFileSystemProvider.spec.ts +1 -1
- package/src/system/{providers → __tests__}/MemoryShellProvider.spec.ts +1 -1
- package/src/topic/redis/providers/RedisTopicProvider.ts +2 -2
- package/src/websocket/{services → __tests__}/RoomManager.spec.ts +1 -1
- package/src/websocket/providers/NodeWebSocketServerProvider.ts +2 -2
- package/tsconfig.base.json +1 -0
- package/src/cli/platform/adapters/DockerAdapter.spec.ts +0 -378
- package/src/cli/platform/adapters/DockerAdapter.ts +0 -417
- package/src/cli/platform/services/DockerComposeGenerator.spec.ts +0 -490
- package/src/cli/platform/services/DockerComposeGenerator.ts +0 -353
- package/src/cli/platform/services/DockerSshService.spec.ts +0 -47
- package/src/cli/platform/services/DockerSshService.ts +0 -61
- /package/src/api/audits/{primitives → __tests__}/$audit.spec.ts +0 -0
- /package/src/api/audits/{services → __tests__}/AuditService.spec.ts +0 -0
- /package/src/api/files/{controllers → __tests__}/AdminFileStatsController.spec.ts +0 -0
- /package/src/api/files/{controllers → __tests__}/FileController.spec.ts +0 -0
- /package/src/api/files/{jobs → __tests__}/FileJobs.spec.ts +0 -0
- /package/src/api/files/{services → __tests__}/FileService.spec.ts +0 -0
- /package/src/api/jobs/{primitives → __tests__}/$job-middleware.spec.ts +0 -0
- /package/src/api/parameters/{primitives → __tests__}/$parameter.spec.ts +0 -0
- /package/src/api/users/{primitives → __tests__}/$realm.spec.ts +0 -0
- /package/src/api/users/{controllers → __tests__}/AdminIdentityController.spec.ts +0 -0
- /package/src/api/users/{controllers → __tests__}/AdminSessionController.spec.ts +0 -0
- /package/src/api/users/{controllers → __tests__}/AdminUserController.spec.ts +0 -0
- /package/src/api/users/{services → __tests__}/CredentialService.spec.ts +0 -0
- /package/src/api/users/{providers → __tests__}/RealmProvider.spec.ts +0 -0
- /package/src/api/users/{services → __tests__}/RegistrationService.spec.ts +0 -0
- /package/src/batch/{primitives → __tests__}/$batch.spec.ts +0 -0
- /package/src/batch/{providers → __tests__}/BatchProvider.spec.ts +0 -0
- /package/src/bucket/{primitives → __tests__}/$bucket.spec.ts +0 -0
- /package/src/bucket/{providers → __tests__}/FileStorageProvider.spec.ts +0 -0
- /package/src/bucket/{providers → __tests__}/LocalFileStorageProvider.spec.ts +0 -0
- /package/src/bucket/{providers → __tests__}/MemoryFileStorageProvider.spec.ts +0 -0
- /package/src/cache/core/{primitives → __tests__}/$cache.spec.ts +0 -0
- /package/src/cache/redis/{providers → __tests__}/RedisCacheProvider.spec.ts +0 -0
- /package/src/command/{primitives → __tests__}/$command.spec.ts +0 -0
- /package/src/command/{helpers → __tests__}/Asker.spec.ts +0 -0
- /package/src/command/{helpers → __tests__}/Runner.spec.ts +0 -0
- /package/src/core/{primitives → __tests__}/$context.spec.ts +0 -0
- /package/src/core/{primitives → __tests__}/$env.spec.ts +0 -0
- /package/src/core/{primitives → __tests__}/$hook.spec.ts +0 -0
- /package/src/core/{primitives → __tests__}/$inject.spec.ts +0 -0
- /package/src/core/{primitives → __tests__}/$module.spec.ts +0 -0
- /package/src/core/{providers → __tests__}/CodecManager.spec.ts +0 -0
- /package/src/core/{providers → __tests__}/EventManager.spec.ts +0 -0
- /package/src/core/{providers → __tests__}/StateManager.spec.ts +0 -0
- /package/src/core/{providers → __tests__}/TypeProvider.spec.ts +0 -0
- /package/src/datetime/{primitives → __tests__}/$interval.spec.ts +0 -0
- /package/src/datetime/{providers → __tests__}/DateTimeProvider.spec.ts +0 -0
- /package/src/email/core/{primitives → __tests__}/$email.spec.ts +0 -0
- /package/src/fake/{providers → __tests__}/FakeProvider.spec.ts +0 -0
- /package/src/lock/core/{providers → __tests__}/MemoryLockProvider.spec.ts +0 -0
- /package/src/lock/redis/{providers → __tests__}/RedisLockProvider.spec.ts +0 -0
- /package/src/logger/{primitives → __tests__}/$logger.spec.ts +0 -0
- /package/src/logger/{services → __tests__}/Logger.spec.ts +0 -0
- /package/src/mcp/{primitives → __tests__}/$prompt.spec.ts +0 -0
- /package/src/mcp/{primitives → __tests__}/$resource.spec.ts +0 -0
- /package/src/mcp/{primitives → __tests__}/$tool.spec.ts +0 -0
- /package/src/mcp/{providers → __tests__}/McpServerProvider.spec.ts +0 -0
- /package/src/mcp/{helpers → __tests__}/jsonrpc.spec.ts +0 -0
- /package/src/orm/core/{helpers → __tests__}/parseQueryString.spec.ts +0 -0
- /package/src/queue/core/{primitives → __tests__}/$consumer.spec.ts +0 -0
- /package/src/queue/core/{providers → __tests__}/MemoryQueueProvider.spec.ts +0 -0
- /package/src/queue/core/{providers → __tests__}/WorkerProvider.spec.ts +0 -0
- /package/src/queue/redis/{providers → __tests__}/RedisQueueProvider.spec.ts +0 -0
- /package/src/react/form/{hooks → __tests__}/useForm.browser.spec.tsx +0 -0
- /package/src/react/head/{hooks → __tests__}/useHead.spec.tsx +0 -0
- /package/src/react/i18n/{components → __tests__}/Localize.spec.tsx +0 -0
- /package/src/react/router/{primitives → __tests__}/$page.browser.spec.tsx +0 -0
- /package/src/react/router/{primitives → __tests__}/$page.middleware.spec.tsx +0 -0
- /package/src/react/router/{primitives → __tests__}/$page.spec.tsx +0 -0
- /package/src/react/router/{providers → __tests__}/ReactPreloadProvider.spec.ts +0 -0
- /package/src/react/router/{providers → __tests__}/ReactServerProvider.spec.tsx +0 -0
- /package/src/react/router/{providers → __tests__}/ReactServerTemplateProvider.spec.ts +0 -0
- /package/src/retry/{primitives → __tests__}/$retry.spec.ts +0 -0
- /package/src/retry/{providers → __tests__}/RetryProvider.spec.ts +0 -0
- /package/src/router/{providers → __tests__}/RouterProvider.spec.ts +0 -0
- /package/src/security/{primitives → __tests__}/$issuer.spec.ts +0 -0
- /package/src/security/{primitives → __tests__}/$permission.spec.ts +0 -0
- /package/src/security/{primitives → __tests__}/$role.spec.ts +0 -0
- /package/src/security/{primitives → __tests__}/$serviceAccount.spec.ts +0 -0
- /package/src/security/{providers → __tests__}/SecurityProvider.spec.ts +0 -0
- /package/src/server/cookies/{providers → __tests__}/ServerCookiesProvider.spec.ts +0 -0
- /package/src/server/core/{primitives → __tests__}/$action.spec.ts +0 -0
- /package/src/server/core/{primitives → __tests__}/$middleware.spec.ts +0 -0
- /package/src/server/core/{primitives → __tests__}/$route.spec.ts +0 -0
- /package/src/server/core/{primitives → __tests__}/$sse.spec.ts +0 -0
- /package/src/server/core/{providers → __tests__}/BunHttpServerProvider.bun.spec.ts +0 -0
- /package/src/server/core/{services → __tests__}/HttpClient.spec.ts +0 -0
- /package/src/server/core/{providers → __tests__}/ServerLoggerProvider.spec.ts +0 -0
- /package/src/server/core/{services → __tests__}/UserAgentParser.spec.ts +0 -0
- /package/src/server/cors/{providers → __tests__}/ServerCorsProvider.spec.ts +0 -0
- /package/src/server/etag/{providers → __tests__}/ServerEtagProvider.spec.ts +0 -0
- /package/src/server/health/{providers → __tests__}/ServerHealthProvider.spec.ts +0 -0
- /package/src/server/links/{primitives → __tests__}/$remote.spec.ts +0 -0
- /package/src/server/links/{services → __tests__}/BatchEndpoint.spec.ts +0 -0
- /package/src/server/links/{providers → __tests__}/LinkProvider.spec.ts +0 -0
- /package/src/server/links/{providers → __tests__}/ServerLinksProvider.spec.ts +0 -0
- /package/src/server/metrics/{providers → __tests__}/ServerMetricsProvider.spec.ts +0 -0
- /package/src/server/proxy/{primitives → __tests__}/$proxy.spec.ts +0 -0
- /package/src/server/rate-limit/{providers → __tests__}/ServerRateLimitProvider.spec.ts +0 -0
- /package/src/server/static/{primitives → __tests__}/$serve.spec.ts +0 -0
- /package/src/server/swagger/{primitives → __tests__}/$swagger.spec.ts +0 -0
- /package/src/sms/{primitives → __tests__}/$sms.spec.ts +0 -0
- /package/src/sms/{providers → __tests__}/MemorySmsProvider.spec.ts +0 -0
- /package/src/system/{services → __tests__}/FileDetector.spec.ts +0 -0
- /package/src/system/{providers → __tests__}/NodeFileSystemProvider.spec.ts +0 -0
- /package/src/topic/core/{primitives → __tests__}/$subscriber.spec.ts +0 -0
- /package/src/topic/core/{providers → __tests__}/MemoryTopicProvider.spec.ts +0 -0
- /package/src/topic/redis/{providers → __tests__}/RedisTopicProvider.spec.ts +0 -0
- /package/src/websocket/{primitives → __tests__}/$channel.spec.ts +0 -0
package/dist/api/users/index.js
CHANGED
|
@@ -1,23 +1,75 @@
|
|
|
1
1
|
import { $atom, $context, $inject, $module, Alepha, AlephaError, t } from "alepha";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { AuditService } from "alepha/api/audits";
|
|
3
|
+
import { $bucket } from "alepha/bucket";
|
|
4
4
|
import { $issuer, $permission, $secure, CryptoProvider, InvalidCredentialsError, SecurityProvider } from "alepha/security";
|
|
5
5
|
import { $action, BadRequestError, ConflictError, HttpError, UnauthorizedError, okSchema } from "alepha/server";
|
|
6
|
-
import { $entity, $repository, db, pageQuerySchema, parseQueryString } from "alepha/orm";
|
|
6
|
+
import { $entity, $repository, db, pageQuerySchema, parseQueryString, sql } from "alepha/orm";
|
|
7
7
|
import { $logger } from "alepha/logger";
|
|
8
|
-
import { AuditService } from "alepha/api/audits";
|
|
9
8
|
import { $client } from "alepha/server/links";
|
|
10
9
|
import { $notification } from "alepha/api/notifications";
|
|
11
10
|
import { $authCredentials, $authGithub, $authGoogle, ServerAuthProvider, authenticationProviderSchema } from "alepha/server/auth";
|
|
12
11
|
import { $etag } from "alepha/server/etag";
|
|
13
12
|
import { randomInt, randomUUID } from "node:crypto";
|
|
13
|
+
import { $cache, CacheProvider } from "alepha/cache";
|
|
14
14
|
import { DateTimeProvider } from "alepha/datetime";
|
|
15
|
-
import { FileSystemProvider } from "alepha/system";
|
|
16
|
-
import { $bucket } from "alepha/bucket";
|
|
17
15
|
import { $job } from "alepha/api/jobs";
|
|
16
|
+
import { FileSystemProvider } from "alepha/system";
|
|
18
17
|
import { AlephaApiKeys, ApiKeyService } from "alepha/api/keys";
|
|
19
18
|
import { $parameter, AlephaApiParameters } from "alepha/api/parameters";
|
|
20
19
|
import { AlephaApiVerification } from "alepha/api/verifications";
|
|
20
|
+
//#region ../../src/api/users/audits/UserAudits.ts
|
|
21
|
+
/**
|
|
22
|
+
* User-specific audit wrapper service.
|
|
23
|
+
*
|
|
24
|
+
* This service wraps the core AuditService to provide user-related audit logging.
|
|
25
|
+
* It is lazy-loaded when the `audits` feature is enabled in the realm.
|
|
26
|
+
*/
|
|
27
|
+
var UserAudits = class {
|
|
28
|
+
auditService = $inject(AuditService);
|
|
29
|
+
/**
|
|
30
|
+
* Record a user-related audit event.
|
|
31
|
+
*/
|
|
32
|
+
recordUser(action, context) {
|
|
33
|
+
return this.auditService.recordUser(action, context);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Record an authentication-related audit event.
|
|
37
|
+
*/
|
|
38
|
+
recordAuth(action, context) {
|
|
39
|
+
return this.auditService.recordAuth(action, context);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Record a generic audit event.
|
|
43
|
+
*/
|
|
44
|
+
record(category, action, context) {
|
|
45
|
+
return this.auditService.record(category, action, context);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
//#endregion
|
|
49
|
+
//#region ../../src/api/users/buckets/UserBuckets.ts
|
|
50
|
+
/**
|
|
51
|
+
* User-specific file storage wrapper service.
|
|
52
|
+
*
|
|
53
|
+
* This service provides file storage for user-related files such as:
|
|
54
|
+
* - User avatars/profile pictures
|
|
55
|
+
*
|
|
56
|
+
* It is lazy-loaded when the `avatars` feature is enabled in the realm.
|
|
57
|
+
*/
|
|
58
|
+
var UserBuckets = class {
|
|
59
|
+
/**
|
|
60
|
+
* Bucket for user avatar storage.
|
|
61
|
+
*/
|
|
62
|
+
avatars = $bucket({
|
|
63
|
+
maxSize: 5 * 1024 * 1024,
|
|
64
|
+
mimeTypes: [
|
|
65
|
+
"image/jpeg",
|
|
66
|
+
"image/png",
|
|
67
|
+
"image/gif",
|
|
68
|
+
"image/webp"
|
|
69
|
+
]
|
|
70
|
+
});
|
|
71
|
+
};
|
|
72
|
+
//#endregion
|
|
21
73
|
//#region ../../src/api/users/schemas/identityQuerySchema.ts
|
|
22
74
|
const identityQuerySchema = t.extend(pageQuerySchema, {
|
|
23
75
|
userId: t.optional(t.uuid()),
|
|
@@ -36,7 +88,7 @@ const users = $entity({
|
|
|
36
88
|
realm: db.default(t.text(), DEFAULT_USER_REALM_NAME),
|
|
37
89
|
username: t.optional(t.shortText({
|
|
38
90
|
minLength: 3,
|
|
39
|
-
maxLength:
|
|
91
|
+
maxLength: 30
|
|
40
92
|
})),
|
|
41
93
|
email: t.optional(t.string({ format: "email" })),
|
|
42
94
|
phoneNumber: t.optional(t.e164()),
|
|
@@ -45,12 +97,14 @@ const users = $entity({
|
|
|
45
97
|
lastName: t.optional(t.string()),
|
|
46
98
|
picture: t.optional(t.string()),
|
|
47
99
|
enabled: db.default(t.boolean(), true),
|
|
48
|
-
emailVerified: db.default(t.boolean(), false)
|
|
100
|
+
emailVerified: db.default(t.boolean(), false),
|
|
101
|
+
organizationId: db.organization()
|
|
49
102
|
}),
|
|
50
103
|
indexes: [
|
|
51
104
|
{
|
|
52
|
-
|
|
53
|
-
unique: true
|
|
105
|
+
expressions: (self) => [self.realm, sql`LOWER(${self.username})`],
|
|
106
|
+
unique: true,
|
|
107
|
+
name: "users_realm_username_lower_idx"
|
|
54
108
|
},
|
|
55
109
|
{
|
|
56
110
|
columns: ["realm", "email"],
|
|
@@ -91,35 +145,6 @@ const identities = $entity({
|
|
|
91
145
|
//#region ../../src/api/users/schemas/identityResourceSchema.ts
|
|
92
146
|
const identityResourceSchema = t.omit(identities.schema, ["password"]);
|
|
93
147
|
//#endregion
|
|
94
|
-
//#region ../../src/api/users/audits/UserAudits.ts
|
|
95
|
-
/**
|
|
96
|
-
* User-specific audit wrapper service.
|
|
97
|
-
*
|
|
98
|
-
* This service wraps the core AuditService to provide user-related audit logging.
|
|
99
|
-
* It is lazy-loaded when the `audits` feature is enabled in the realm.
|
|
100
|
-
*/
|
|
101
|
-
var UserAudits = class {
|
|
102
|
-
auditService = $inject(AuditService);
|
|
103
|
-
/**
|
|
104
|
-
* Record a user-related audit event.
|
|
105
|
-
*/
|
|
106
|
-
recordUser(action, context) {
|
|
107
|
-
return this.auditService.recordUser(action, context);
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Record an authentication-related audit event.
|
|
111
|
-
*/
|
|
112
|
-
recordAuth(action, context) {
|
|
113
|
-
return this.auditService.recordAuth(action, context);
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Record a generic audit event.
|
|
117
|
-
*/
|
|
118
|
-
record(category, action, context) {
|
|
119
|
-
return this.auditService.record(category, action, context);
|
|
120
|
-
}
|
|
121
|
-
};
|
|
122
|
-
//#endregion
|
|
123
148
|
//#region ../../src/api/users/atoms/realmAuthSettingsAtom.ts
|
|
124
149
|
const fieldRequirement = (description) => t.union([
|
|
125
150
|
t.const("none"),
|
|
@@ -241,7 +266,7 @@ var RealmProvider = class {
|
|
|
241
266
|
register(realmName, realmOptions = {}) {
|
|
242
267
|
if (realmName.includes(".")) throw new AlephaError(`Realm name "${realmName}" must not contain dots — dots are reserved for parameter tree paths`);
|
|
243
268
|
const features = {
|
|
244
|
-
|
|
269
|
+
jobs: false,
|
|
245
270
|
notifications: false,
|
|
246
271
|
apiKeys: false,
|
|
247
272
|
parameters: false,
|
|
@@ -912,7 +937,7 @@ var UserService = class {
|
|
|
912
937
|
});
|
|
913
938
|
const realm = this.realmProvider.getRealm(userRealmName);
|
|
914
939
|
if (data.username) {
|
|
915
|
-
if (await this.users(userRealmName).findOne({ where: { username: {
|
|
940
|
+
if (await this.users(userRealmName).findOne({ where: { username: { ilike: data.username } } })) {
|
|
916
941
|
this.log.debug("Username already taken", { username: data.username });
|
|
917
942
|
throw new BadRequestError("User with this username already exists");
|
|
918
943
|
}
|
|
@@ -1640,7 +1665,7 @@ var RegistrationService = class {
|
|
|
1640
1665
|
async checkUserAvailability(body, userRealmName) {
|
|
1641
1666
|
const userRepository = this.realmProvider.userRepository(userRealmName);
|
|
1642
1667
|
if (body.username) {
|
|
1643
|
-
if (await userRepository.findOne({ where: { username: {
|
|
1668
|
+
if (await userRepository.findOne({ where: { username: { ilike: body.username } } })) {
|
|
1644
1669
|
this.log.debug("Username already taken", { username: body.username });
|
|
1645
1670
|
throw new ConflictError("User with this username already exists");
|
|
1646
1671
|
}
|
|
@@ -1963,6 +1988,44 @@ var UserController = class {
|
|
|
1963
1988
|
});
|
|
1964
1989
|
};
|
|
1965
1990
|
//#endregion
|
|
1991
|
+
//#region ../../src/api/users/jobs/UserJobs.ts
|
|
1992
|
+
/**
|
|
1993
|
+
* User-specific jobs wrapper service.
|
|
1994
|
+
*
|
|
1995
|
+
* This service handles user-related scheduled jobs such as:
|
|
1996
|
+
* - Session purge (cleaning up expired sessions)
|
|
1997
|
+
* - Verification code cleanup
|
|
1998
|
+
* - Inactive user notifications
|
|
1999
|
+
*
|
|
2000
|
+
* It is lazy-loaded when the `sessionPurge` feature is enabled in the realm.
|
|
2001
|
+
*/
|
|
2002
|
+
var UserJobs = class {
|
|
2003
|
+
log = $logger();
|
|
2004
|
+
dateTimeProvider = $inject(DateTimeProvider);
|
|
2005
|
+
sessionRepository = $repository(sessions);
|
|
2006
|
+
/**
|
|
2007
|
+
* Purge expired sessions from the database.
|
|
2008
|
+
*
|
|
2009
|
+
* This job runs daily at 3:00 AM and removes all sessions
|
|
2010
|
+
* where the `expiresAt` timestamp has passed.
|
|
2011
|
+
*/
|
|
2012
|
+
purgeExpiredSessions = $job({
|
|
2013
|
+
cron: "0 0 * * *",
|
|
2014
|
+
handler: async () => {
|
|
2015
|
+
const now = this.dateTimeProvider.nowISOString();
|
|
2016
|
+
this.log.info("Starting expired sessions purge", { cutoffTime: now });
|
|
2017
|
+
const expiredSessions = await this.sessionRepository.findMany({ where: { expiresAt: { lt: now } } });
|
|
2018
|
+
if (expiredSessions.length === 0) {
|
|
2019
|
+
this.log.info("No expired sessions found");
|
|
2020
|
+
return;
|
|
2021
|
+
}
|
|
2022
|
+
this.log.info("Found expired sessions", { count: expiredSessions.length });
|
|
2023
|
+
const deletedIds = await this.sessionRepository.deleteMany({ expiresAt: { lt: now } });
|
|
2024
|
+
this.log.info("Expired sessions purged successfully", { deletedCount: deletedIds.length });
|
|
2025
|
+
}
|
|
2026
|
+
});
|
|
2027
|
+
};
|
|
2028
|
+
//#endregion
|
|
1966
2029
|
//#region ../../src/api/users/services/SessionService.ts
|
|
1967
2030
|
var SessionService = class SessionService {
|
|
1968
2031
|
alepha = $inject(Alepha);
|
|
@@ -2022,6 +2085,37 @@ var SessionService = class SessionService {
|
|
|
2022
2085
|
return true;
|
|
2023
2086
|
}
|
|
2024
2087
|
/**
|
|
2088
|
+
* Generate a unique username from an OAuth profile.
|
|
2089
|
+
*
|
|
2090
|
+
* 1. Extract candidate from email prefix
|
|
2091
|
+
* 2. Sanitize against realm's usernameRegExp (strip invalid chars, truncate)
|
|
2092
|
+
* 3. Check case-insensitive uniqueness, append suffix (2, 3, ...) if taken
|
|
2093
|
+
* 4. Fall back to "user" + random 6-char alphanumeric if all else fails
|
|
2094
|
+
*/
|
|
2095
|
+
async generateUniqueUsername(profile, realmSettings, users) {
|
|
2096
|
+
const maxLength = 30;
|
|
2097
|
+
const maxSuffixAttempts = 10;
|
|
2098
|
+
let candidate = profile.email?.split("@")[0] ?? profile.name ?? "";
|
|
2099
|
+
candidate = candidate.replace(/[^a-zA-Z0-9_.-]/g, "");
|
|
2100
|
+
if (realmSettings?.usernameRegExp) try {
|
|
2101
|
+
if (!new RegExp(realmSettings.usernameRegExp).test(candidate)) candidate = candidate.replace(/[^a-zA-Z0-9_]/g, "");
|
|
2102
|
+
} catch {}
|
|
2103
|
+
if (candidate.length < 3) candidate = `user${candidate}`;
|
|
2104
|
+
candidate = candidate.slice(0, maxLength - 2);
|
|
2105
|
+
const isAvailable = async (name) => {
|
|
2106
|
+
return !(await users.findMany({
|
|
2107
|
+
where: { username: { contains: name } },
|
|
2108
|
+
limit: 1
|
|
2109
|
+
})).some((u) => u.username?.toLowerCase() === name.toLowerCase());
|
|
2110
|
+
};
|
|
2111
|
+
if (await isAvailable(candidate)) return candidate;
|
|
2112
|
+
for (let i = 2; i <= maxSuffixAttempts + 1; i++) {
|
|
2113
|
+
const withSuffix = `${candidate}${i}`;
|
|
2114
|
+
if (withSuffix.length <= maxLength && await isAvailable(withSuffix)) return withSuffix;
|
|
2115
|
+
}
|
|
2116
|
+
return `user${Math.random().toString(36).slice(2, 8)}`;
|
|
2117
|
+
}
|
|
2118
|
+
/**
|
|
2025
2119
|
* Random delay to prevent timing attacks (50-200ms)
|
|
2026
2120
|
* Uses cryptographically secure random number generation
|
|
2027
2121
|
*/
|
|
@@ -2102,7 +2196,7 @@ var SessionService = class SessionService {
|
|
|
2102
2196
|
throw new InvalidCredentialsError();
|
|
2103
2197
|
}
|
|
2104
2198
|
}
|
|
2105
|
-
where.username = username;
|
|
2199
|
+
where.username = { ilike: username };
|
|
2106
2200
|
} else if (settings.email !== "none" && isEmail) where.email = username;
|
|
2107
2201
|
else if (settings.phoneNumber !== "none" && isPhone) where.phoneNumber = username;
|
|
2108
2202
|
else {
|
|
@@ -2356,9 +2450,20 @@ var SessionService = class SessionService {
|
|
|
2356
2450
|
await this.ensureAdminRole(existing, userRealmName);
|
|
2357
2451
|
return existing;
|
|
2358
2452
|
}
|
|
2453
|
+
const realmSettings = await realm.getSettings();
|
|
2454
|
+
const adminEmails = realmSettings?.adminEmails ?? [];
|
|
2455
|
+
const isAdmin = profile.email && adminEmails.includes(profile.email);
|
|
2456
|
+
if (realmSettings?.registrationAllowed === false && !isAdmin) {
|
|
2457
|
+
this.log.warn("Registration not allowed for realm via OAuth2", {
|
|
2458
|
+
provider,
|
|
2459
|
+
userRealmName
|
|
2460
|
+
});
|
|
2461
|
+
throw new BadRequestError("Account doesn't exist");
|
|
2462
|
+
}
|
|
2463
|
+
const username = await this.generateUniqueUsername(profile, realmSettings, users);
|
|
2359
2464
|
const user = await users.create({
|
|
2360
2465
|
realm: realm.name,
|
|
2361
|
-
username
|
|
2466
|
+
username,
|
|
2362
2467
|
email: profile.email,
|
|
2363
2468
|
emailVerified: true,
|
|
2364
2469
|
roles: ["user"]
|
|
@@ -2420,68 +2525,6 @@ var SessionService = class SessionService {
|
|
|
2420
2525
|
}
|
|
2421
2526
|
};
|
|
2422
2527
|
//#endregion
|
|
2423
|
-
//#region ../../src/api/users/buckets/UserBuckets.ts
|
|
2424
|
-
/**
|
|
2425
|
-
* User-specific file storage wrapper service.
|
|
2426
|
-
*
|
|
2427
|
-
* This service provides file storage for user-related files such as:
|
|
2428
|
-
* - User avatars/profile pictures
|
|
2429
|
-
*
|
|
2430
|
-
* It is lazy-loaded when the `avatars` feature is enabled in the realm.
|
|
2431
|
-
*/
|
|
2432
|
-
var UserBuckets = class {
|
|
2433
|
-
/**
|
|
2434
|
-
* Bucket for user avatar storage.
|
|
2435
|
-
*/
|
|
2436
|
-
avatars = $bucket({
|
|
2437
|
-
maxSize: 5 * 1024 * 1024,
|
|
2438
|
-
mimeTypes: [
|
|
2439
|
-
"image/jpeg",
|
|
2440
|
-
"image/png",
|
|
2441
|
-
"image/gif",
|
|
2442
|
-
"image/webp"
|
|
2443
|
-
]
|
|
2444
|
-
});
|
|
2445
|
-
};
|
|
2446
|
-
//#endregion
|
|
2447
|
-
//#region ../../src/api/users/jobs/UserJobs.ts
|
|
2448
|
-
/**
|
|
2449
|
-
* User-specific jobs wrapper service.
|
|
2450
|
-
*
|
|
2451
|
-
* This service handles user-related scheduled jobs such as:
|
|
2452
|
-
* - Session purge (cleaning up expired sessions)
|
|
2453
|
-
* - Verification code cleanup
|
|
2454
|
-
* - Inactive user notifications
|
|
2455
|
-
*
|
|
2456
|
-
* It is lazy-loaded when the `sessionPurge` feature is enabled in the realm.
|
|
2457
|
-
*/
|
|
2458
|
-
var UserJobs = class {
|
|
2459
|
-
log = $logger();
|
|
2460
|
-
dateTimeProvider = $inject(DateTimeProvider);
|
|
2461
|
-
sessionRepository = $repository(sessions);
|
|
2462
|
-
/**
|
|
2463
|
-
* Purge expired sessions from the database.
|
|
2464
|
-
*
|
|
2465
|
-
* This job runs daily at 3:00 AM and removes all sessions
|
|
2466
|
-
* where the `expiresAt` timestamp has passed.
|
|
2467
|
-
*/
|
|
2468
|
-
purgeExpiredSessions = $job({
|
|
2469
|
-
cron: "0 0 * * *",
|
|
2470
|
-
handler: async () => {
|
|
2471
|
-
const now = this.dateTimeProvider.nowISOString();
|
|
2472
|
-
this.log.info("Starting expired sessions purge", { cutoffTime: now });
|
|
2473
|
-
const expiredSessions = await this.sessionRepository.findMany({ where: { expiresAt: { lt: now } } });
|
|
2474
|
-
if (expiredSessions.length === 0) {
|
|
2475
|
-
this.log.info("No expired sessions found");
|
|
2476
|
-
return;
|
|
2477
|
-
}
|
|
2478
|
-
this.log.info("Found expired sessions", { count: expiredSessions.length });
|
|
2479
|
-
const deletedIds = await this.sessionRepository.deleteMany({ expiresAt: { lt: now } });
|
|
2480
|
-
this.log.info("Expired sessions purged successfully", { deletedCount: deletedIds.length });
|
|
2481
|
-
}
|
|
2482
|
-
});
|
|
2483
|
-
};
|
|
2484
|
-
//#endregion
|
|
2485
2528
|
//#region ../../src/api/users/primitives/$realm.ts
|
|
2486
2529
|
/**
|
|
2487
2530
|
* Already configured realm for user management.
|
|
@@ -2504,7 +2547,7 @@ const $realm = (options = {}) => {
|
|
|
2504
2547
|
const name = options.issuer?.name ?? "default";
|
|
2505
2548
|
options.settings ??= {};
|
|
2506
2549
|
const features = {
|
|
2507
|
-
|
|
2550
|
+
jobs: false,
|
|
2508
2551
|
notifications: false,
|
|
2509
2552
|
apiKeys: false,
|
|
2510
2553
|
parameters: false,
|
|
@@ -2520,7 +2563,7 @@ const $realm = (options = {}) => {
|
|
|
2520
2563
|
const realmRegistration = realmProvider.register(name, options);
|
|
2521
2564
|
if (features.avatars) alepha.with(UserBuckets);
|
|
2522
2565
|
if (features.audits) alepha.with(UserAudits);
|
|
2523
|
-
if (features.
|
|
2566
|
+
if (features.jobs) alepha.with(UserJobs);
|
|
2524
2567
|
if (features.notifications) {
|
|
2525
2568
|
alepha.with(UserNotifications);
|
|
2526
2569
|
alepha.with(AlephaApiVerification);
|
|
@@ -2667,8 +2710,6 @@ const resetPasswordSchema = t.object({
|
|
|
2667
2710
|
const AlephaApiUsers = $module({
|
|
2668
2711
|
name: "alepha.api.users",
|
|
2669
2712
|
services: [
|
|
2670
|
-
AlephaEmail,
|
|
2671
|
-
AlephaCache,
|
|
2672
2713
|
RealmProvider,
|
|
2673
2714
|
SessionService,
|
|
2674
2715
|
SessionCrudService,
|
|
@@ -2680,8 +2721,15 @@ const AlephaApiUsers = $module({
|
|
|
2680
2721
|
AdminUserController,
|
|
2681
2722
|
AdminSessionController,
|
|
2682
2723
|
AdminIdentityController,
|
|
2683
|
-
RealmController
|
|
2684
|
-
|
|
2724
|
+
RealmController,
|
|
2725
|
+
UserJobs,
|
|
2726
|
+
UserNotifications,
|
|
2727
|
+
UserAudits,
|
|
2728
|
+
UserBuckets
|
|
2729
|
+
],
|
|
2730
|
+
register: (alepha) => {
|
|
2731
|
+
alepha.with(RealmProvider).with(SessionService).with(SessionCrudService).with(CredentialService).with(RegistrationService).with(UserService).with(IdentityService).with(UserController).with(AdminUserController).with(AdminSessionController).with(AdminIdentityController).with(RealmController);
|
|
2732
|
+
}
|
|
2685
2733
|
});
|
|
2686
2734
|
//#endregion
|
|
2687
2735
|
export { $realm, AdminIdentityController, AdminSessionController, AdminUserController, AlephaApiUsers, CredentialService, DEFAULT_USER_REALM_NAME, IdentityService, RealmController, RealmProvider, RegistrationService, SessionCrudService, SessionService, UserAudits, UserBuckets, UserController, UserJobs, UserNotifications, UserService, completePasswordResetRequestSchema, completeRegistrationRequestSchema, createUserSchema, identities, identityQuerySchema, identityResourceSchema, loginSchema, passwordResetIntentResponseSchema, realmAuthSettingsAtom, realmConfigSchema, registerSchema, registrationIntentResponseSchema, resetPasswordRequestSchema, resetPasswordSchema, sessionQuerySchema, sessionResourceSchema, sessions, updateUserSchema, userQuerySchema, userResourceSchema, users };
|