alepha 0.19.0 → 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/files/index.js +5 -1
- package/dist/api/files/index.js.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 +202 -202
- 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 +989 -931
- package/dist/api/users/index.d.ts.map +1 -1
- package/dist/api/users/index.js +292 -146
- package/dist/api/users/index.js.map +1 -1
- package/dist/api/verifications/index.d.ts +132 -132
- 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 -139
- package/dist/cli/core/index.d.ts.map +1 -1
- package/dist/cli/core/index.js +283 -86
- 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.bun.js +17 -11
- package/dist/orm/postgres/index.bun.js.map +1 -1
- package/dist/orm/postgres/index.d.ts +21 -15
- package/dist/orm/postgres/index.d.ts.map +1 -1
- package/dist/orm/postgres/index.js +19 -13
- package/dist/orm/postgres/index.js.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 +3 -4
- 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 +37 -32
- package/src/api/files/{controllers → __tests__}/FileController.spec.ts +189 -143
- package/src/api/files/{services → __tests__}/FileService.spec.ts +50 -30
- package/src/api/files/controllers/FileController.ts +6 -0
- 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/__tests__/$realm.spec.ts +191 -0
- package/src/api/users/__tests__/RealmProvider.spec.ts +53 -0
- package/src/api/users/__tests__/SessionService.spec.ts +778 -0
- package/src/api/users/{jobs → __tests__}/UserJobs.spec.ts +1 -1
- package/src/api/users/atoms/realmAuthSettingsAtom.ts +24 -0
- package/src/api/users/controllers/RealmController.ts +5 -11
- package/src/api/users/entities/users.ts +9 -3
- package/src/api/users/index.ts +23 -3
- package/src/api/users/primitives/$realm.ts +23 -11
- package/src/api/users/providers/RealmProvider.ts +23 -3
- package/src/api/users/services/RegistrationService.ts +3 -2
- package/src/api/users/services/SessionService.ts +249 -8
- 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 +4 -12
- package/src/cli/core/assets.ts +0 -1
- 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 +53 -46
- package/src/cli/core/services/PackageManagerUtils.ts +8 -3
- package/src/cli/core/services/ProjectScaffolder.ts +20 -20
- 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/orm/postgres/services/PostgresModelBuilder.ts +9 -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 +3 -6
- 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/assets/devtools-ui/200.html +0 -10
- package/assets/devtools-ui/200.html.br +0 -0
- package/assets/devtools-ui/404.html +0 -10
- package/assets/devtools-ui/404.html.br +0 -0
- package/assets/devtools-ui/CNAME +0 -1
- package/assets/devtools-ui/asset.CHpVij2M.css +0 -1
- package/assets/devtools-ui/asset.CHpVij2M.css.br +0 -0
- package/assets/devtools-ui/asset.DJ-i0UDz.css +0 -1
- package/assets/devtools-ui/asset.DJ-i0UDz.css.br +0 -0
- package/assets/devtools-ui/chunk.1jwpJORo.js +0 -1
- package/assets/devtools-ui/chunk.1jwpJORo.js.br +0 -0
- package/assets/devtools-ui/chunk.B0r2wfUL.js +0 -1
- package/assets/devtools-ui/chunk.B0r2wfUL.js.br +0 -0
- package/assets/devtools-ui/chunk.BScN4dVR.js +0 -84
- package/assets/devtools-ui/chunk.BScN4dVR.js.br +0 -0
- package/assets/devtools-ui/chunk.BispuoY4.js +0 -1
- package/assets/devtools-ui/chunk.BispuoY4.js.br +0 -0
- package/assets/devtools-ui/chunk.BtrPUUd7.js +0 -2
- package/assets/devtools-ui/chunk.BtrPUUd7.js.br +0 -0
- package/assets/devtools-ui/chunk.C-KMHgqf.js +0 -1
- package/assets/devtools-ui/chunk.C-KMHgqf.js.br +0 -0
- package/assets/devtools-ui/chunk.C2zQ3CF6.js +0 -7
- package/assets/devtools-ui/chunk.C2zQ3CF6.js.br +0 -0
- package/assets/devtools-ui/chunk.C619McpO.js +0 -1
- package/assets/devtools-ui/chunk.C619McpO.js.br +0 -0
- package/assets/devtools-ui/chunk.C9OsYsVl.js +0 -1
- package/assets/devtools-ui/chunk.C9OsYsVl.js.br +0 -3
- package/assets/devtools-ui/chunk.CAC_-151.js +0 -1
- package/assets/devtools-ui/chunk.CAC_-151.js.br +0 -0
- package/assets/devtools-ui/chunk.CCmesWfx.js +0 -1
- package/assets/devtools-ui/chunk.CCmesWfx.js.br +0 -0
- package/assets/devtools-ui/chunk.CFQDmrcV.js +0 -1
- package/assets/devtools-ui/chunk.CFQDmrcV.js.br +0 -0
- package/assets/devtools-ui/chunk.CgM71Zau.js +0 -1
- package/assets/devtools-ui/chunk.CgM71Zau.js.br +0 -0
- package/assets/devtools-ui/chunk.CmHq336a.js +0 -1
- package/assets/devtools-ui/chunk.CmHq336a.js.br +0 -0
- package/assets/devtools-ui/chunk.CthNMCar.js +0 -1
- package/assets/devtools-ui/chunk.CthNMCar.js.br +0 -0
- package/assets/devtools-ui/chunk.D2brVJP1.js +0 -1
- package/assets/devtools-ui/chunk.D2brVJP1.js.br +0 -0
- package/assets/devtools-ui/chunk.DgBKGkiw.js +0 -1
- package/assets/devtools-ui/chunk.DgBKGkiw.js.br +0 -0
- package/assets/devtools-ui/chunk.NNHHCQsa.js +0 -1
- package/assets/devtools-ui/chunk.NNHHCQsa.js.br +0 -0
- package/assets/devtools-ui/chunk._CDKKWMo.js +0 -1
- package/assets/devtools-ui/chunk._CDKKWMo.js.br +0 -0
- package/assets/devtools-ui/entry.B_nOjAod.js +0 -2
- package/assets/devtools-ui/entry.B_nOjAod.js.br +0 -0
- package/assets/devtools-ui/index.html +0 -10
- package/assets/devtools-ui/index.html.br +0 -0
- package/dist/devtools/index.browser.js +0 -224
- package/dist/devtools/index.browser.js.map +0 -1
- package/dist/devtools/index.d.ts +0 -499
- package/dist/devtools/index.d.ts.map +0 -1
- package/dist/devtools/index.js +0 -782
- package/dist/devtools/index.js.map +0 -1
- package/dist/mqtt/index.d.ts +0 -164
- package/dist/mqtt/index.d.ts.map +0 -1
- package/dist/mqtt/index.js +0 -214
- package/dist/mqtt/index.js.map +0 -1
- package/dist/topic/mqtt/index.d.ts +0 -87
- package/dist/topic/mqtt/index.d.ts.map +0 -1
- package/dist/topic/mqtt/index.js +0 -88
- package/dist/topic/mqtt/index.js.map +0 -1
- package/src/api/users/parameters/UserParameters.ts +0 -23
- package/src/api/users/services/SessionService.spec.ts +0 -303
- 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/devtools/__tests__/DevCollectorProvider.spec.ts +0 -7
- package/src/devtools/assets.ts +0 -6
- package/src/devtools/entities/logs.ts +0 -21
- package/src/devtools/index.browser.ts +0 -11
- package/src/devtools/index.shared.ts +0 -15
- package/src/devtools/index.ts +0 -39
- package/src/devtools/providers/DevToolsMetadataProvider.ts +0 -459
- package/src/devtools/providers/DevToolsProvider.ts +0 -280
- package/src/devtools/schemas/DevActionMetadata.ts +0 -30
- package/src/devtools/schemas/DevAtomMetadata.ts +0 -26
- package/src/devtools/schemas/DevBucketMetadata.ts +0 -11
- package/src/devtools/schemas/DevCacheMetadata.ts +0 -10
- package/src/devtools/schemas/DevEntityMetadata.ts +0 -60
- package/src/devtools/schemas/DevEnvMetadata.ts +0 -22
- package/src/devtools/schemas/DevMetadata.ts +0 -47
- package/src/devtools/schemas/DevModuleMetadata.ts +0 -8
- package/src/devtools/schemas/DevPageMetadata.ts +0 -24
- package/src/devtools/schemas/DevProviderMetadata.ts +0 -10
- package/src/devtools/schemas/DevQueueMetadata.ts +0 -10
- package/src/devtools/schemas/DevRealmMetadata.ts +0 -19
- package/src/devtools/schemas/DevRouteMetadata.ts +0 -8
- package/src/devtools/schemas/DevSchedulerMetadata.ts +0 -11
- package/src/devtools/schemas/DevTopicMetadata.ts +0 -11
- package/src/mqtt/index.ts +0 -32
- package/src/mqtt/providers/MqttClientProvider.ts +0 -63
- package/src/mqtt/providers/MqttJsClientProvider.spec.ts +0 -165
- package/src/mqtt/providers/MqttJsClientProvider.ts +0 -309
- package/src/topic/mqtt/index.ts +0 -30
- package/src/topic/mqtt/providers/MqttTopicProvider.spec.ts +0 -160
- package/src/topic/mqtt/providers/MqttTopicProvider.ts +0 -146
- /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/{jobs → __tests__}/FileJobs.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/{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/{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 {
|
|
2
|
+
import { AuditService } from "alepha/api/audits";
|
|
3
|
+
import { $bucket } from "alepha/bucket";
|
|
3
4
|
import { $issuer, $permission, $secure, CryptoProvider, InvalidCredentialsError, SecurityProvider } from "alepha/security";
|
|
4
5
|
import { $action, BadRequestError, ConflictError, HttpError, UnauthorizedError, okSchema } from "alepha/server";
|
|
5
|
-
import { $entity, $repository, db, pageQuerySchema, parseQueryString } from "alepha/orm";
|
|
6
|
+
import { $entity, $repository, db, pageQuerySchema, parseQueryString, sql } from "alepha/orm";
|
|
6
7
|
import { $logger } from "alepha/logger";
|
|
7
|
-
import { AuditService } from "alepha/api/audits";
|
|
8
8
|
import { $client } from "alepha/server/links";
|
|
9
9
|
import { $notification } from "alepha/api/notifications";
|
|
10
10
|
import { $authCredentials, $authGithub, $authGoogle, ServerAuthProvider, authenticationProviderSchema } from "alepha/server/auth";
|
|
11
11
|
import { $etag } from "alepha/server/etag";
|
|
12
12
|
import { randomInt, randomUUID } from "node:crypto";
|
|
13
|
-
import { $cache } from "alepha/cache";
|
|
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";
|
|
18
|
-
import {
|
|
16
|
+
import { FileSystemProvider } from "alepha/system";
|
|
19
17
|
import { AlephaApiKeys, ApiKeyService } from "alepha/api/keys";
|
|
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"),
|
|
@@ -153,6 +178,23 @@ const realmAuthSettingsAtom = $atom({
|
|
|
153
178
|
requireLowercase: t.boolean({ description: "Require at least one lowercase letter" }),
|
|
154
179
|
requireNumbers: t.boolean({ description: "Require at least one number" }),
|
|
155
180
|
requireSpecialCharacters: t.boolean({ description: "Require at least one special character" })
|
|
181
|
+
}),
|
|
182
|
+
loginRateLimit: t.object({
|
|
183
|
+
ipMaxAttempts: t.integer({
|
|
184
|
+
description: "Max failed login attempts per IP before temporary lockout",
|
|
185
|
+
default: 15,
|
|
186
|
+
minimum: 1
|
|
187
|
+
}),
|
|
188
|
+
accountMaxAttempts: t.integer({
|
|
189
|
+
description: "Max failed login attempts per account before temporary lockout",
|
|
190
|
+
default: 5,
|
|
191
|
+
minimum: 1
|
|
192
|
+
}),
|
|
193
|
+
windowMs: t.integer({
|
|
194
|
+
description: "Rate limit window duration in milliseconds",
|
|
195
|
+
default: 900 * 1e3,
|
|
196
|
+
minimum: 1e3
|
|
197
|
+
})
|
|
156
198
|
})
|
|
157
199
|
}),
|
|
158
200
|
default: {
|
|
@@ -173,6 +215,11 @@ const realmAuthSettingsAtom = $atom({
|
|
|
173
215
|
requireLowercase: true,
|
|
174
216
|
requireNumbers: true,
|
|
175
217
|
requireSpecialCharacters: false
|
|
218
|
+
},
|
|
219
|
+
loginRateLimit: {
|
|
220
|
+
ipMaxAttempts: 15,
|
|
221
|
+
accountMaxAttempts: 5,
|
|
222
|
+
windowMs: 900 * 1e3
|
|
176
223
|
}
|
|
177
224
|
}
|
|
178
225
|
});
|
|
@@ -217,8 +264,9 @@ var RealmProvider = class {
|
|
|
217
264
|
defaultUsers = $repository(users);
|
|
218
265
|
realms = /* @__PURE__ */ new Map();
|
|
219
266
|
register(realmName, realmOptions = {}) {
|
|
267
|
+
if (realmName.includes(".")) throw new AlephaError(`Realm name "${realmName}" must not contain dots — dots are reserved for parameter tree paths`);
|
|
220
268
|
const features = {
|
|
221
|
-
|
|
269
|
+
jobs: false,
|
|
222
270
|
notifications: false,
|
|
223
271
|
apiKeys: false,
|
|
224
272
|
parameters: false,
|
|
@@ -226,7 +274,7 @@ var RealmProvider = class {
|
|
|
226
274
|
audits: false,
|
|
227
275
|
...realmOptions.features
|
|
228
276
|
};
|
|
229
|
-
|
|
277
|
+
const realm = {
|
|
230
278
|
name: realmName,
|
|
231
279
|
repositories: {
|
|
232
280
|
identities: realmOptions.entities?.identities ?? this.defaultIdentities,
|
|
@@ -239,10 +287,19 @@ var RealmProvider = class {
|
|
|
239
287
|
passwordPolicy: {
|
|
240
288
|
...realmAuthSettingsAtom.options.default.passwordPolicy,
|
|
241
289
|
...realmOptions.settings?.passwordPolicy
|
|
290
|
+
},
|
|
291
|
+
loginRateLimit: {
|
|
292
|
+
...realmAuthSettingsAtom.options.default.loginRateLimit,
|
|
293
|
+
...realmOptions.settings?.loginRateLimit
|
|
242
294
|
}
|
|
243
295
|
},
|
|
244
|
-
features
|
|
245
|
-
|
|
296
|
+
features,
|
|
297
|
+
getSettings: async function() {
|
|
298
|
+
if (this.settingsParameter) return await this.settingsParameter.get();
|
|
299
|
+
return this.settings;
|
|
300
|
+
}
|
|
301
|
+
};
|
|
302
|
+
this.realms.set(realmName, realm);
|
|
246
303
|
return this.getRealm(realmName);
|
|
247
304
|
}
|
|
248
305
|
/**
|
|
@@ -880,7 +937,7 @@ var UserService = class {
|
|
|
880
937
|
});
|
|
881
938
|
const realm = this.realmProvider.getRealm(userRealmName);
|
|
882
939
|
if (data.username) {
|
|
883
|
-
if (await this.users(userRealmName).findOne({ where: { username: {
|
|
940
|
+
if (await this.users(userRealmName).findOne({ where: { username: { ilike: data.username } } })) {
|
|
884
941
|
this.log.debug("Username already taken", { username: data.username });
|
|
885
942
|
throw new BadRequestError("User with this username already exists");
|
|
886
943
|
}
|
|
@@ -1089,13 +1146,15 @@ var RealmController = class {
|
|
|
1089
1146
|
group: this.group,
|
|
1090
1147
|
method: "GET",
|
|
1091
1148
|
path: `${this.url}/config`,
|
|
1092
|
-
use: [$etag(
|
|
1149
|
+
use: [$etag()],
|
|
1093
1150
|
schema: {
|
|
1094
1151
|
query: t.object({ realmName: t.optional(t.string()) }),
|
|
1095
1152
|
response: realmConfigSchema
|
|
1096
1153
|
},
|
|
1097
|
-
handler: ({ query }) => {
|
|
1098
|
-
const
|
|
1154
|
+
handler: async ({ query }) => {
|
|
1155
|
+
const realm = this.realmProvider.getRealm(query.realmName);
|
|
1156
|
+
const settings = await realm.getSettings();
|
|
1157
|
+
const realmName = realm.name;
|
|
1099
1158
|
return {
|
|
1100
1159
|
settings,
|
|
1101
1160
|
realmName,
|
|
@@ -1448,7 +1507,7 @@ var RegistrationService = class {
|
|
|
1448
1507
|
username: body.username,
|
|
1449
1508
|
userRealmName
|
|
1450
1509
|
});
|
|
1451
|
-
const realmSettings = this.realmProvider.getRealm(userRealmName).
|
|
1510
|
+
const realmSettings = await this.realmProvider.getRealm(userRealmName).getSettings();
|
|
1452
1511
|
if (realmSettings?.registrationAllowed === false) {
|
|
1453
1512
|
this.log.warn("Registration not allowed for realm", { userRealmName });
|
|
1454
1513
|
throw new BadRequestError("Registration is not allowed");
|
|
@@ -1606,7 +1665,7 @@ var RegistrationService = class {
|
|
|
1606
1665
|
async checkUserAvailability(body, userRealmName) {
|
|
1607
1666
|
const userRepository = this.realmProvider.userRepository(userRealmName);
|
|
1608
1667
|
if (body.username) {
|
|
1609
|
-
if (await userRepository.findOne({ where: { username: {
|
|
1668
|
+
if (await userRepository.findOne({ where: { username: { ilike: body.username } } })) {
|
|
1610
1669
|
this.log.debug("Username already taken", { username: body.username });
|
|
1611
1670
|
throw new ConflictError("User with this username already exists");
|
|
1612
1671
|
}
|
|
@@ -1929,8 +1988,46 @@ var UserController = class {
|
|
|
1929
1988
|
});
|
|
1930
1989
|
};
|
|
1931
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
|
|
1932
2029
|
//#region ../../src/api/users/services/SessionService.ts
|
|
1933
|
-
var SessionService = class {
|
|
2030
|
+
var SessionService = class SessionService {
|
|
1934
2031
|
alepha = $inject(Alepha);
|
|
1935
2032
|
fsp = $inject(FileSystemProvider);
|
|
1936
2033
|
dateTimeProvider = $inject(DateTimeProvider);
|
|
@@ -1938,6 +2035,7 @@ var SessionService = class {
|
|
|
1938
2035
|
log = $logger();
|
|
1939
2036
|
realmProvider = $inject(RealmProvider);
|
|
1940
2037
|
fileController = $client();
|
|
2038
|
+
cacheProvider = $inject(CacheProvider);
|
|
1941
2039
|
userAudits(realmName) {
|
|
1942
2040
|
if (this.realmProvider.getRealm(realmName).features.audits) return this.alepha.inject(UserAudits);
|
|
1943
2041
|
}
|
|
@@ -1956,7 +2054,9 @@ var SessionService = class {
|
|
|
1956
2054
|
*/
|
|
1957
2055
|
async ensureAdminRole(user, userRealmName) {
|
|
1958
2056
|
if (user.roles.includes("admin")) return false;
|
|
1959
|
-
const
|
|
2057
|
+
const realm = this.realmProvider.getRealm(userRealmName);
|
|
2058
|
+
const settings = await realm.getSettings();
|
|
2059
|
+
const { name } = realm;
|
|
1960
2060
|
const adminEmails = settings.adminEmails ?? [];
|
|
1961
2061
|
const adminUsernames = settings.adminUsernames ?? [];
|
|
1962
2062
|
const isAdminByEmail = user.email && adminEmails.includes(user.email);
|
|
@@ -1985,22 +2085,94 @@ var SessionService = class {
|
|
|
1985
2085
|
return true;
|
|
1986
2086
|
}
|
|
1987
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
|
+
/**
|
|
1988
2119
|
* Random delay to prevent timing attacks (50-200ms)
|
|
1989
2120
|
* Uses cryptographically secure random number generation
|
|
1990
2121
|
*/
|
|
1991
2122
|
randomDelay() {
|
|
1992
2123
|
return new Promise((resolve) => setTimeout(resolve, randomInt(50, 201)));
|
|
1993
2124
|
}
|
|
2125
|
+
static LOGIN_CACHE_NAME = "login-rate-limit";
|
|
2126
|
+
/**
|
|
2127
|
+
* Check if a login key is currently locked out.
|
|
2128
|
+
* Read-only — does not increment the counter.
|
|
2129
|
+
*/
|
|
2130
|
+
async isLoginLocked(key, max) {
|
|
2131
|
+
try {
|
|
2132
|
+
const count = await this.cacheProvider.getTyped(SessionService.LOGIN_CACHE_NAME, key);
|
|
2133
|
+
return count != null && count >= max;
|
|
2134
|
+
} catch (error) {
|
|
2135
|
+
this.log.warn("Failed to check login rate limit, allowing attempt", error);
|
|
2136
|
+
return false;
|
|
2137
|
+
}
|
|
2138
|
+
}
|
|
2139
|
+
/**
|
|
2140
|
+
* Record a failed login attempt. Uses getTyped + setTyped (not incr) so that
|
|
2141
|
+
* each write refreshes the TTL — implementing sliding-window behavior.
|
|
2142
|
+
*
|
|
2143
|
+
* Returns `true` if this failure just crossed the lockout threshold.
|
|
2144
|
+
*/
|
|
2145
|
+
async recordFailedLogin(key, max, windowMs) {
|
|
2146
|
+
try {
|
|
2147
|
+
const newCount = (await this.cacheProvider.getTyped(SessionService.LOGIN_CACHE_NAME, key) ?? 0) + 1;
|
|
2148
|
+
await this.cacheProvider.setTyped(SessionService.LOGIN_CACHE_NAME, key, newCount, { ttl: windowMs });
|
|
2149
|
+
return newCount === max;
|
|
2150
|
+
} catch (error) {
|
|
2151
|
+
this.log.warn("Failed to record failed login attempt", error);
|
|
2152
|
+
return false;
|
|
2153
|
+
}
|
|
2154
|
+
}
|
|
1994
2155
|
/**
|
|
1995
2156
|
* Validate user credentials and return the user if valid.
|
|
1996
2157
|
*/
|
|
1997
2158
|
async login(provider, username, password, userRealmName) {
|
|
1998
|
-
const
|
|
2159
|
+
const realm = this.realmProvider.getRealm(userRealmName);
|
|
2160
|
+
const settings = await realm.getSettings();
|
|
2161
|
+
const { name } = realm;
|
|
2162
|
+
const { loginRateLimit } = settings;
|
|
1999
2163
|
const isEmail = username.includes("@");
|
|
2000
2164
|
const isPhone = /^[+\d][\d\s()-]+$/.test(username);
|
|
2001
2165
|
const isUsername = !isEmail && !isPhone;
|
|
2002
2166
|
const identities = this.identities(userRealmName);
|
|
2003
2167
|
const users = this.users(userRealmName);
|
|
2168
|
+
const request = this.alepha.store.get("alepha.http.request");
|
|
2169
|
+
const ipKey = request?.ip ? `login:ip:${request.ip}` : void 0;
|
|
2170
|
+
if (ipKey) {
|
|
2171
|
+
if (await this.isLoginLocked(ipKey, loginRateLimit.ipMaxAttempts)) {
|
|
2172
|
+
this.log.warn("Login blocked — IP rate limit exceeded", { ip: request?.ip });
|
|
2173
|
+
throw new InvalidCredentialsError();
|
|
2174
|
+
}
|
|
2175
|
+
}
|
|
2004
2176
|
await this.randomDelay();
|
|
2005
2177
|
try {
|
|
2006
2178
|
const where = users.createQueryWhere();
|
|
@@ -2024,7 +2196,7 @@ var SessionService = class {
|
|
|
2024
2196
|
throw new InvalidCredentialsError();
|
|
2025
2197
|
}
|
|
2026
2198
|
}
|
|
2027
|
-
where.username = username;
|
|
2199
|
+
where.username = { ilike: username };
|
|
2028
2200
|
} else if (settings.email !== "none" && isEmail) where.email = username;
|
|
2029
2201
|
else if (settings.phoneNumber !== "none" && isPhone) where.phoneNumber = username;
|
|
2030
2202
|
else {
|
|
@@ -2058,6 +2230,22 @@ var SessionService = class {
|
|
|
2058
2230
|
username
|
|
2059
2231
|
}
|
|
2060
2232
|
});
|
|
2233
|
+
if (ipKey) {
|
|
2234
|
+
if (await this.recordFailedLogin(ipKey, loginRateLimit.ipMaxAttempts, loginRateLimit.windowMs)) await this.userAudits(userRealmName)?.record("security", "rate_limited", {
|
|
2235
|
+
userRealm: name,
|
|
2236
|
+
success: false,
|
|
2237
|
+
description: "IP temporarily locked due to too many failed login attempts",
|
|
2238
|
+
metadata: { ip: request?.ip }
|
|
2239
|
+
});
|
|
2240
|
+
}
|
|
2241
|
+
throw new InvalidCredentialsError();
|
|
2242
|
+
}
|
|
2243
|
+
const accountKey = `login:account:${name}:${user.id}`;
|
|
2244
|
+
if (await this.isLoginLocked(accountKey, loginRateLimit.accountMaxAttempts)) {
|
|
2245
|
+
this.log.warn("Login blocked — account rate limit exceeded", {
|
|
2246
|
+
userId: user.id,
|
|
2247
|
+
realm: name
|
|
2248
|
+
});
|
|
2061
2249
|
throw new InvalidCredentialsError();
|
|
2062
2250
|
}
|
|
2063
2251
|
const identity = await identities.getOne({ where: {
|
|
@@ -2089,6 +2277,21 @@ var SessionService = class {
|
|
|
2089
2277
|
username
|
|
2090
2278
|
}
|
|
2091
2279
|
});
|
|
2280
|
+
if (ipKey) {
|
|
2281
|
+
if (await this.recordFailedLogin(ipKey, loginRateLimit.ipMaxAttempts, loginRateLimit.windowMs)) await this.userAudits(userRealmName)?.record("security", "rate_limited", {
|
|
2282
|
+
userRealm: name,
|
|
2283
|
+
success: false,
|
|
2284
|
+
description: "IP temporarily locked due to too many failed login attempts",
|
|
2285
|
+
metadata: { ip: request?.ip }
|
|
2286
|
+
});
|
|
2287
|
+
}
|
|
2288
|
+
if (await this.recordFailedLogin(accountKey, loginRateLimit.accountMaxAttempts, loginRateLimit.windowMs)) await this.userAudits(userRealmName)?.record("security", "rate_limited", {
|
|
2289
|
+
userRealm: name,
|
|
2290
|
+
resourceId: user.id,
|
|
2291
|
+
success: false,
|
|
2292
|
+
description: "Account temporarily locked due to too many failed login attempts",
|
|
2293
|
+
metadata: { userId: user.id }
|
|
2294
|
+
});
|
|
2092
2295
|
throw new InvalidCredentialsError();
|
|
2093
2296
|
}
|
|
2094
2297
|
await this.userAudits(userRealmName)?.recordAuth("login", {
|
|
@@ -2247,9 +2450,20 @@ var SessionService = class {
|
|
|
2247
2450
|
await this.ensureAdminRole(existing, userRealmName);
|
|
2248
2451
|
return existing;
|
|
2249
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);
|
|
2250
2464
|
const user = await users.create({
|
|
2251
2465
|
realm: realm.name,
|
|
2252
|
-
username
|
|
2466
|
+
username,
|
|
2253
2467
|
email: profile.email,
|
|
2254
2468
|
emailVerified: true,
|
|
2255
2469
|
roles: ["user"]
|
|
@@ -2311,90 +2525,6 @@ var SessionService = class {
|
|
|
2311
2525
|
}
|
|
2312
2526
|
};
|
|
2313
2527
|
//#endregion
|
|
2314
|
-
//#region ../../src/api/users/buckets/UserBuckets.ts
|
|
2315
|
-
/**
|
|
2316
|
-
* User-specific file storage wrapper service.
|
|
2317
|
-
*
|
|
2318
|
-
* This service provides file storage for user-related files such as:
|
|
2319
|
-
* - User avatars/profile pictures
|
|
2320
|
-
*
|
|
2321
|
-
* It is lazy-loaded when the `avatars` feature is enabled in the realm.
|
|
2322
|
-
*/
|
|
2323
|
-
var UserBuckets = class {
|
|
2324
|
-
/**
|
|
2325
|
-
* Bucket for user avatar storage.
|
|
2326
|
-
*/
|
|
2327
|
-
avatars = $bucket({
|
|
2328
|
-
maxSize: 5 * 1024 * 1024,
|
|
2329
|
-
mimeTypes: [
|
|
2330
|
-
"image/jpeg",
|
|
2331
|
-
"image/png",
|
|
2332
|
-
"image/gif",
|
|
2333
|
-
"image/webp"
|
|
2334
|
-
]
|
|
2335
|
-
});
|
|
2336
|
-
};
|
|
2337
|
-
//#endregion
|
|
2338
|
-
//#region ../../src/api/users/jobs/UserJobs.ts
|
|
2339
|
-
/**
|
|
2340
|
-
* User-specific jobs wrapper service.
|
|
2341
|
-
*
|
|
2342
|
-
* This service handles user-related scheduled jobs such as:
|
|
2343
|
-
* - Session purge (cleaning up expired sessions)
|
|
2344
|
-
* - Verification code cleanup
|
|
2345
|
-
* - Inactive user notifications
|
|
2346
|
-
*
|
|
2347
|
-
* It is lazy-loaded when the `sessionPurge` feature is enabled in the realm.
|
|
2348
|
-
*/
|
|
2349
|
-
var UserJobs = class {
|
|
2350
|
-
log = $logger();
|
|
2351
|
-
dateTimeProvider = $inject(DateTimeProvider);
|
|
2352
|
-
sessionRepository = $repository(sessions);
|
|
2353
|
-
/**
|
|
2354
|
-
* Purge expired sessions from the database.
|
|
2355
|
-
*
|
|
2356
|
-
* This job runs daily at 3:00 AM and removes all sessions
|
|
2357
|
-
* where the `expiresAt` timestamp has passed.
|
|
2358
|
-
*/
|
|
2359
|
-
purgeExpiredSessions = $job({
|
|
2360
|
-
cron: "0 0 * * *",
|
|
2361
|
-
handler: async () => {
|
|
2362
|
-
const now = this.dateTimeProvider.nowISOString();
|
|
2363
|
-
this.log.info("Starting expired sessions purge", { cutoffTime: now });
|
|
2364
|
-
const expiredSessions = await this.sessionRepository.findMany({ where: { expiresAt: { lt: now } } });
|
|
2365
|
-
if (expiredSessions.length === 0) {
|
|
2366
|
-
this.log.info("No expired sessions found");
|
|
2367
|
-
return;
|
|
2368
|
-
}
|
|
2369
|
-
this.log.info("Found expired sessions", { count: expiredSessions.length });
|
|
2370
|
-
const deletedIds = await this.sessionRepository.deleteMany({ expiresAt: { lt: now } });
|
|
2371
|
-
this.log.info("Expired sessions purged successfully", { deletedCount: deletedIds.length });
|
|
2372
|
-
}
|
|
2373
|
-
});
|
|
2374
|
-
};
|
|
2375
|
-
//#endregion
|
|
2376
|
-
//#region ../../src/api/users/parameters/UserParameters.ts
|
|
2377
|
-
/**
|
|
2378
|
-
* User-specific parameter service.
|
|
2379
|
-
*
|
|
2380
|
-
* This service wraps the core ParameterProvider to provide realm settings management.
|
|
2381
|
-
* It is lazy-loaded when the `parameters` feature is enabled in the realm.
|
|
2382
|
-
*/
|
|
2383
|
-
var UserParameters = class {
|
|
2384
|
-
/**
|
|
2385
|
-
* Realm authentication settings parameter.
|
|
2386
|
-
*
|
|
2387
|
-
* Controls user registration, login methods, verification requirements,
|
|
2388
|
-
* and password policies for the realm.
|
|
2389
|
-
*/
|
|
2390
|
-
realmSettings = $parameter({
|
|
2391
|
-
name: "api.users.realmSettings",
|
|
2392
|
-
description: "Realm authentication and registration settings",
|
|
2393
|
-
schema: realmAuthSettingsAtom.schema,
|
|
2394
|
-
default: realmAuthSettingsAtom.options.default
|
|
2395
|
-
});
|
|
2396
|
-
};
|
|
2397
|
-
//#endregion
|
|
2398
2528
|
//#region ../../src/api/users/primitives/$realm.ts
|
|
2399
2529
|
/**
|
|
2400
2530
|
* Already configured realm for user management.
|
|
@@ -2417,7 +2547,7 @@ const $realm = (options = {}) => {
|
|
|
2417
2547
|
const name = options.issuer?.name ?? "default";
|
|
2418
2548
|
options.settings ??= {};
|
|
2419
2549
|
const features = {
|
|
2420
|
-
|
|
2550
|
+
jobs: false,
|
|
2421
2551
|
notifications: false,
|
|
2422
2552
|
apiKeys: false,
|
|
2423
2553
|
parameters: false,
|
|
@@ -2433,12 +2563,11 @@ const $realm = (options = {}) => {
|
|
|
2433
2563
|
const realmRegistration = realmProvider.register(name, options);
|
|
2434
2564
|
if (features.avatars) alepha.with(UserBuckets);
|
|
2435
2565
|
if (features.audits) alepha.with(UserAudits);
|
|
2436
|
-
if (features.
|
|
2566
|
+
if (features.jobs) alepha.with(UserJobs);
|
|
2437
2567
|
if (features.notifications) {
|
|
2438
2568
|
alepha.with(UserNotifications);
|
|
2439
2569
|
alepha.with(AlephaApiVerification);
|
|
2440
2570
|
}
|
|
2441
|
-
if (features.parameters) alepha.with(AlephaApiParameters);
|
|
2442
2571
|
const customResolvers = [...options.issuer?.resolvers ?? []];
|
|
2443
2572
|
if (features.apiKeys) {
|
|
2444
2573
|
alepha.with(AlephaApiKeys);
|
|
@@ -2494,6 +2623,17 @@ const $realm = (options = {}) => {
|
|
|
2494
2623
|
if (identities.github) auth.github = $authGithub(realm);
|
|
2495
2624
|
alepha.with(() => auth);
|
|
2496
2625
|
}
|
|
2626
|
+
if (features.parameters) {
|
|
2627
|
+
alepha.with(AlephaApiParameters);
|
|
2628
|
+
const settingsParam = $parameter({
|
|
2629
|
+
name: `api.realms.settings.${name}`,
|
|
2630
|
+
description: `Authentication and registration settings for realm "${name}"`,
|
|
2631
|
+
schema: realmAuthSettingsAtom.schema,
|
|
2632
|
+
default: realmRegistration.settings
|
|
2633
|
+
});
|
|
2634
|
+
realmRegistration.settingsParameter = settingsParam;
|
|
2635
|
+
alepha.with(() => ({ [`realmSettings_${name}`]: settingsParam }));
|
|
2636
|
+
}
|
|
2497
2637
|
return realm;
|
|
2498
2638
|
};
|
|
2499
2639
|
//#endregion
|
|
@@ -2570,7 +2710,6 @@ const resetPasswordSchema = t.object({
|
|
|
2570
2710
|
const AlephaApiUsers = $module({
|
|
2571
2711
|
name: "alepha.api.users",
|
|
2572
2712
|
services: [
|
|
2573
|
-
AlephaEmail,
|
|
2574
2713
|
RealmProvider,
|
|
2575
2714
|
SessionService,
|
|
2576
2715
|
SessionCrudService,
|
|
@@ -2582,10 +2721,17 @@ const AlephaApiUsers = $module({
|
|
|
2582
2721
|
AdminUserController,
|
|
2583
2722
|
AdminSessionController,
|
|
2584
2723
|
AdminIdentityController,
|
|
2585
|
-
RealmController
|
|
2586
|
-
|
|
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
|
+
}
|
|
2587
2733
|
});
|
|
2588
2734
|
//#endregion
|
|
2589
|
-
export { $realm, AdminIdentityController, AdminSessionController, AdminUserController, AlephaApiUsers, CredentialService, DEFAULT_USER_REALM_NAME, IdentityService, RealmController, RealmProvider, RegistrationService, SessionCrudService, SessionService, UserAudits, UserBuckets, UserController, UserJobs, UserNotifications,
|
|
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 };
|
|
2590
2736
|
|
|
2591
2737
|
//# sourceMappingURL=index.js.map
|