alepha 0.13.7 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -2
- package/assets/swagger-ui/swagger-ui-bundle.js +1 -1
- package/assets/swagger-ui/swagger-ui-standalone-preset.js +1 -1
- package/assets/swagger-ui/swagger-ui.css +1 -1
- package/dist/{api-audits → api/audits}/index.browser.js +4 -4
- package/dist/api/audits/index.browser.js.map +1 -0
- package/dist/{api-audits → api/audits}/index.d.ts +10 -9
- package/dist/api/audits/index.d.ts.map +1 -0
- package/dist/{api-audits → api/audits}/index.js +8 -8
- package/dist/api/audits/index.js.map +1 -0
- package/dist/{api-files → api/files}/index.browser.js +5 -5
- package/dist/api/files/index.browser.js.map +1 -0
- package/dist/{api-files → api/files}/index.d.ts +18 -10
- package/dist/api/files/index.d.ts.map +1 -0
- package/dist/{api-files → api/files}/index.js +10 -10
- package/dist/api/files/index.js.map +1 -0
- package/dist/{api-jobs → api/jobs}/index.browser.js +5 -5
- package/dist/api/jobs/index.browser.js.map +1 -0
- package/dist/{api-jobs → api/jobs}/index.d.ts +168 -167
- package/dist/api/jobs/index.d.ts.map +1 -0
- package/dist/{api-jobs → api/jobs}/index.js +9 -9
- package/dist/api/jobs/index.js.map +1 -0
- package/dist/{api-notifications → api/notifications}/index.browser.js +11 -11
- package/dist/api/notifications/index.browser.js.map +1 -0
- package/dist/api/notifications/index.d.ts +327 -0
- package/dist/api/notifications/index.d.ts.map +1 -0
- package/dist/{api-notifications → api/notifications}/index.js +11 -11
- package/dist/api/notifications/index.js.map +1 -0
- package/dist/{api-parameters → api/parameters}/index.browser.js +2 -2
- package/dist/api/parameters/index.browser.js.map +1 -0
- package/dist/{api-parameters → api/parameters}/index.d.ts +11 -11
- package/dist/api/parameters/index.d.ts.map +1 -0
- package/dist/{api-parameters → api/parameters}/index.js +7 -7
- package/dist/api/parameters/index.js.map +1 -0
- package/dist/{api-users → api/users}/index.browser.js +6 -6
- package/dist/api/users/index.browser.js.map +1 -0
- package/dist/{api-users → api/users}/index.d.ts +836 -836
- package/dist/api/users/index.d.ts.map +1 -0
- package/dist/{api-users → api/users}/index.js +99 -766
- package/dist/api/users/index.js.map +1 -0
- package/dist/{api-verifications → api/verifications}/index.browser.js +5 -5
- package/dist/api/verifications/index.browser.js.map +1 -0
- package/dist/api/verifications/index.d.ts +248 -0
- package/dist/api/verifications/index.d.ts.map +1 -0
- package/dist/{api-verifications → api/verifications}/index.js +11 -11
- package/dist/api/verifications/index.js.map +1 -0
- package/dist/batch/index.d.ts.map +1 -0
- package/dist/bucket/index.d.ts.map +1 -0
- package/dist/cache/{index.d.ts → core/index.d.ts} +4 -4
- package/dist/cache/core/index.d.ts.map +1 -0
- package/dist/cache/{index.js → core/index.js} +5 -5
- package/dist/cache/core/index.js.map +1 -0
- package/dist/{cache-redis → cache/redis}/index.d.ts +2 -2
- package/dist/cache/redis/index.d.ts.map +1 -0
- package/dist/{cache-redis → cache/redis}/index.js +2 -2
- package/dist/cache/redis/index.js.map +1 -0
- package/dist/cli/index.d.ts +78 -58
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +454 -154
- package/dist/cli/index.js.map +1 -1
- package/dist/command/index.d.ts +15 -5
- package/dist/command/index.d.ts.map +1 -0
- package/dist/command/index.js +45 -6
- package/dist/command/index.js.map +1 -1
- package/dist/core/index.browser.js +1334 -1318
- package/dist/core/index.browser.js.map +1 -1
- package/dist/core/index.d.ts +75 -71
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +1337 -1321
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.native.js +1337 -1321
- package/dist/core/index.native.js.map +1 -1
- package/dist/datetime/index.d.ts.map +1 -0
- package/dist/email/index.d.ts.map +1 -0
- package/dist/fake/index.d.ts.map +1 -0
- package/dist/file/index.d.ts.map +1 -0
- package/dist/lock/{index.d.ts → core/index.d.ts} +5 -5
- package/dist/lock/core/index.d.ts.map +1 -0
- package/dist/lock/{index.js → core/index.js} +5 -5
- package/dist/lock/core/index.js.map +1 -0
- package/dist/{lock-redis → lock/redis}/index.d.ts +2 -2
- package/dist/lock/redis/index.d.ts.map +1 -0
- package/dist/{lock-redis → lock/redis}/index.js +2 -2
- package/dist/lock/redis/index.js.map +1 -0
- package/dist/logger/index.d.ts +1 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/mcp/index.d.ts +820 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +978 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/orm/index.d.ts +180 -107
- package/dist/orm/index.d.ts.map +1 -0
- package/dist/orm/index.js +260 -174
- package/dist/orm/index.js.map +1 -1
- package/dist/queue/core/index.d.ts +548 -0
- package/dist/queue/core/index.d.ts.map +1 -0
- package/dist/queue/core/index.js +391 -0
- package/dist/queue/core/index.js.map +1 -0
- package/dist/queue/redis/index.d.ts +28 -0
- package/dist/queue/redis/index.d.ts.map +1 -0
- package/dist/queue/redis/index.js +43 -0
- package/dist/queue/redis/index.js.map +1 -0
- package/dist/redis/index.d.ts.map +1 -0
- package/dist/retry/index.d.ts.map +1 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/scheduler/index.d.ts +1 -1
- package/dist/scheduler/index.d.ts.map +1 -0
- package/dist/scheduler/index.js +1 -393
- package/dist/scheduler/index.js.map +1 -1
- package/dist/security/index.d.ts +1 -1
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +2 -1413
- package/dist/security/index.js.map +1 -1
- package/dist/{server-auth → server/auth}/index.browser.js +6 -6
- package/dist/server/auth/index.browser.js.map +1 -0
- package/dist/{server-auth → server/auth}/index.d.ts +167 -167
- package/dist/server/auth/index.d.ts.map +1 -0
- package/dist/server/auth/index.js +742 -0
- package/dist/server/auth/index.js.map +1 -0
- package/dist/{server-cache → server/cache}/index.d.ts +2 -2
- package/dist/server/cache/index.d.ts.map +1 -0
- package/dist/{server-cache → server/cache}/index.js +2 -2
- package/dist/server/cache/index.js.map +1 -0
- package/dist/{server-compress → server/compress}/index.d.ts +2 -2
- package/dist/server/compress/index.d.ts.map +1 -0
- package/dist/{server-compress → server/compress}/index.js +2 -2
- package/dist/server/compress/index.js.map +1 -0
- package/dist/{server-cookies → server/cookies}/index.browser.js +3 -3
- package/dist/server/cookies/index.browser.js.map +1 -0
- package/dist/{server-cookies → server/cookies}/index.d.ts +4 -4
- package/dist/server/cookies/index.d.ts.map +1 -0
- package/dist/{server-cookies → server/cookies}/index.js +4 -4
- package/dist/server/cookies/index.js.map +1 -0
- package/dist/server/{index.browser.js → core/index.browser.js} +14 -14
- package/dist/server/core/index.browser.js.map +1 -0
- package/dist/server/{index.d.ts → core/index.d.ts} +36 -36
- package/dist/server/core/index.d.ts.map +1 -0
- package/dist/server/{index.js → core/index.js} +27 -27
- package/dist/server/core/index.js.map +1 -0
- package/dist/{server-cors → server/cors}/index.d.ts +3 -3
- package/dist/server/cors/index.d.ts.map +1 -0
- package/dist/{server-cors → server/cors}/index.js +3 -3
- package/dist/server/cors/index.js.map +1 -0
- package/dist/{server-health → server/health}/index.d.ts +3 -3
- package/dist/server/health/index.d.ts.map +1 -0
- package/dist/{server-health → server/health}/index.js +3 -3
- package/dist/server/health/index.js.map +1 -0
- package/dist/{server-helmet → server/helmet}/index.d.ts +2 -2
- package/dist/server/helmet/index.d.ts.map +1 -0
- package/dist/{server-helmet → server/helmet}/index.js +2 -2
- package/dist/server/helmet/index.js.map +1 -0
- package/dist/{server-links → server/links}/index.browser.js +5 -5
- package/dist/server/links/index.browser.js.map +1 -0
- package/dist/{server-links → server/links}/index.d.ts +40 -40
- package/dist/server/links/index.d.ts.map +1 -0
- package/dist/{server-links → server/links}/index.js +7 -7
- package/dist/server/links/index.js.map +1 -0
- package/dist/{server-metrics → server/metrics}/index.d.ts +2 -2
- package/dist/server/metrics/index.d.ts.map +1 -0
- package/dist/server/metrics/index.js +74 -0
- package/dist/server/metrics/index.js.map +1 -0
- package/dist/{server-multipart → server/multipart}/index.d.ts +2 -2
- package/dist/server/multipart/index.d.ts.map +1 -0
- package/dist/{server-multipart → server/multipart}/index.js +2 -2
- package/dist/server/multipart/index.js.map +1 -0
- package/dist/{server-proxy → server/proxy}/index.d.ts +3 -3
- package/dist/server/proxy/index.d.ts.map +1 -0
- package/dist/{server-proxy → server/proxy}/index.js +3 -3
- package/dist/server/proxy/index.js.map +1 -0
- package/dist/{server-rate-limit → server/rate-limit}/index.d.ts +4 -4
- package/dist/server/rate-limit/index.d.ts.map +1 -0
- package/dist/{server-rate-limit → server/rate-limit}/index.js +4 -4
- package/dist/server/rate-limit/index.js.map +1 -0
- package/dist/{server-security → server/security}/index.browser.js +1 -1
- package/dist/server/security/index.browser.js.map +1 -0
- package/dist/{server-security → server/security}/index.d.ts +4 -4
- package/dist/server/security/index.d.ts.map +1 -0
- package/dist/{server-security → server/security}/index.js +4 -4
- package/dist/server/security/index.js.map +1 -0
- package/dist/{server-static → server/static}/index.d.ts +3 -3
- package/dist/server/static/index.d.ts.map +1 -0
- package/dist/{server-static → server/static}/index.js +3 -3
- package/dist/server/static/index.js.map +1 -0
- package/dist/{server-swagger → server/swagger}/index.d.ts +3 -3
- package/dist/server/swagger/index.d.ts.map +1 -0
- package/dist/{server-swagger → server/swagger}/index.js +4 -4
- package/dist/server/swagger/index.js.map +1 -0
- package/dist/sms/index.d.ts.map +1 -0
- package/dist/thread/index.d.ts.map +1 -0
- package/dist/topic/{index.d.ts → core/index.d.ts} +6 -6
- package/dist/topic/core/index.d.ts.map +1 -0
- package/dist/topic/{index.js → core/index.js} +6 -6
- package/dist/topic/core/index.js.map +1 -0
- package/dist/{topic-redis → topic/redis}/index.d.ts +2 -2
- package/dist/topic/redis/index.d.ts.map +1 -0
- package/dist/{topic-redis → topic/redis}/index.js +2 -2
- package/dist/topic/redis/index.js.map +1 -0
- package/dist/vite/index.d.ts +21 -2
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +48 -19
- package/dist/vite/index.js.map +1 -1
- package/dist/websocket/index.d.ts.map +1 -0
- package/package.json +162 -158
- package/src/{api-files → api/files}/index.ts +1 -0
- package/src/{api-parameters → api/parameters}/index.ts +1 -1
- package/src/{api-users → api/users}/primitives/$userRealm.ts +1 -1
- package/src/{api-users → api/users}/providers/UserRealmProvider.ts +6 -7
- package/src/{api-verifications → api/verifications}/index.ts +2 -0
- package/src/cli/apps/AlephaCli.ts +2 -0
- package/src/cli/apps/AlephaPackageBuilderCli.ts +83 -54
- package/src/cli/assets/appRouterTs.ts +1 -1
- package/src/cli/assets/biomeJson.ts +1 -1
- package/src/cli/assets/indexHtml.ts +1 -1
- package/src/cli/assets/mainBrowserTs.ts +1 -1
- package/src/cli/assets/mainTs.ts +9 -10
- package/src/cli/assets/viteConfigTs.ts +1 -1
- package/src/cli/commands/ChangelogCommands.ts +389 -0
- package/src/cli/commands/CoreCommands.ts +10 -6
- package/src/cli/commands/DrizzleCommands.ts +204 -4
- package/src/cli/commands/VerifyCommands.ts +4 -1
- package/src/cli/commands/ViteCommands.ts +46 -25
- package/src/cli/services/AlephaCliUtils.ts +52 -164
- package/src/command/providers/CliProvider.ts +76 -5
- package/src/core/providers/SchemaValidator.ts +24 -2
- package/src/mcp/errors/McpError.ts +72 -0
- package/src/mcp/helpers/jsonrpc.ts +163 -0
- package/src/mcp/index.ts +132 -0
- package/src/mcp/interfaces/McpTypes.ts +248 -0
- package/src/mcp/primitives/$prompt.ts +188 -0
- package/src/mcp/primitives/$resource.ts +171 -0
- package/src/mcp/primitives/$tool.ts +285 -0
- package/src/mcp/providers/McpServerProvider.ts +382 -0
- package/src/mcp/transports/SseMcpTransport.ts +172 -0
- package/src/mcp/transports/StdioMcpTransport.ts +126 -0
- package/src/orm/index.ts +12 -0
- package/src/orm/providers/drivers/CloudflareD1Provider.ts +164 -0
- package/src/orm/providers/drivers/NodeSqliteProvider.ts +3 -1
- package/src/queue/{index.ts → core/index.ts} +2 -3
- package/src/queue/{primitives → core/primitives}/$queue.ts +17 -162
- package/src/queue/core/providers/MemoryQueueProvider.ts +19 -0
- package/src/queue/core/providers/QueueProvider.ts +23 -0
- package/src/queue/core/providers/WorkerProvider.ts +244 -0
- package/src/queue/redis/providers/RedisQueueProvider.ts +31 -0
- package/src/server/{index.ts → core/index.ts} +1 -0
- package/src/{server-rate-limit → server/rate-limit}/index.ts +1 -1
- package/src/{server-swagger → server/swagger}/providers/ServerSwaggerProvider.ts +1 -0
- package/src/vite/plugins/viteAlephaBuild.ts +8 -2
- package/src/vite/plugins/viteAlephaDev.ts +6 -2
- package/src/vite/tasks/buildServer.ts +1 -1
- package/src/vite/tasks/copyAssets.ts +32 -8
- package/src/vite/tasks/generateCloudflare.ts +43 -15
- package/src/vite/tasks/runAlepha.ts +1 -0
- package/dist/api-audits/index.browser.js.map +0 -1
- package/dist/api-audits/index.js.map +0 -1
- package/dist/api-files/index.browser.js.map +0 -1
- package/dist/api-files/index.js.map +0 -1
- package/dist/api-jobs/index.browser.js.map +0 -1
- package/dist/api-jobs/index.js.map +0 -1
- package/dist/api-notifications/index.browser.js.map +0 -1
- package/dist/api-notifications/index.d.ts +0 -327
- package/dist/api-notifications/index.js.map +0 -1
- package/dist/api-parameters/index.browser.js.map +0 -1
- package/dist/api-parameters/index.js.map +0 -1
- package/dist/api-users/index.browser.js.map +0 -1
- package/dist/api-users/index.js.map +0 -1
- package/dist/api-verifications/index.browser.js.map +0 -1
- package/dist/api-verifications/index.d.ts +0 -229
- package/dist/api-verifications/index.js.map +0 -1
- package/dist/cache/index.js.map +0 -1
- package/dist/cache-redis/index.js.map +0 -1
- package/dist/lock/index.js.map +0 -1
- package/dist/lock-redis/index.js.map +0 -1
- package/dist/queue/index.d.ts +0 -1265
- package/dist/queue/index.js +0 -1037
- package/dist/queue/index.js.map +0 -1
- package/dist/queue-redis/index.d.ts +0 -82
- package/dist/queue-redis/index.js +0 -872
- package/dist/queue-redis/index.js.map +0 -1
- package/dist/server/index.browser.js.map +0 -1
- package/dist/server/index.js.map +0 -1
- package/dist/server-auth/index.browser.js.map +0 -1
- package/dist/server-auth/index.js +0 -1973
- package/dist/server-auth/index.js.map +0 -1
- package/dist/server-cache/index.js.map +0 -1
- package/dist/server-compress/index.js.map +0 -1
- package/dist/server-cookies/index.browser.js.map +0 -1
- package/dist/server-cookies/index.js.map +0 -1
- package/dist/server-cors/index.js.map +0 -1
- package/dist/server-health/index.js.map +0 -1
- package/dist/server-helmet/index.js.map +0 -1
- package/dist/server-links/index.browser.js.map +0 -1
- package/dist/server-links/index.js.map +0 -1
- package/dist/server-metrics/index.js +0 -4532
- package/dist/server-metrics/index.js.map +0 -1
- package/dist/server-multipart/index.js.map +0 -1
- package/dist/server-proxy/index.js.map +0 -1
- package/dist/server-rate-limit/index.js.map +0 -1
- package/dist/server-security/index.browser.js.map +0 -1
- package/dist/server-security/index.js.map +0 -1
- package/dist/server-static/index.js.map +0 -1
- package/dist/server-swagger/index.js.map +0 -1
- package/dist/topic/index.js.map +0 -1
- package/dist/topic-redis/index.js.map +0 -1
- package/src/queue/interfaces/QueueJob.ts +0 -459
- package/src/queue/providers/MemoryQueueProvider.ts +0 -850
- package/src/queue/providers/QueueProvider.ts +0 -319
- package/src/queue/providers/WorkerProvider.ts +0 -344
- package/src/queue-redis/providers/RedisQueueProvider.ts +0 -1209
- /package/src/{api-audits → api/audits}/controllers/AuditController.ts +0 -0
- /package/src/{api-audits → api/audits}/entities/audits.ts +0 -0
- /package/src/{api-audits → api/audits}/index.browser.ts +0 -0
- /package/src/{api-audits → api/audits}/index.ts +0 -0
- /package/src/{api-audits → api/audits}/primitives/$audit.ts +0 -0
- /package/src/{api-audits → api/audits}/schemas/auditQuerySchema.ts +0 -0
- /package/src/{api-audits → api/audits}/schemas/auditResourceSchema.ts +0 -0
- /package/src/{api-audits → api/audits}/schemas/createAuditSchema.ts +0 -0
- /package/src/{api-audits → api/audits}/services/AuditService.ts +0 -0
- /package/src/{api-files → api/files}/controllers/FileController.ts +0 -0
- /package/src/{api-files → api/files}/controllers/StorageStatsController.ts +0 -0
- /package/src/{api-files → api/files}/entities/files.ts +0 -0
- /package/src/{api-files → api/files}/index.browser.ts +0 -0
- /package/src/{api-files → api/files}/jobs/FileJobs.ts +0 -0
- /package/src/{api-files → api/files}/schemas/fileQuerySchema.ts +0 -0
- /package/src/{api-files → api/files}/schemas/fileResourceSchema.ts +0 -0
- /package/src/{api-files → api/files}/schemas/storageStatsSchema.ts +0 -0
- /package/src/{api-files → api/files}/services/FileService.ts +0 -0
- /package/src/{api-jobs → api/jobs}/controllers/JobController.ts +0 -0
- /package/src/{api-jobs → api/jobs}/entities/jobExecutions.ts +0 -0
- /package/src/{api-jobs → api/jobs}/index.browser.ts +0 -0
- /package/src/{api-jobs → api/jobs}/index.ts +0 -0
- /package/src/{api-jobs → api/jobs}/primitives/$job.ts +0 -0
- /package/src/{api-jobs → api/jobs}/providers/JobProvider.ts +0 -0
- /package/src/{api-jobs → api/jobs}/schemas/jobExecutionQuerySchema.ts +0 -0
- /package/src/{api-jobs → api/jobs}/schemas/jobExecutionResourceSchema.ts +0 -0
- /package/src/{api-jobs → api/jobs}/schemas/triggerJobSchema.ts +0 -0
- /package/src/{api-jobs → api/jobs}/services/JobService.ts +0 -0
- /package/src/{api-notifications → api/notifications}/controllers/NotificationController.ts +0 -0
- /package/src/{api-notifications → api/notifications}/entities/notifications.ts +0 -0
- /package/src/{api-notifications → api/notifications}/index.browser.ts +0 -0
- /package/src/{api-notifications → api/notifications}/index.ts +0 -0
- /package/src/{api-notifications → api/notifications}/jobs/NotificationJobs.ts +0 -0
- /package/src/{api-notifications → api/notifications}/primitives/$notification.ts +0 -0
- /package/src/{api-notifications → api/notifications}/queues/NotificationQueues.ts +0 -0
- /package/src/{api-notifications → api/notifications}/schemas/notificationContactPreferencesSchema.ts +0 -0
- /package/src/{api-notifications → api/notifications}/schemas/notificationContactSchema.ts +0 -0
- /package/src/{api-notifications → api/notifications}/schemas/notificationCreateSchema.ts +0 -0
- /package/src/{api-notifications → api/notifications}/schemas/notificationQuerySchema.ts +0 -0
- /package/src/{api-notifications → api/notifications}/services/NotificationSenderService.ts +0 -0
- /package/src/{api-notifications → api/notifications}/services/NotificationService.ts +0 -0
- /package/src/{api-parameters → api/parameters}/controllers/ConfigController.ts +0 -0
- /package/src/{api-parameters → api/parameters}/entities/parameters.ts +0 -0
- /package/src/{api-parameters → api/parameters}/index.browser.ts +0 -0
- /package/src/{api-parameters → api/parameters}/primitives/$config.ts +0 -0
- /package/src/{api-parameters → api/parameters}/schedulers/ConfigActivationScheduler.ts +0 -0
- /package/src/{api-parameters → api/parameters}/services/ConfigStore.ts +0 -0
- /package/src/{api-users → api/users}/atoms/realmAuthSettingsAtom.ts +0 -0
- /package/src/{api-users → api/users}/controllers/IdentityController.ts +0 -0
- /package/src/{api-users → api/users}/controllers/SessionController.ts +0 -0
- /package/src/{api-users → api/users}/controllers/UserController.ts +0 -0
- /package/src/{api-users → api/users}/controllers/UserRealmController.ts +0 -0
- /package/src/{api-users → api/users}/entities/identities.ts +0 -0
- /package/src/{api-users → api/users}/entities/sessions.ts +0 -0
- /package/src/{api-users → api/users}/entities/users.ts +0 -0
- /package/src/{api-users → api/users}/index.browser.ts +0 -0
- /package/src/{api-users → api/users}/index.ts +0 -0
- /package/src/{api-users → api/users}/notifications/UserNotifications.ts +0 -0
- /package/src/{api-users → api/users}/schemas/completePasswordResetRequestSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/completeRegistrationRequestSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/createUserSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/identityQuerySchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/identityResourceSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/loginSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/passwordResetIntentResponseSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/registerQuerySchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/registerRequestSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/registerResponseSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/registerSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/registrationIntentResponseSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/resetPasswordSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/sessionQuerySchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/sessionResourceSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/updateUserSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/userQuerySchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/userRealmConfigSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/userResourceSchema.ts +0 -0
- /package/src/{api-users → api/users}/services/CredentialService.ts +0 -0
- /package/src/{api-users → api/users}/services/IdentityService.ts +0 -0
- /package/src/{api-users → api/users}/services/RegistrationService.ts +0 -0
- /package/src/{api-users → api/users}/services/SessionCrudService.ts +0 -0
- /package/src/{api-users → api/users}/services/SessionService.ts +0 -0
- /package/src/{api-users → api/users}/services/UserService.ts +0 -0
- /package/src/{api-verifications → api/verifications}/controllers/VerificationController.ts +0 -0
- /package/src/{api-verifications → api/verifications}/entities/verifications.ts +0 -0
- /package/src/{api-verifications → api/verifications}/index.browser.ts +0 -0
- /package/src/{api-verifications → api/verifications}/jobs/VerificationJobs.ts +0 -0
- /package/src/{api-verifications → api/verifications}/parameters/VerificationParameters.ts +0 -0
- /package/src/{api-verifications → api/verifications}/schemas/requestVerificationCodeResponseSchema.ts +0 -0
- /package/src/{api-verifications → api/verifications}/schemas/validateVerificationCodeResponseSchema.ts +0 -0
- /package/src/{api-verifications → api/verifications}/schemas/verificationSettingsSchema.ts +0 -0
- /package/src/{api-verifications → api/verifications}/schemas/verificationTypeEnumSchema.ts +0 -0
- /package/src/{api-verifications → api/verifications}/services/VerificationService.ts +0 -0
- /package/src/cache/{errors → core/errors}/CacheError.ts +0 -0
- /package/src/cache/{index.ts → core/index.ts} +0 -0
- /package/src/cache/{primitives → core/primitives}/$cache.ts +0 -0
- /package/src/cache/{providers → core/providers}/CacheProvider.ts +0 -0
- /package/src/cache/{providers → core/providers}/MemoryCacheProvider.ts +0 -0
- /package/src/{cache-redis → cache/redis}/index.ts +0 -0
- /package/src/{cache-redis → cache/redis}/providers/RedisCacheProvider.ts +0 -0
- /package/src/lock/{index.ts → core/index.ts} +0 -0
- /package/src/lock/{primitives → core/primitives}/$lock.ts +0 -0
- /package/src/lock/{providers → core/providers}/LockProvider.ts +0 -0
- /package/src/lock/{providers → core/providers}/LockTopicProvider.ts +0 -0
- /package/src/lock/{providers → core/providers}/MemoryLockProvider.ts +0 -0
- /package/src/{lock-redis → lock/redis}/index.ts +0 -0
- /package/src/{lock-redis → lock/redis}/providers/RedisLockProvider.ts +0 -0
- /package/src/queue/{primitives → core/primitives}/$consumer.ts +0 -0
- /package/src/{queue-redis → queue/redis}/index.ts +0 -0
- /package/src/{server-auth → server/auth}/constants/routes.ts +0 -0
- /package/src/{server-auth → server/auth}/index.browser.ts +0 -0
- /package/src/{server-auth → server/auth}/index.shared.ts +0 -0
- /package/src/{server-auth → server/auth}/index.ts +0 -0
- /package/src/{server-auth → server/auth}/primitives/$auth.ts +0 -0
- /package/src/{server-auth → server/auth}/primitives/$authApple.ts +0 -0
- /package/src/{server-auth → server/auth}/primitives/$authCredentials.ts +0 -0
- /package/src/{server-auth → server/auth}/primitives/$authGithub.ts +0 -0
- /package/src/{server-auth → server/auth}/primitives/$authGoogle.ts +0 -0
- /package/src/{server-auth → server/auth}/providers/ServerAuthProvider.ts +0 -0
- /package/src/{server-auth → server/auth}/schemas/authenticationProviderSchema.ts +0 -0
- /package/src/{server-auth → server/auth}/schemas/tokenResponseSchema.ts +0 -0
- /package/src/{server-auth → server/auth}/schemas/tokensSchema.ts +0 -0
- /package/src/{server-auth → server/auth}/schemas/userinfoResponseSchema.ts +0 -0
- /package/src/{server-cache → server/cache}/index.ts +0 -0
- /package/src/{server-cache → server/cache}/providers/ServerCacheProvider.ts +0 -0
- /package/src/{server-compress → server/compress}/index.ts +0 -0
- /package/src/{server-compress → server/compress}/providers/ServerCompressProvider.ts +0 -0
- /package/src/{server-cookies → server/cookies}/index.browser.ts +0 -0
- /package/src/{server-cookies → server/cookies}/index.ts +0 -0
- /package/src/{server-cookies → server/cookies}/primitives/$cookie.browser.ts +0 -0
- /package/src/{server-cookies → server/cookies}/primitives/$cookie.ts +0 -0
- /package/src/{server-cookies → server/cookies}/providers/ServerCookiesProvider.ts +0 -0
- /package/src/{server-cookies → server/cookies}/services/CookieParser.ts +0 -0
- /package/src/server/{constants → core/constants}/routeMethods.ts +0 -0
- /package/src/server/{errors → core/errors}/BadRequestError.ts +0 -0
- /package/src/server/{errors → core/errors}/ConflictError.ts +0 -0
- /package/src/server/{errors → core/errors}/ForbiddenError.ts +0 -0
- /package/src/server/{errors → core/errors}/HttpError.ts +0 -0
- /package/src/server/{errors → core/errors}/NotFoundError.ts +0 -0
- /package/src/server/{errors → core/errors}/UnauthorizedError.ts +0 -0
- /package/src/server/{errors → core/errors}/ValidationError.ts +0 -0
- /package/src/server/{helpers → core/helpers}/ServerReply.ts +0 -0
- /package/src/server/{helpers → core/helpers}/isMultipart.ts +0 -0
- /package/src/server/{index.browser.ts → core/index.browser.ts} +0 -0
- /package/src/server/{index.shared.ts → core/index.shared.ts} +0 -0
- /package/src/server/{interfaces → core/interfaces}/ServerRequest.ts +0 -0
- /package/src/server/{primitives → core/primitives}/$action.ts +0 -0
- /package/src/server/{primitives → core/primitives}/$route.ts +0 -0
- /package/src/server/{providers → core/providers}/BunHttpServerProvider.ts +0 -0
- /package/src/server/{providers → core/providers}/NodeHttpServerProvider.ts +0 -0
- /package/src/server/{providers → core/providers}/ServerBodyParserProvider.ts +0 -0
- /package/src/server/{providers → core/providers}/ServerLoggerProvider.ts +0 -0
- /package/src/server/{providers → core/providers}/ServerNotReadyProvider.ts +0 -0
- /package/src/server/{providers → core/providers}/ServerProvider.ts +0 -0
- /package/src/server/{providers → core/providers}/ServerRouterProvider.ts +0 -0
- /package/src/server/{providers → core/providers}/ServerTimingProvider.ts +0 -0
- /package/src/server/{schemas → core/schemas}/errorSchema.ts +0 -0
- /package/src/server/{schemas → core/schemas}/okSchema.ts +0 -0
- /package/src/server/{services → core/services}/HttpClient.ts +0 -0
- /package/src/server/{services → core/services}/ServerRequestParser.ts +0 -0
- /package/src/server/{services → core/services}/UserAgentParser.ts +0 -0
- /package/src/{server-cors → server/cors}/index.ts +0 -0
- /package/src/{server-cors → server/cors}/primitives/$cors.ts +0 -0
- /package/src/{server-cors → server/cors}/providers/ServerCorsProvider.ts +0 -0
- /package/src/{server-health → server/health}/index.ts +0 -0
- /package/src/{server-health → server/health}/providers/ServerHealthProvider.ts +0 -0
- /package/src/{server-health → server/health}/schemas/healthSchema.ts +0 -0
- /package/src/{server-helmet → server/helmet}/index.ts +0 -0
- /package/src/{server-helmet → server/helmet}/providers/ServerHelmetProvider.ts +0 -0
- /package/src/{server-links → server/links}/index.browser.ts +0 -0
- /package/src/{server-links → server/links}/index.ts +0 -0
- /package/src/{server-links → server/links}/primitives/$client.ts +0 -0
- /package/src/{server-links → server/links}/primitives/$remote.ts +0 -0
- /package/src/{server-links → server/links}/providers/LinkProvider.ts +0 -0
- /package/src/{server-links → server/links}/providers/RemotePrimitiveProvider.ts +0 -0
- /package/src/{server-links → server/links}/providers/ServerLinksProvider.ts +0 -0
- /package/src/{server-links → server/links}/schemas/apiLinksResponseSchema.ts +0 -0
- /package/src/{server-metrics → server/metrics}/index.ts +0 -0
- /package/src/{server-metrics → server/metrics}/providers/ServerMetricsProvider.ts +0 -0
- /package/src/{server-multipart → server/multipart}/index.ts +0 -0
- /package/src/{server-multipart → server/multipart}/providers/ServerMultipartProvider.ts +0 -0
- /package/src/{server-proxy → server/proxy}/index.ts +0 -0
- /package/src/{server-proxy → server/proxy}/primitives/$proxy.ts +0 -0
- /package/src/{server-proxy → server/proxy}/providers/ServerProxyProvider.ts +0 -0
- /package/src/{server-rate-limit → server/rate-limit}/primitives/$rateLimit.ts +0 -0
- /package/src/{server-rate-limit → server/rate-limit}/providers/ServerRateLimitProvider.ts +0 -0
- /package/src/{server-security → server/security}/index.browser.ts +0 -0
- /package/src/{server-security → server/security}/index.ts +0 -0
- /package/src/{server-security → server/security}/primitives/$basicAuth.ts +0 -0
- /package/src/{server-security → server/security}/providers/ServerBasicAuthProvider.ts +0 -0
- /package/src/{server-security → server/security}/providers/ServerSecurityProvider.ts +0 -0
- /package/src/{server-static → server/static}/index.ts +0 -0
- /package/src/{server-static → server/static}/primitives/$serve.ts +0 -0
- /package/src/{server-static → server/static}/providers/ServerStaticProvider.ts +0 -0
- /package/src/{server-swagger → server/swagger}/index.ts +0 -0
- /package/src/{server-swagger → server/swagger}/primitives/$swagger.ts +0 -0
- /package/src/topic/{errors → core/errors}/TopicTimeoutError.ts +0 -0
- /package/src/topic/{index.ts → core/index.ts} +0 -0
- /package/src/topic/{primitives → core/primitives}/$subscriber.ts +0 -0
- /package/src/topic/{primitives → core/primitives}/$topic.ts +0 -0
- /package/src/topic/{providers → core/providers}/MemoryTopicProvider.ts +0 -0
- /package/src/topic/{providers → core/providers}/TopicProvider.ts +0 -0
- /package/src/{topic-redis → topic/redis}/index.ts +0 -0
- /package/src/{topic-redis → topic/redis}/providers/RedisTopicProvider.ts +0 -0
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import { $atom, $context, $hook, $inject, $module, Alepha, AlephaError,
|
|
1
|
+
import { $atom, $context, $hook, $inject, $module, Alepha, AlephaError, t } from "alepha";
|
|
2
2
|
import { $notification, AlephaApiNotifications } from "alepha/api/notifications";
|
|
3
3
|
import { AlephaApiVerification } from "alepha/api/verifications";
|
|
4
4
|
import { AlephaEmail } from "alepha/email";
|
|
5
5
|
import { $entity, $repository, pageQuerySchema, parseQueryString, pg } from "alepha/orm";
|
|
6
6
|
import { $action, BadRequestError, ConflictError, HttpError, UnauthorizedError, okSchema } from "alepha/server";
|
|
7
7
|
import { $logger } from "alepha/logger";
|
|
8
|
-
import { DEFAULT_USER_REALM_NAME as DEFAULT_USER_REALM_NAME$1, realmAuthSettingsAtom as realmAuthSettingsAtom$1 } from "alepha/api/users";
|
|
9
8
|
import { $bucket } from "alepha/bucket";
|
|
10
9
|
import { randomInt, randomUUID } from "node:crypto";
|
|
11
10
|
import { $cache } from "alepha/cache";
|
|
@@ -14,17 +13,18 @@ import { $realm, CryptoProvider, InvalidCredentialsError, SecurityProvider } fro
|
|
|
14
13
|
import { $client } from "alepha/server/links";
|
|
15
14
|
import { $authCredentials, $authGithub, $authGoogle, ServerAuthProvider, authenticationProviderSchema } from "alepha/server/auth";
|
|
16
15
|
import { FileSystemProvider } from "alepha/file";
|
|
16
|
+
import { AlephaApiAudits } from "alepha/api/audits";
|
|
17
17
|
import { AlephaApiFiles } from "alepha/api/files";
|
|
18
18
|
import { AlephaApiJobs } from "alepha/api/jobs";
|
|
19
19
|
|
|
20
|
-
//#region ../../src/api
|
|
20
|
+
//#region ../../src/api/users/schemas/identityQuerySchema.ts
|
|
21
21
|
const identityQuerySchema = t.extend(pageQuerySchema, {
|
|
22
22
|
userId: t.optional(t.uuid()),
|
|
23
23
|
provider: t.optional(t.string())
|
|
24
24
|
});
|
|
25
25
|
|
|
26
26
|
//#endregion
|
|
27
|
-
//#region ../../src/api
|
|
27
|
+
//#region ../../src/api/users/entities/users.ts
|
|
28
28
|
const DEFAULT_USER_REALM_NAME = "default";
|
|
29
29
|
const users = $entity({
|
|
30
30
|
name: "users",
|
|
@@ -65,7 +65,7 @@ const users = $entity({
|
|
|
65
65
|
});
|
|
66
66
|
|
|
67
67
|
//#endregion
|
|
68
|
-
//#region ../../src/api
|
|
68
|
+
//#region ../../src/api/users/entities/identities.ts
|
|
69
69
|
const identities = $entity({
|
|
70
70
|
name: "identities",
|
|
71
71
|
schema: t.object({
|
|
@@ -82,11 +82,66 @@ const identities = $entity({
|
|
|
82
82
|
});
|
|
83
83
|
|
|
84
84
|
//#endregion
|
|
85
|
-
//#region ../../src/api
|
|
85
|
+
//#region ../../src/api/users/schemas/identityResourceSchema.ts
|
|
86
86
|
const identityResourceSchema = t.omit(identities.schema, ["password"]);
|
|
87
87
|
|
|
88
88
|
//#endregion
|
|
89
|
-
//#region ../../src/api
|
|
89
|
+
//#region ../../src/api/users/atoms/realmAuthSettingsAtom.ts
|
|
90
|
+
const realmAuthSettingsAtom = $atom({
|
|
91
|
+
name: "alepha.api.users.realmAuthSettings",
|
|
92
|
+
schema: t.object({
|
|
93
|
+
displayName: t.optional(t.string({ description: "Display name shown on auth pages (e.g., 'Customer Portal')" })),
|
|
94
|
+
description: t.optional(t.string({ description: "Description shown on auth pages" })),
|
|
95
|
+
logoUrl: t.optional(t.string({ description: "Logo URL for auth pages" })),
|
|
96
|
+
registrationAllowed: t.boolean({ description: "Enable user self-registration" }),
|
|
97
|
+
emailEnabled: t.boolean({ description: "Enable email address as a login/registration credential" }),
|
|
98
|
+
emailRequired: t.boolean({ description: "Require email address for user accounts" }),
|
|
99
|
+
usernameEnabled: t.boolean({ description: "Enable username as a login/registration credential" }),
|
|
100
|
+
usernameRequired: t.boolean({ description: "Require username for user accounts" }),
|
|
101
|
+
phoneEnabled: t.boolean({ description: "Enable phone number as a login/registration credential" }),
|
|
102
|
+
phoneRequired: t.boolean({ description: "Require phone number for user accounts" }),
|
|
103
|
+
verifyEmailRequired: t.boolean({ description: "Require email verification for user accounts" }),
|
|
104
|
+
verifyPhoneRequired: t.boolean({ description: "Require phone verification for user accounts" }),
|
|
105
|
+
firstNameLastNameEnabled: t.boolean({ description: "Enable first and last name for user accounts" }),
|
|
106
|
+
firstNameLastNameRequired: t.boolean({ description: "Require first and last name for user accounts" }),
|
|
107
|
+
resetPasswordAllowed: t.boolean({ description: "Enable forgot password functionality" }),
|
|
108
|
+
passwordPolicy: t.object({
|
|
109
|
+
minLength: t.integer({
|
|
110
|
+
description: "Minimum password length",
|
|
111
|
+
default: 8,
|
|
112
|
+
minimum: 1
|
|
113
|
+
}),
|
|
114
|
+
requireUppercase: t.boolean({ description: "Require at least one uppercase letter" }),
|
|
115
|
+
requireLowercase: t.boolean({ description: "Require at least one lowercase letter" }),
|
|
116
|
+
requireNumbers: t.boolean({ description: "Require at least one number" }),
|
|
117
|
+
requireSpecialCharacters: t.boolean({ description: "Require at least one special character" })
|
|
118
|
+
})
|
|
119
|
+
}),
|
|
120
|
+
default: {
|
|
121
|
+
registrationAllowed: true,
|
|
122
|
+
emailEnabled: true,
|
|
123
|
+
emailRequired: true,
|
|
124
|
+
usernameEnabled: false,
|
|
125
|
+
usernameRequired: false,
|
|
126
|
+
phoneEnabled: false,
|
|
127
|
+
phoneRequired: false,
|
|
128
|
+
verifyEmailRequired: false,
|
|
129
|
+
verifyPhoneRequired: false,
|
|
130
|
+
resetPasswordAllowed: false,
|
|
131
|
+
firstNameLastNameEnabled: false,
|
|
132
|
+
firstNameLastNameRequired: false,
|
|
133
|
+
passwordPolicy: {
|
|
134
|
+
minLength: 8,
|
|
135
|
+
requireUppercase: true,
|
|
136
|
+
requireLowercase: true,
|
|
137
|
+
requireNumbers: true,
|
|
138
|
+
requireSpecialCharacters: false
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
//#endregion
|
|
144
|
+
//#region ../../src/api/users/entities/sessions.ts
|
|
90
145
|
const sessions = $entity({
|
|
91
146
|
name: "sessions",
|
|
92
147
|
schema: t.object({
|
|
@@ -111,7 +166,7 @@ const sessions = $entity({
|
|
|
111
166
|
});
|
|
112
167
|
|
|
113
168
|
//#endregion
|
|
114
|
-
//#region ../../src/api
|
|
169
|
+
//#region ../../src/api/users/providers/UserRealmProvider.ts
|
|
115
170
|
var UserRealmProvider = class {
|
|
116
171
|
alepha = $inject(Alepha);
|
|
117
172
|
defaultIdentities = $repository(identities);
|
|
@@ -146,10 +201,10 @@ var UserRealmProvider = class {
|
|
|
146
201
|
users: userRealmOptions.entities?.users ?? this.defaultUsers
|
|
147
202
|
},
|
|
148
203
|
settings: {
|
|
149
|
-
...realmAuthSettingsAtom
|
|
204
|
+
...realmAuthSettingsAtom.options.default,
|
|
150
205
|
...userRealmOptions.settings,
|
|
151
206
|
passwordPolicy: {
|
|
152
|
-
...realmAuthSettingsAtom
|
|
207
|
+
...realmAuthSettingsAtom.options.default.passwordPolicy,
|
|
153
208
|
...userRealmOptions.settings?.passwordPolicy
|
|
154
209
|
}
|
|
155
210
|
}
|
|
@@ -159,29 +214,29 @@ var UserRealmProvider = class {
|
|
|
159
214
|
/**
|
|
160
215
|
* Gets a registered realm by name, auto-creating default if needed.
|
|
161
216
|
*/
|
|
162
|
-
getRealm(userRealmName = DEFAULT_USER_REALM_NAME
|
|
217
|
+
getRealm(userRealmName = DEFAULT_USER_REALM_NAME) {
|
|
163
218
|
let realm = this.realms.get(userRealmName);
|
|
164
219
|
if (!realm) {
|
|
165
220
|
const firstRealm = Array.from(this.realms.values())[0];
|
|
166
|
-
if (userRealmName === DEFAULT_USER_REALM_NAME
|
|
221
|
+
if (userRealmName === DEFAULT_USER_REALM_NAME && firstRealm) realm = firstRealm;
|
|
167
222
|
else if (this.alepha.isTest()) realm = this.register(userRealmName);
|
|
168
223
|
else throw new AlephaError(`Missing user realm '${userRealmName}', please declare $userRealm in your application.`);
|
|
169
224
|
}
|
|
170
225
|
return realm;
|
|
171
226
|
}
|
|
172
|
-
identityRepository(userRealmName = DEFAULT_USER_REALM_NAME
|
|
227
|
+
identityRepository(userRealmName = DEFAULT_USER_REALM_NAME) {
|
|
173
228
|
return this.getRealm(userRealmName).repositories.identities;
|
|
174
229
|
}
|
|
175
|
-
sessionRepository(userRealmName = DEFAULT_USER_REALM_NAME
|
|
230
|
+
sessionRepository(userRealmName = DEFAULT_USER_REALM_NAME) {
|
|
176
231
|
return this.getRealm(userRealmName).repositories.sessions;
|
|
177
232
|
}
|
|
178
|
-
userRepository(userRealmName = DEFAULT_USER_REALM_NAME
|
|
233
|
+
userRepository(userRealmName = DEFAULT_USER_REALM_NAME) {
|
|
179
234
|
return this.getRealm(userRealmName).repositories.users;
|
|
180
235
|
}
|
|
181
236
|
};
|
|
182
237
|
|
|
183
238
|
//#endregion
|
|
184
|
-
//#region ../../src/api
|
|
239
|
+
//#region ../../src/api/users/services/IdentityService.ts
|
|
185
240
|
var IdentityService = class {
|
|
186
241
|
log = $logger();
|
|
187
242
|
userRealmProvider = $inject(UserRealmProvider);
|
|
@@ -242,7 +297,7 @@ var IdentityService = class {
|
|
|
242
297
|
};
|
|
243
298
|
|
|
244
299
|
//#endregion
|
|
245
|
-
//#region ../../src/api
|
|
300
|
+
//#region ../../src/api/users/controllers/IdentityController.ts
|
|
246
301
|
var IdentityController = class {
|
|
247
302
|
url = "/identities";
|
|
248
303
|
group = "identities";
|
|
@@ -301,11 +356,11 @@ var IdentityController = class {
|
|
|
301
356
|
};
|
|
302
357
|
|
|
303
358
|
//#endregion
|
|
304
|
-
//#region ../../src/api
|
|
359
|
+
//#region ../../src/api/users/schemas/sessionQuerySchema.ts
|
|
305
360
|
const sessionQuerySchema = t.extend(pageQuerySchema, { userId: t.optional(t.uuid()) });
|
|
306
361
|
|
|
307
362
|
//#endregion
|
|
308
|
-
//#region ../../src/api
|
|
363
|
+
//#region ../../src/api/users/schemas/sessionResourceSchema.ts
|
|
309
364
|
const sessionResourceSchema = t.object({
|
|
310
365
|
id: t.uuid(),
|
|
311
366
|
version: t.number(),
|
|
@@ -327,7 +382,7 @@ const sessionResourceSchema = t.object({
|
|
|
327
382
|
});
|
|
328
383
|
|
|
329
384
|
//#endregion
|
|
330
|
-
//#region ../../src/api
|
|
385
|
+
//#region ../../src/api/users/services/SessionCrudService.ts
|
|
331
386
|
var SessionCrudService = class {
|
|
332
387
|
log = $logger();
|
|
333
388
|
userRealmProvider = $inject(UserRealmProvider);
|
|
@@ -382,7 +437,7 @@ var SessionCrudService = class {
|
|
|
382
437
|
};
|
|
383
438
|
|
|
384
439
|
//#endregion
|
|
385
|
-
//#region ../../src/api
|
|
440
|
+
//#region ../../src/api/users/controllers/SessionController.ts
|
|
386
441
|
var SessionController = class {
|
|
387
442
|
url = "/sessions";
|
|
388
443
|
group = "sessions";
|
|
@@ -441,7 +496,7 @@ var SessionController = class {
|
|
|
441
496
|
};
|
|
442
497
|
|
|
443
498
|
//#endregion
|
|
444
|
-
//#region ../../src/api
|
|
499
|
+
//#region ../../src/api/users/schemas/completePasswordResetRequestSchema.ts
|
|
445
500
|
/**
|
|
446
501
|
* Request schema for completing a password reset.
|
|
447
502
|
*
|
|
@@ -458,7 +513,7 @@ const completePasswordResetRequestSchema = t.object({
|
|
|
458
513
|
});
|
|
459
514
|
|
|
460
515
|
//#endregion
|
|
461
|
-
//#region ../../src/api
|
|
516
|
+
//#region ../../src/api/users/schemas/completeRegistrationRequestSchema.ts
|
|
462
517
|
const completeRegistrationRequestSchema = t.object({
|
|
463
518
|
intentId: t.uuid({ description: "The registration intent ID from the first phase" }),
|
|
464
519
|
emailCode: t.optional(t.string({ description: "Email verification code (if email verification required)" })),
|
|
@@ -467,11 +522,11 @@ const completeRegistrationRequestSchema = t.object({
|
|
|
467
522
|
});
|
|
468
523
|
|
|
469
524
|
//#endregion
|
|
470
|
-
//#region ../../src/api
|
|
525
|
+
//#region ../../src/api/users/schemas/createUserSchema.ts
|
|
471
526
|
const createUserSchema = t.omit(users.insertSchema, ["realm"]);
|
|
472
527
|
|
|
473
528
|
//#endregion
|
|
474
|
-
//#region ../../src/api
|
|
529
|
+
//#region ../../src/api/users/schemas/passwordResetIntentResponseSchema.ts
|
|
475
530
|
/**
|
|
476
531
|
* Response schema for password reset intent creation.
|
|
477
532
|
*
|
|
@@ -484,7 +539,7 @@ const passwordResetIntentResponseSchema = t.object({
|
|
|
484
539
|
});
|
|
485
540
|
|
|
486
541
|
//#endregion
|
|
487
|
-
//#region ../../src/api
|
|
542
|
+
//#region ../../src/api/users/schemas/registerQuerySchema.ts
|
|
488
543
|
/**
|
|
489
544
|
* Schema for user registration query parameters.
|
|
490
545
|
* Allows specifying a custom user realm.
|
|
@@ -492,7 +547,7 @@ const passwordResetIntentResponseSchema = t.object({
|
|
|
492
547
|
const registerQuerySchema = t.object({ userRealmName: t.optional(t.text({ description: "The user realm to register the user in (defaults to 'default')" })) });
|
|
493
548
|
|
|
494
549
|
//#endregion
|
|
495
|
-
//#region ../../src/api
|
|
550
|
+
//#region ../../src/api/users/schemas/registerRequestSchema.ts
|
|
496
551
|
/**
|
|
497
552
|
* Schema for user registration request body.
|
|
498
553
|
* Password is always required, other fields depend on realm settings.
|
|
@@ -517,7 +572,7 @@ const registerRequestSchema = t.object({
|
|
|
517
572
|
});
|
|
518
573
|
|
|
519
574
|
//#endregion
|
|
520
|
-
//#region ../../src/api
|
|
575
|
+
//#region ../../src/api/users/schemas/registrationIntentResponseSchema.ts
|
|
521
576
|
const registrationIntentResponseSchema = t.object({
|
|
522
577
|
intentId: t.uuid({ description: "Unique identifier for the registration intent" }),
|
|
523
578
|
expectCaptcha: t.boolean({ description: "Whether captcha verification is required" }),
|
|
@@ -527,7 +582,7 @@ const registrationIntentResponseSchema = t.object({
|
|
|
527
582
|
});
|
|
528
583
|
|
|
529
584
|
//#endregion
|
|
530
|
-
//#region ../../src/api
|
|
585
|
+
//#region ../../src/api/users/schemas/updateUserSchema.ts
|
|
531
586
|
const updateUserSchema = t.partial(t.omit(users.insertSchema, [
|
|
532
587
|
"id",
|
|
533
588
|
"version",
|
|
@@ -538,7 +593,7 @@ const updateUserSchema = t.partial(t.omit(users.insertSchema, [
|
|
|
538
593
|
]));
|
|
539
594
|
|
|
540
595
|
//#endregion
|
|
541
|
-
//#region ../../src/api
|
|
596
|
+
//#region ../../src/api/users/schemas/userQuerySchema.ts
|
|
542
597
|
const userQuerySchema = t.extend(pageQuerySchema, {
|
|
543
598
|
email: t.optional(t.string()),
|
|
544
599
|
enabled: t.optional(t.boolean()),
|
|
@@ -548,11 +603,11 @@ const userQuerySchema = t.extend(pageQuerySchema, {
|
|
|
548
603
|
});
|
|
549
604
|
|
|
550
605
|
//#endregion
|
|
551
|
-
//#region ../../src/api
|
|
606
|
+
//#region ../../src/api/users/schemas/userResourceSchema.ts
|
|
552
607
|
const userResourceSchema = users.schema;
|
|
553
608
|
|
|
554
609
|
//#endregion
|
|
555
|
-
//#region ../../src/api
|
|
610
|
+
//#region ../../src/api/users/notifications/UserNotifications.ts
|
|
556
611
|
var UserNotifications = class {
|
|
557
612
|
passwordReset = $notification({
|
|
558
613
|
category: "security",
|
|
@@ -681,7 +736,7 @@ var UserNotifications = class {
|
|
|
681
736
|
};
|
|
682
737
|
|
|
683
738
|
//#endregion
|
|
684
|
-
//#region ../../src/api
|
|
739
|
+
//#region ../../src/api/users/services/CredentialService.ts
|
|
685
740
|
const INTENT_TTL_MINUTES$1 = 10;
|
|
686
741
|
var CredentialService = class {
|
|
687
742
|
log = $logger();
|
|
@@ -864,7 +919,7 @@ var CredentialService = class {
|
|
|
864
919
|
};
|
|
865
920
|
|
|
866
921
|
//#endregion
|
|
867
|
-
//#region ../../src/api
|
|
922
|
+
//#region ../../src/api/users/services/RegistrationService.ts
|
|
868
923
|
const INTENT_TTL_MINUTES = 10;
|
|
869
924
|
var RegistrationService = class {
|
|
870
925
|
log = $logger();
|
|
@@ -1128,7 +1183,7 @@ var RegistrationService = class {
|
|
|
1128
1183
|
};
|
|
1129
1184
|
|
|
1130
1185
|
//#endregion
|
|
1131
|
-
//#region ../../src/api
|
|
1186
|
+
//#region ../../src/api/users/services/UserService.ts
|
|
1132
1187
|
var UserService = class {
|
|
1133
1188
|
log = $logger();
|
|
1134
1189
|
verificationController = $client();
|
|
@@ -1350,7 +1405,7 @@ var UserService = class {
|
|
|
1350
1405
|
};
|
|
1351
1406
|
|
|
1352
1407
|
//#endregion
|
|
1353
|
-
//#region ../../src/api
|
|
1408
|
+
//#region ../../src/api/users/controllers/UserController.ts
|
|
1354
1409
|
var UserController = class {
|
|
1355
1410
|
url = "/users";
|
|
1356
1411
|
group = "users";
|
|
@@ -1655,62 +1710,7 @@ var UserController = class {
|
|
|
1655
1710
|
};
|
|
1656
1711
|
|
|
1657
1712
|
//#endregion
|
|
1658
|
-
//#region ../../src/api
|
|
1659
|
-
const realmAuthSettingsAtom = $atom({
|
|
1660
|
-
name: "alepha.api.users.realmAuthSettings",
|
|
1661
|
-
schema: t.object({
|
|
1662
|
-
displayName: t.optional(t.string({ description: "Display name shown on auth pages (e.g., 'Customer Portal')" })),
|
|
1663
|
-
description: t.optional(t.string({ description: "Description shown on auth pages" })),
|
|
1664
|
-
logoUrl: t.optional(t.string({ description: "Logo URL for auth pages" })),
|
|
1665
|
-
registrationAllowed: t.boolean({ description: "Enable user self-registration" }),
|
|
1666
|
-
emailEnabled: t.boolean({ description: "Enable email address as a login/registration credential" }),
|
|
1667
|
-
emailRequired: t.boolean({ description: "Require email address for user accounts" }),
|
|
1668
|
-
usernameEnabled: t.boolean({ description: "Enable username as a login/registration credential" }),
|
|
1669
|
-
usernameRequired: t.boolean({ description: "Require username for user accounts" }),
|
|
1670
|
-
phoneEnabled: t.boolean({ description: "Enable phone number as a login/registration credential" }),
|
|
1671
|
-
phoneRequired: t.boolean({ description: "Require phone number for user accounts" }),
|
|
1672
|
-
verifyEmailRequired: t.boolean({ description: "Require email verification for user accounts" }),
|
|
1673
|
-
verifyPhoneRequired: t.boolean({ description: "Require phone verification for user accounts" }),
|
|
1674
|
-
firstNameLastNameEnabled: t.boolean({ description: "Enable first and last name for user accounts" }),
|
|
1675
|
-
firstNameLastNameRequired: t.boolean({ description: "Require first and last name for user accounts" }),
|
|
1676
|
-
resetPasswordAllowed: t.boolean({ description: "Enable forgot password functionality" }),
|
|
1677
|
-
passwordPolicy: t.object({
|
|
1678
|
-
minLength: t.integer({
|
|
1679
|
-
description: "Minimum password length",
|
|
1680
|
-
default: 8,
|
|
1681
|
-
minimum: 1
|
|
1682
|
-
}),
|
|
1683
|
-
requireUppercase: t.boolean({ description: "Require at least one uppercase letter" }),
|
|
1684
|
-
requireLowercase: t.boolean({ description: "Require at least one lowercase letter" }),
|
|
1685
|
-
requireNumbers: t.boolean({ description: "Require at least one number" }),
|
|
1686
|
-
requireSpecialCharacters: t.boolean({ description: "Require at least one special character" })
|
|
1687
|
-
})
|
|
1688
|
-
}),
|
|
1689
|
-
default: {
|
|
1690
|
-
registrationAllowed: true,
|
|
1691
|
-
emailEnabled: true,
|
|
1692
|
-
emailRequired: true,
|
|
1693
|
-
usernameEnabled: false,
|
|
1694
|
-
usernameRequired: false,
|
|
1695
|
-
phoneEnabled: false,
|
|
1696
|
-
phoneRequired: false,
|
|
1697
|
-
verifyEmailRequired: false,
|
|
1698
|
-
verifyPhoneRequired: false,
|
|
1699
|
-
resetPasswordAllowed: false,
|
|
1700
|
-
firstNameLastNameEnabled: false,
|
|
1701
|
-
firstNameLastNameRequired: false,
|
|
1702
|
-
passwordPolicy: {
|
|
1703
|
-
minLength: 8,
|
|
1704
|
-
requireUppercase: true,
|
|
1705
|
-
requireLowercase: true,
|
|
1706
|
-
requireNumbers: true,
|
|
1707
|
-
requireSpecialCharacters: false
|
|
1708
|
-
}
|
|
1709
|
-
}
|
|
1710
|
-
});
|
|
1711
|
-
|
|
1712
|
-
//#endregion
|
|
1713
|
-
//#region ../../src/api-users/schemas/userRealmConfigSchema.ts
|
|
1713
|
+
//#region ../../src/api/users/schemas/userRealmConfigSchema.ts
|
|
1714
1714
|
const userRealmConfigSchema = t.object({
|
|
1715
1715
|
settings: realmAuthSettingsAtom.schema,
|
|
1716
1716
|
realmName: t.string(),
|
|
@@ -1718,7 +1718,7 @@ const userRealmConfigSchema = t.object({
|
|
|
1718
1718
|
});
|
|
1719
1719
|
|
|
1720
1720
|
//#endregion
|
|
1721
|
-
//#region ../../src/api
|
|
1721
|
+
//#region ../../src/api/users/controllers/UserRealmController.ts
|
|
1722
1722
|
/**
|
|
1723
1723
|
* Controller for exposing realm configuration.
|
|
1724
1724
|
* Uses $route instead of $action to keep endpoints hidden from API documentation.
|
|
@@ -1768,7 +1768,7 @@ var UserRealmController = class {
|
|
|
1768
1768
|
};
|
|
1769
1769
|
|
|
1770
1770
|
//#endregion
|
|
1771
|
-
//#region ../../src/api
|
|
1771
|
+
//#region ../../src/api/users/services/SessionService.ts
|
|
1772
1772
|
var SessionService = class {
|
|
1773
1773
|
alepha = $inject(Alepha);
|
|
1774
1774
|
fsp = $inject(FileSystemProvider);
|
|
@@ -1995,674 +1995,7 @@ var SessionService = class {
|
|
|
1995
1995
|
};
|
|
1996
1996
|
|
|
1997
1997
|
//#endregion
|
|
1998
|
-
//#region ../../src/api
|
|
1999
|
-
/**
|
|
2000
|
-
* Audit severity levels for categorizing events.
|
|
2001
|
-
*/
|
|
2002
|
-
const auditSeveritySchema = t.enum([
|
|
2003
|
-
"info",
|
|
2004
|
-
"warning",
|
|
2005
|
-
"critical"
|
|
2006
|
-
], {
|
|
2007
|
-
default: "info",
|
|
2008
|
-
description: "Severity level of the audit event"
|
|
2009
|
-
});
|
|
2010
|
-
/**
|
|
2011
|
-
* Audit log entity for tracking important system events.
|
|
2012
|
-
*
|
|
2013
|
-
* Stores comprehensive audit information including:
|
|
2014
|
-
* - Who performed the action (userId, userRealm)
|
|
2015
|
-
* - What happened (type, action, resource)
|
|
2016
|
-
* - When it happened (createdAt)
|
|
2017
|
-
* - Context and details (metadata, ipAddress, userAgent)
|
|
2018
|
-
*/
|
|
2019
|
-
const audits = $entity({
|
|
2020
|
-
name: "audits",
|
|
2021
|
-
schema: t.object({
|
|
2022
|
-
id: pg.primaryKey(t.bigint()),
|
|
2023
|
-
createdAt: pg.createdAt(),
|
|
2024
|
-
type: t.text({ description: "Audit event type (e.g., auth, user, payment, system)" }),
|
|
2025
|
-
action: t.text({ description: "Specific action performed (e.g., login, create, update)" }),
|
|
2026
|
-
severity: pg.default(auditSeveritySchema, "info"),
|
|
2027
|
-
userId: t.optional(t.uuid()),
|
|
2028
|
-
userRealm: t.optional(t.text()),
|
|
2029
|
-
userEmail: t.optional(t.email()),
|
|
2030
|
-
resourceType: t.optional(t.text()),
|
|
2031
|
-
resourceId: t.optional(t.text()),
|
|
2032
|
-
description: t.optional(t.text()),
|
|
2033
|
-
metadata: t.optional(t.json()),
|
|
2034
|
-
ipAddress: t.optional(t.text()),
|
|
2035
|
-
userAgent: t.optional(t.text()),
|
|
2036
|
-
sessionId: t.optional(t.uuid()),
|
|
2037
|
-
requestId: t.optional(t.text()),
|
|
2038
|
-
success: pg.default(t.boolean(), true),
|
|
2039
|
-
errorMessage: t.optional(t.text())
|
|
2040
|
-
}),
|
|
2041
|
-
indexes: [
|
|
2042
|
-
"createdAt",
|
|
2043
|
-
"type",
|
|
2044
|
-
"action",
|
|
2045
|
-
"userId",
|
|
2046
|
-
"userRealm",
|
|
2047
|
-
"resourceType",
|
|
2048
|
-
"resourceId",
|
|
2049
|
-
"severity",
|
|
2050
|
-
{ columns: ["type", "action"] },
|
|
2051
|
-
{ columns: ["userId", "createdAt"] },
|
|
2052
|
-
{ columns: ["userRealm", "createdAt"] }
|
|
2053
|
-
]
|
|
2054
|
-
});
|
|
2055
|
-
const auditEntitySchema = audits.schema;
|
|
2056
|
-
const auditEntityInsertSchema = audits.insertSchema;
|
|
2057
|
-
|
|
2058
|
-
//#endregion
|
|
2059
|
-
//#region ../../src/api-audits/schemas/auditQuerySchema.ts
|
|
2060
|
-
/**
|
|
2061
|
-
* Query schema for searching and filtering audit logs.
|
|
2062
|
-
*/
|
|
2063
|
-
const auditQuerySchema = t.extend(pageQuerySchema, {
|
|
2064
|
-
type: t.optional(t.text({ description: "Filter by audit type" })),
|
|
2065
|
-
action: t.optional(t.text({ description: "Filter by action" })),
|
|
2066
|
-
severity: t.optional(auditSeveritySchema),
|
|
2067
|
-
userId: t.optional(t.uuid({ description: "Filter by user ID" })),
|
|
2068
|
-
userRealm: t.optional(t.text({ description: "Filter by user realm" })),
|
|
2069
|
-
resourceType: t.optional(t.text({ description: "Filter by resource type" })),
|
|
2070
|
-
resourceId: t.optional(t.text({ description: "Filter by resource ID" })),
|
|
2071
|
-
success: t.optional(t.boolean({ description: "Filter by success status" })),
|
|
2072
|
-
from: t.optional(t.datetime({ description: "Start date filter" })),
|
|
2073
|
-
to: t.optional(t.datetime({ description: "End date filter" })),
|
|
2074
|
-
search: t.optional(t.text({ description: "Search in description" }))
|
|
2075
|
-
});
|
|
2076
|
-
|
|
2077
|
-
//#endregion
|
|
2078
|
-
//#region ../../src/api-audits/schemas/auditResourceSchema.ts
|
|
2079
|
-
/**
|
|
2080
|
-
* Resource schema for audit log responses.
|
|
2081
|
-
*/
|
|
2082
|
-
const auditResourceSchema = audits.schema;
|
|
2083
|
-
|
|
2084
|
-
//#endregion
|
|
2085
|
-
//#region ../../src/api-audits/schemas/createAuditSchema.ts
|
|
2086
|
-
/**
|
|
2087
|
-
* Schema for creating a new audit log entry.
|
|
2088
|
-
*/
|
|
2089
|
-
const createAuditSchema = t.object({
|
|
2090
|
-
type: t.text({ description: "Audit event type" }),
|
|
2091
|
-
action: t.text({ description: "Specific action performed" }),
|
|
2092
|
-
severity: t.optional(auditSeveritySchema),
|
|
2093
|
-
userId: t.optional(t.uuid()),
|
|
2094
|
-
userRealm: t.optional(t.text()),
|
|
2095
|
-
userEmail: t.optional(t.email()),
|
|
2096
|
-
resourceType: t.optional(t.text()),
|
|
2097
|
-
resourceId: t.optional(t.text()),
|
|
2098
|
-
description: t.optional(t.text()),
|
|
2099
|
-
metadata: t.optional(t.json()),
|
|
2100
|
-
ipAddress: t.optional(t.text()),
|
|
2101
|
-
userAgent: t.optional(t.text()),
|
|
2102
|
-
sessionId: t.optional(t.uuid()),
|
|
2103
|
-
requestId: t.optional(t.text()),
|
|
2104
|
-
success: t.optional(t.boolean()),
|
|
2105
|
-
errorMessage: t.optional(t.text())
|
|
2106
|
-
});
|
|
2107
|
-
|
|
2108
|
-
//#endregion
|
|
2109
|
-
//#region ../../src/api-audits/services/AuditService.ts
|
|
2110
|
-
/**
|
|
2111
|
-
* Service for managing audit logs.
|
|
2112
|
-
*
|
|
2113
|
-
* Provides methods for:
|
|
2114
|
-
* - Creating audit entries
|
|
2115
|
-
* - Querying audit history
|
|
2116
|
-
* - Aggregating audit statistics
|
|
2117
|
-
* - Managing registered audit types
|
|
2118
|
-
*/
|
|
2119
|
-
var AuditService = class {
|
|
2120
|
-
alepha = $inject(Alepha);
|
|
2121
|
-
log = $logger();
|
|
2122
|
-
repo = $repository(audits);
|
|
2123
|
-
/**
|
|
2124
|
-
* Registry of audit types and their allowed actions.
|
|
2125
|
-
*/
|
|
2126
|
-
auditTypes = /* @__PURE__ */ new Map();
|
|
2127
|
-
/**
|
|
2128
|
-
* Register an audit type with its allowed actions.
|
|
2129
|
-
*/
|
|
2130
|
-
registerType(definition) {
|
|
2131
|
-
this.auditTypes.set(definition.type, definition);
|
|
2132
|
-
this.log.debug("Audit type registered", {
|
|
2133
|
-
type: definition.type,
|
|
2134
|
-
actions: definition.actions
|
|
2135
|
-
});
|
|
2136
|
-
}
|
|
2137
|
-
/**
|
|
2138
|
-
* Get all registered audit types.
|
|
2139
|
-
*/
|
|
2140
|
-
getRegisteredTypes() {
|
|
2141
|
-
return Array.from(this.auditTypes.values());
|
|
2142
|
-
}
|
|
2143
|
-
/**
|
|
2144
|
-
* Get current request context if available.
|
|
2145
|
-
*/
|
|
2146
|
-
getRequestContext() {
|
|
2147
|
-
return this.alepha.context.get("request");
|
|
2148
|
-
}
|
|
2149
|
-
/**
|
|
2150
|
-
* Create a new audit log entry.
|
|
2151
|
-
* Automatically populates ipAddress, userAgent, and requestId from the current request context.
|
|
2152
|
-
*/
|
|
2153
|
-
async create(data) {
|
|
2154
|
-
const request = this.getRequestContext();
|
|
2155
|
-
const contextData = {};
|
|
2156
|
-
if (request) {
|
|
2157
|
-
if (!data.ipAddress && request.ip) contextData.ipAddress = request.ip;
|
|
2158
|
-
if (!data.userAgent && request.headers["user-agent"]) contextData.userAgent = request.headers["user-agent"];
|
|
2159
|
-
if (!data.requestId && request.requestId) contextData.requestId = request.requestId;
|
|
2160
|
-
if (!data.sessionId && request.metadata?.sessionId) contextData.sessionId = request.metadata.sessionId;
|
|
2161
|
-
const user = request.user;
|
|
2162
|
-
if (user) {
|
|
2163
|
-
if (!data.userId && user.id) contextData.userId = user.id;
|
|
2164
|
-
if (!data.userEmail && user.email) contextData.userEmail = user.email;
|
|
2165
|
-
if (!data.userRealm && user.realm) contextData.userRealm = user.realm;
|
|
2166
|
-
}
|
|
2167
|
-
}
|
|
2168
|
-
this.log.trace("Creating audit entry", {
|
|
2169
|
-
type: data.type,
|
|
2170
|
-
action: data.action,
|
|
2171
|
-
userId: data.userId ?? contextData.userId
|
|
2172
|
-
});
|
|
2173
|
-
const entry = await this.repo.create({
|
|
2174
|
-
...contextData,
|
|
2175
|
-
...data,
|
|
2176
|
-
severity: data.severity ?? "info",
|
|
2177
|
-
success: data.success ?? true
|
|
2178
|
-
});
|
|
2179
|
-
this.log.debug("Audit entry created", {
|
|
2180
|
-
id: entry.id,
|
|
2181
|
-
type: data.type,
|
|
2182
|
-
action: data.action
|
|
2183
|
-
});
|
|
2184
|
-
return entry;
|
|
2185
|
-
}
|
|
2186
|
-
/**
|
|
2187
|
-
* Record an audit event (convenience method).
|
|
2188
|
-
*/
|
|
2189
|
-
async record(type, action, options = {}) {
|
|
2190
|
-
return this.create({
|
|
2191
|
-
type,
|
|
2192
|
-
action,
|
|
2193
|
-
...options
|
|
2194
|
-
});
|
|
2195
|
-
}
|
|
2196
|
-
/**
|
|
2197
|
-
* Record an authentication event.
|
|
2198
|
-
*/
|
|
2199
|
-
async recordAuth(action, options = {}) {
|
|
2200
|
-
return this.create({
|
|
2201
|
-
type: "auth",
|
|
2202
|
-
action,
|
|
2203
|
-
severity: action === "login_failed" ? "warning" : "info",
|
|
2204
|
-
...options
|
|
2205
|
-
});
|
|
2206
|
-
}
|
|
2207
|
-
/**
|
|
2208
|
-
* Record a user management event.
|
|
2209
|
-
*/
|
|
2210
|
-
async recordUser(action, options = {}) {
|
|
2211
|
-
return this.create({
|
|
2212
|
-
type: "user",
|
|
2213
|
-
action,
|
|
2214
|
-
resourceType: "user",
|
|
2215
|
-
...options
|
|
2216
|
-
});
|
|
2217
|
-
}
|
|
2218
|
-
/**
|
|
2219
|
-
* Record a data access event.
|
|
2220
|
-
*/
|
|
2221
|
-
async recordAccess(action, options = {}) {
|
|
2222
|
-
return this.create({
|
|
2223
|
-
type: "access",
|
|
2224
|
-
action,
|
|
2225
|
-
...options
|
|
2226
|
-
});
|
|
2227
|
-
}
|
|
2228
|
-
/**
|
|
2229
|
-
* Record a security event.
|
|
2230
|
-
*/
|
|
2231
|
-
async recordSecurity(action, options = {}) {
|
|
2232
|
-
return this.create({
|
|
2233
|
-
type: "security",
|
|
2234
|
-
action,
|
|
2235
|
-
severity: "warning",
|
|
2236
|
-
...options
|
|
2237
|
-
});
|
|
2238
|
-
}
|
|
2239
|
-
/**
|
|
2240
|
-
* Record a system event.
|
|
2241
|
-
*/
|
|
2242
|
-
async recordSystem(action, options = {}) {
|
|
2243
|
-
return this.create({
|
|
2244
|
-
type: "system",
|
|
2245
|
-
action,
|
|
2246
|
-
severity: action === "error" ? "critical" : "info",
|
|
2247
|
-
...options
|
|
2248
|
-
});
|
|
2249
|
-
}
|
|
2250
|
-
/**
|
|
2251
|
-
* Find audit entries with filtering and pagination.
|
|
2252
|
-
*/
|
|
2253
|
-
async find(query = {}) {
|
|
2254
|
-
this.log.trace("Finding audit entries", { query });
|
|
2255
|
-
query.sort ??= "-createdAt";
|
|
2256
|
-
const where = this.repo.createQueryWhere();
|
|
2257
|
-
if (query.type) where.type = { eq: query.type };
|
|
2258
|
-
if (query.action) where.action = { eq: query.action };
|
|
2259
|
-
if (query.severity) where.severity = { eq: query.severity };
|
|
2260
|
-
if (query.userId) where.userId = { eq: query.userId };
|
|
2261
|
-
if (query.userRealm) where.userRealm = { eq: query.userRealm };
|
|
2262
|
-
if (query.resourceType) where.resourceType = { eq: query.resourceType };
|
|
2263
|
-
if (query.resourceId) where.resourceId = { eq: query.resourceId };
|
|
2264
|
-
if (query.success !== void 0) where.success = { eq: query.success };
|
|
2265
|
-
if (query.from) where.createdAt = {
|
|
2266
|
-
...where.createdAt,
|
|
2267
|
-
gte: query.from
|
|
2268
|
-
};
|
|
2269
|
-
if (query.to) where.createdAt = {
|
|
2270
|
-
...where.createdAt,
|
|
2271
|
-
lte: query.to
|
|
2272
|
-
};
|
|
2273
|
-
if (query.search) where.description = { like: `%${query.search}%` };
|
|
2274
|
-
const result = await this.repo.paginate(query, { where }, { count: true });
|
|
2275
|
-
this.log.debug("Audit entries found", {
|
|
2276
|
-
count: result.content.length,
|
|
2277
|
-
total: result.page.totalElements
|
|
2278
|
-
});
|
|
2279
|
-
return result;
|
|
2280
|
-
}
|
|
2281
|
-
/**
|
|
2282
|
-
* Get audit entry by ID.
|
|
2283
|
-
*/
|
|
2284
|
-
async getById(id) {
|
|
2285
|
-
return this.repo.findById(id);
|
|
2286
|
-
}
|
|
2287
|
-
/**
|
|
2288
|
-
* Get audit entries for a specific user.
|
|
2289
|
-
*/
|
|
2290
|
-
async findByUser(userId, query = {}) {
|
|
2291
|
-
return this.find({
|
|
2292
|
-
...query,
|
|
2293
|
-
userId
|
|
2294
|
-
});
|
|
2295
|
-
}
|
|
2296
|
-
/**
|
|
2297
|
-
* Get audit entries for a specific resource.
|
|
2298
|
-
*/
|
|
2299
|
-
async findByResource(resourceType, resourceId, query = {}) {
|
|
2300
|
-
return this.find({
|
|
2301
|
-
...query,
|
|
2302
|
-
resourceType,
|
|
2303
|
-
resourceId
|
|
2304
|
-
});
|
|
2305
|
-
}
|
|
2306
|
-
/**
|
|
2307
|
-
* Get audit statistics for a time period.
|
|
2308
|
-
*/
|
|
2309
|
-
async getStats(options = {}) {
|
|
2310
|
-
this.log.trace("Getting audit stats", options);
|
|
2311
|
-
const where = this.repo.createQueryWhere();
|
|
2312
|
-
if (options.from) where.createdAt = { gte: options.from.toISOString() };
|
|
2313
|
-
if (options.to) where.createdAt = {
|
|
2314
|
-
...where.createdAt,
|
|
2315
|
-
lte: options.to.toISOString()
|
|
2316
|
-
};
|
|
2317
|
-
if (options.userRealm) where.userRealm = { eq: options.userRealm };
|
|
2318
|
-
const all = await this.repo.findMany({ where });
|
|
2319
|
-
const stats = {
|
|
2320
|
-
total: all.length,
|
|
2321
|
-
byType: {},
|
|
2322
|
-
bySeverity: {
|
|
2323
|
-
info: 0,
|
|
2324
|
-
warning: 0,
|
|
2325
|
-
critical: 0
|
|
2326
|
-
},
|
|
2327
|
-
successRate: 0,
|
|
2328
|
-
recentFailures: []
|
|
2329
|
-
};
|
|
2330
|
-
let successCount = 0;
|
|
2331
|
-
for (const entry of all) {
|
|
2332
|
-
stats.byType[entry.type] = (stats.byType[entry.type] || 0) + 1;
|
|
2333
|
-
const severity = entry.severity;
|
|
2334
|
-
stats.bySeverity[severity]++;
|
|
2335
|
-
if (entry.success) successCount++;
|
|
2336
|
-
}
|
|
2337
|
-
stats.successRate = stats.total > 0 ? successCount / stats.total : 1;
|
|
2338
|
-
stats.recentFailures = all.filter((e) => !e.success).sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()).slice(0, 10);
|
|
2339
|
-
return stats;
|
|
2340
|
-
}
|
|
2341
|
-
/**
|
|
2342
|
-
* Delete old audit entries (for retention policy).
|
|
2343
|
-
*/
|
|
2344
|
-
async deleteOlderThan(date) {
|
|
2345
|
-
this.log.info("Deleting old audit entries", { olderThan: date });
|
|
2346
|
-
const old = await this.repo.findMany({ where: { createdAt: { lt: date.toISOString() } } });
|
|
2347
|
-
for (const entry of old) await this.repo.deleteById(entry.id);
|
|
2348
|
-
this.log.info("Old audit entries deleted", { count: old.length });
|
|
2349
|
-
return old.length;
|
|
2350
|
-
}
|
|
2351
|
-
};
|
|
2352
|
-
|
|
2353
|
-
//#endregion
|
|
2354
|
-
//#region ../../src/api-audits/controllers/AuditController.ts
|
|
2355
|
-
/**
|
|
2356
|
-
* REST API controller for audit log management.
|
|
2357
|
-
*
|
|
2358
|
-
* Provides endpoints for:
|
|
2359
|
-
* - Querying audit logs with filtering
|
|
2360
|
-
* - Creating audit entries
|
|
2361
|
-
* - Getting audit statistics
|
|
2362
|
-
* - Viewing registered audit types
|
|
2363
|
-
*/
|
|
2364
|
-
var AuditController = class {
|
|
2365
|
-
url = "/audits";
|
|
2366
|
-
group = "audits";
|
|
2367
|
-
auditService = $inject(AuditService);
|
|
2368
|
-
/**
|
|
2369
|
-
* Find audit entries with filtering and pagination.
|
|
2370
|
-
*/
|
|
2371
|
-
findAudits = $action({
|
|
2372
|
-
path: this.url,
|
|
2373
|
-
group: this.group,
|
|
2374
|
-
description: "Find audit entries with filtering and pagination",
|
|
2375
|
-
schema: {
|
|
2376
|
-
query: auditQuerySchema,
|
|
2377
|
-
response: pg.page(auditResourceSchema)
|
|
2378
|
-
},
|
|
2379
|
-
handler: ({ query }) => this.auditService.find(query)
|
|
2380
|
-
});
|
|
2381
|
-
/**
|
|
2382
|
-
* Get a single audit entry by ID.
|
|
2383
|
-
*/
|
|
2384
|
-
getAudit = $action({
|
|
2385
|
-
path: `${this.url}/:id`,
|
|
2386
|
-
group: this.group,
|
|
2387
|
-
description: "Get a single audit entry by ID",
|
|
2388
|
-
schema: {
|
|
2389
|
-
params: t.object({ id: t.text() }),
|
|
2390
|
-
response: auditResourceSchema
|
|
2391
|
-
},
|
|
2392
|
-
handler: ({ params }) => this.auditService.getById(params.id)
|
|
2393
|
-
});
|
|
2394
|
-
/**
|
|
2395
|
-
* Create a new audit entry.
|
|
2396
|
-
*/
|
|
2397
|
-
createAudit = $action({
|
|
2398
|
-
method: "POST",
|
|
2399
|
-
path: this.url,
|
|
2400
|
-
group: this.group,
|
|
2401
|
-
description: "Create a new audit entry",
|
|
2402
|
-
schema: {
|
|
2403
|
-
body: createAuditSchema,
|
|
2404
|
-
response: auditResourceSchema
|
|
2405
|
-
},
|
|
2406
|
-
handler: ({ body }) => this.auditService.create(body)
|
|
2407
|
-
});
|
|
2408
|
-
/**
|
|
2409
|
-
* Get audit entries for a specific user.
|
|
2410
|
-
*/
|
|
2411
|
-
findByUser = $action({
|
|
2412
|
-
path: `${this.url}/user/:userId`,
|
|
2413
|
-
group: this.group,
|
|
2414
|
-
description: "Get audit entries for a specific user",
|
|
2415
|
-
schema: {
|
|
2416
|
-
params: t.object({ userId: t.uuid() }),
|
|
2417
|
-
query: t.omit(auditQuerySchema, ["userId"]),
|
|
2418
|
-
response: pg.page(auditResourceSchema)
|
|
2419
|
-
},
|
|
2420
|
-
handler: ({ params, query }) => this.auditService.findByUser(params.userId, query)
|
|
2421
|
-
});
|
|
2422
|
-
/**
|
|
2423
|
-
* Get audit entries for a specific resource.
|
|
2424
|
-
*/
|
|
2425
|
-
findByResource = $action({
|
|
2426
|
-
path: `${this.url}/resource/:resourceType/:resourceId`,
|
|
2427
|
-
group: this.group,
|
|
2428
|
-
description: "Get audit entries for a specific resource",
|
|
2429
|
-
schema: {
|
|
2430
|
-
params: t.object({
|
|
2431
|
-
resourceType: t.text(),
|
|
2432
|
-
resourceId: t.text()
|
|
2433
|
-
}),
|
|
2434
|
-
query: t.omit(auditQuerySchema, ["resourceType", "resourceId"]),
|
|
2435
|
-
response: pg.page(auditResourceSchema)
|
|
2436
|
-
},
|
|
2437
|
-
handler: ({ params, query }) => this.auditService.findByResource(params.resourceType, params.resourceId, query)
|
|
2438
|
-
});
|
|
2439
|
-
/**
|
|
2440
|
-
* Get audit statistics.
|
|
2441
|
-
*/
|
|
2442
|
-
getStats = $action({
|
|
2443
|
-
path: `${this.url}/stats`,
|
|
2444
|
-
group: this.group,
|
|
2445
|
-
description: "Get audit statistics for a time period",
|
|
2446
|
-
schema: {
|
|
2447
|
-
query: t.object({
|
|
2448
|
-
from: t.optional(t.datetime()),
|
|
2449
|
-
to: t.optional(t.datetime()),
|
|
2450
|
-
userRealm: t.optional(t.text())
|
|
2451
|
-
}),
|
|
2452
|
-
response: t.object({
|
|
2453
|
-
total: t.integer(),
|
|
2454
|
-
byType: t.record(t.text(), t.integer()),
|
|
2455
|
-
bySeverity: t.object({
|
|
2456
|
-
info: t.integer(),
|
|
2457
|
-
warning: t.integer(),
|
|
2458
|
-
critical: t.integer()
|
|
2459
|
-
}),
|
|
2460
|
-
successRate: t.number(),
|
|
2461
|
-
recentFailures: t.array(auditResourceSchema)
|
|
2462
|
-
})
|
|
2463
|
-
},
|
|
2464
|
-
handler: ({ query }) => this.auditService.getStats({
|
|
2465
|
-
from: query.from ? new Date(query.from) : void 0,
|
|
2466
|
-
to: query.to ? new Date(query.to) : void 0,
|
|
2467
|
-
userRealm: query.userRealm
|
|
2468
|
-
})
|
|
2469
|
-
});
|
|
2470
|
-
/**
|
|
2471
|
-
* Get registered audit types.
|
|
2472
|
-
*/
|
|
2473
|
-
getTypes = $action({
|
|
2474
|
-
path: `${this.url}/types`,
|
|
2475
|
-
group: this.group,
|
|
2476
|
-
description: "Get all registered audit types",
|
|
2477
|
-
schema: { response: t.array(t.object({
|
|
2478
|
-
type: t.text(),
|
|
2479
|
-
description: t.optional(t.text()),
|
|
2480
|
-
actions: t.array(t.text())
|
|
2481
|
-
})) },
|
|
2482
|
-
handler: () => this.auditService.getRegisteredTypes()
|
|
2483
|
-
});
|
|
2484
|
-
/**
|
|
2485
|
-
* Get distinct values for filters.
|
|
2486
|
-
*/
|
|
2487
|
-
getFilterOptions = $action({
|
|
2488
|
-
path: `${this.url}/filters`,
|
|
2489
|
-
group: this.group,
|
|
2490
|
-
description: "Get distinct values for audit filters",
|
|
2491
|
-
schema: { response: t.object({
|
|
2492
|
-
types: t.array(t.text()),
|
|
2493
|
-
actions: t.array(t.text()),
|
|
2494
|
-
resourceTypes: t.array(t.text()),
|
|
2495
|
-
userRealms: t.array(t.text())
|
|
2496
|
-
}) },
|
|
2497
|
-
handler: async () => {
|
|
2498
|
-
const types = this.auditService.getRegisteredTypes();
|
|
2499
|
-
return {
|
|
2500
|
-
types: types.map((t$1) => t$1.type),
|
|
2501
|
-
actions: types.flatMap((t$1) => t$1.actions),
|
|
2502
|
-
resourceTypes: [
|
|
2503
|
-
"user",
|
|
2504
|
-
"session",
|
|
2505
|
-
"file",
|
|
2506
|
-
"order",
|
|
2507
|
-
"payment"
|
|
2508
|
-
],
|
|
2509
|
-
userRealms: ["default"]
|
|
2510
|
-
};
|
|
2511
|
-
}
|
|
2512
|
-
});
|
|
2513
|
-
};
|
|
2514
|
-
|
|
2515
|
-
//#endregion
|
|
2516
|
-
//#region ../../src/api-audits/primitives/$audit.ts
|
|
2517
|
-
/**
|
|
2518
|
-
* Audit type primitive for registering domain-specific audit events.
|
|
2519
|
-
*
|
|
2520
|
-
* Provides a type-safe way to define and log audit events within a specific domain.
|
|
2521
|
-
*
|
|
2522
|
-
* @example
|
|
2523
|
-
* ```ts
|
|
2524
|
-
* class PaymentAudits {
|
|
2525
|
-
* audit = $audit({
|
|
2526
|
-
* type: "payment",
|
|
2527
|
-
* description: "Payment-related audit events",
|
|
2528
|
-
* actions: ["create", "refund", "cancel", "dispute"],
|
|
2529
|
-
* });
|
|
2530
|
-
*
|
|
2531
|
-
* async logPaymentCreated(paymentId: string, userId: string, amount: number) {
|
|
2532
|
-
* await this.audit.log("create", {
|
|
2533
|
-
* userId,
|
|
2534
|
-
* resourceType: "payment",
|
|
2535
|
-
* resourceId: paymentId,
|
|
2536
|
-
* description: `Payment of ${amount} created`,
|
|
2537
|
-
* metadata: { amount },
|
|
2538
|
-
* });
|
|
2539
|
-
* }
|
|
2540
|
-
* }
|
|
2541
|
-
* ```
|
|
2542
|
-
*/
|
|
2543
|
-
var AuditPrimitive = class extends Primitive {
|
|
2544
|
-
auditService = $inject(AuditService);
|
|
2545
|
-
/**
|
|
2546
|
-
* The audit type identifier.
|
|
2547
|
-
*/
|
|
2548
|
-
get type() {
|
|
2549
|
-
return this.options.type;
|
|
2550
|
-
}
|
|
2551
|
-
/**
|
|
2552
|
-
* The audit type description.
|
|
2553
|
-
*/
|
|
2554
|
-
get description() {
|
|
2555
|
-
return this.options.description;
|
|
2556
|
-
}
|
|
2557
|
-
/**
|
|
2558
|
-
* The allowed actions for this audit type.
|
|
2559
|
-
*/
|
|
2560
|
-
get actions() {
|
|
2561
|
-
return this.options.actions;
|
|
2562
|
-
}
|
|
2563
|
-
/**
|
|
2564
|
-
* Log an audit event for this type.
|
|
2565
|
-
*/
|
|
2566
|
-
async log(action, options = {}) {
|
|
2567
|
-
await this.auditService.record(this.options.type, action, options);
|
|
2568
|
-
}
|
|
2569
|
-
/**
|
|
2570
|
-
* Log a successful audit event.
|
|
2571
|
-
*/
|
|
2572
|
-
async logSuccess(action, options = {}) {
|
|
2573
|
-
await this.log(action, {
|
|
2574
|
-
...options,
|
|
2575
|
-
success: true
|
|
2576
|
-
});
|
|
2577
|
-
}
|
|
2578
|
-
/**
|
|
2579
|
-
* Log a failed audit event.
|
|
2580
|
-
*/
|
|
2581
|
-
async logFailure(action, errorMessage, options = {}) {
|
|
2582
|
-
await this.log(action, {
|
|
2583
|
-
...options,
|
|
2584
|
-
success: false,
|
|
2585
|
-
errorMessage
|
|
2586
|
-
});
|
|
2587
|
-
}
|
|
2588
|
-
/**
|
|
2589
|
-
* Called during initialization to register this audit type.
|
|
2590
|
-
*/
|
|
2591
|
-
onInit() {
|
|
2592
|
-
const definition = {
|
|
2593
|
-
type: this.options.type,
|
|
2594
|
-
description: this.options.description,
|
|
2595
|
-
actions: this.options.actions
|
|
2596
|
-
};
|
|
2597
|
-
this.auditService.registerType(definition);
|
|
2598
|
-
}
|
|
2599
|
-
};
|
|
2600
|
-
/**
|
|
2601
|
-
* Create an audit type primitive.
|
|
2602
|
-
*
|
|
2603
|
-
* @example
|
|
2604
|
-
* ```ts
|
|
2605
|
-
* class OrderAudits {
|
|
2606
|
-
* audit = $audit({
|
|
2607
|
-
* type: "order",
|
|
2608
|
-
* description: "Order management events",
|
|
2609
|
-
* actions: ["create", "update", "cancel", "fulfill", "ship"],
|
|
2610
|
-
* });
|
|
2611
|
-
* }
|
|
2612
|
-
* ```
|
|
2613
|
-
*/
|
|
2614
|
-
const $audit = (options) => {
|
|
2615
|
-
return createPrimitive(AuditPrimitive, options);
|
|
2616
|
-
};
|
|
2617
|
-
$audit[KIND] = AuditPrimitive;
|
|
2618
|
-
|
|
2619
|
-
//#endregion
|
|
2620
|
-
//#region ../../src/api-audits/index.ts
|
|
2621
|
-
/**
|
|
2622
|
-
* Provides audit logging API endpoints for Alepha applications.
|
|
2623
|
-
*
|
|
2624
|
-
* This module includes:
|
|
2625
|
-
* - Audit log CRUD operations
|
|
2626
|
-
* - Filtering and searching audit events
|
|
2627
|
-
* - Audit statistics and analytics
|
|
2628
|
-
* - `$audit` primitive for domain-specific audit types
|
|
2629
|
-
*
|
|
2630
|
-
* @module alepha.api.audits
|
|
2631
|
-
*
|
|
2632
|
-
* @example
|
|
2633
|
-
* ```ts
|
|
2634
|
-
* // In your app module
|
|
2635
|
-
* import { AlephaApiAudits } from "alepha/api/audits";
|
|
2636
|
-
*
|
|
2637
|
-
* const App = $module({
|
|
2638
|
-
* name: "app",
|
|
2639
|
-
* services: [AlephaApiAudits, ...],
|
|
2640
|
-
* });
|
|
2641
|
-
*
|
|
2642
|
-
* // Create domain-specific audit types
|
|
2643
|
-
* class PaymentAudits {
|
|
2644
|
-
* audit = $audit({
|
|
2645
|
-
* type: "payment",
|
|
2646
|
-
* actions: ["create", "refund", "cancel"],
|
|
2647
|
-
* });
|
|
2648
|
-
*
|
|
2649
|
-
* async onPaymentCreated(paymentId: string, userId: string) {
|
|
2650
|
-
* await this.audit.log("create", {
|
|
2651
|
-
* userId,
|
|
2652
|
-
* resourceType: "payment",
|
|
2653
|
-
* resourceId: paymentId,
|
|
2654
|
-
* });
|
|
2655
|
-
* }
|
|
2656
|
-
* }
|
|
2657
|
-
* ```
|
|
2658
|
-
*/
|
|
2659
|
-
const AlephaApiAudits = $module({
|
|
2660
|
-
name: "alepha.api.audits",
|
|
2661
|
-
services: [AuditService, AuditController]
|
|
2662
|
-
});
|
|
2663
|
-
|
|
2664
|
-
//#endregion
|
|
2665
|
-
//#region ../../src/api-users/primitives/$userRealm.ts
|
|
1998
|
+
//#region ../../src/api/users/primitives/$userRealm.ts
|
|
2666
1999
|
/**
|
|
2667
2000
|
* Already configured realm for user management.
|
|
2668
2001
|
*
|
|
@@ -2737,7 +2070,7 @@ const $userRealm = (options = {}) => {
|
|
|
2737
2070
|
};
|
|
2738
2071
|
|
|
2739
2072
|
//#endregion
|
|
2740
|
-
//#region ../../src/api
|
|
2073
|
+
//#region ../../src/api/users/schemas/loginSchema.ts
|
|
2741
2074
|
const loginSchema = t.object({
|
|
2742
2075
|
username: t.text({
|
|
2743
2076
|
minLength: 3,
|
|
@@ -2751,7 +2084,7 @@ const loginSchema = t.object({
|
|
|
2751
2084
|
});
|
|
2752
2085
|
|
|
2753
2086
|
//#endregion
|
|
2754
|
-
//#region ../../src/api
|
|
2087
|
+
//#region ../../src/api/users/schemas/registerSchema.ts
|
|
2755
2088
|
const registerSchema = t.object({
|
|
2756
2089
|
username: t.string({
|
|
2757
2090
|
minLength: 3,
|
|
@@ -2779,7 +2112,7 @@ const registerSchema = t.object({
|
|
|
2779
2112
|
});
|
|
2780
2113
|
|
|
2781
2114
|
//#endregion
|
|
2782
|
-
//#region ../../src/api
|
|
2115
|
+
//#region ../../src/api/users/schemas/resetPasswordSchema.ts
|
|
2783
2116
|
const resetPasswordRequestSchema = t.object({ email: t.email({ description: "Email address to send password reset link" }) });
|
|
2784
2117
|
const resetPasswordSchema = t.object({
|
|
2785
2118
|
token: t.string({ description: "Password reset token from email" }),
|
|
@@ -2794,7 +2127,7 @@ const resetPasswordSchema = t.object({
|
|
|
2794
2127
|
});
|
|
2795
2128
|
|
|
2796
2129
|
//#endregion
|
|
2797
|
-
//#region ../../src/api
|
|
2130
|
+
//#region ../../src/api/users/index.ts
|
|
2798
2131
|
/**
|
|
2799
2132
|
* Provides user management API endpoints for Alepha applications.
|
|
2800
2133
|
*
|