alepha 0.13.7 → 0.13.8
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 +8 -8
- 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 +16 -9
- 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 +35 -35
- 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 → 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 +7 -7
- 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 +844 -845
- 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 → api/verifications}/index.js +11 -11
- package/dist/api/verifications/index.js.map +1 -0
- package/dist/cache/{index.d.ts → core/index.d.ts} +4 -4
- 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 → cache/redis}/index.js +2 -2
- package/dist/cache/redis/index.js.map +1 -0
- package/dist/cli/index.d.ts +34 -26
- package/dist/cli/index.js +75 -46
- package/dist/cli/index.js.map +1 -1
- package/dist/command/index.d.ts +4 -4
- package/dist/core/index.browser.js.map +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.native.js.map +1 -1
- package/dist/lock/{index.d.ts → core/index.d.ts} +5 -5
- 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 → lock/redis}/index.js +2 -2
- package/dist/lock/redis/index.js.map +1 -0
- package/dist/queue/core/index.d.ts +548 -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.js +43 -0
- package/dist/queue/redis/index.js.map +1 -0
- package/dist/scheduler/index.d.ts +1 -1
- 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.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.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 → 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 → 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 → 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/{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 → 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 → 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 → 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 +7 -7
- 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.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 → 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 → 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 → 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 +13 -13
- 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 → 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 → server/swagger}/index.js +4 -4
- package/dist/server/swagger/index.js.map +1 -0
- package/dist/topic/{index.d.ts → core/index.d.ts} +6 -6
- 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 → topic/redis}/index.js +2 -2
- package/dist/topic/redis/index.js.map +1 -0
- package/dist/vite/index.d.ts +11 -0
- package/dist/vite/index.js +12 -5
- package/dist/vite/index.js.map +1 -1
- package/package.json +156 -157
- 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/AlephaPackageBuilderCli.ts +73 -48
- 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/viteConfigTs.ts +1 -1
- package/src/cli/commands/CoreCommands.ts +10 -6
- package/src/cli/commands/VerifyCommands.ts +4 -1
- package/src/cli/commands/ViteCommands.ts +20 -9
- package/src/cli/services/AlephaCliUtils.ts +29 -14
- package/src/core/providers/SchemaValidator.ts +1 -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/tasks/copyAssets.ts +32 -8
- 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
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
import * as alepha133 from "alepha";
|
|
2
|
+
import { Alepha, KIND, Primitive, Static, StaticEncode, TObject } from "alepha";
|
|
3
|
+
import * as alepha_orm66 from "alepha/orm";
|
|
4
|
+
import { Page } from "alepha/orm";
|
|
5
|
+
import * as alepha_server0 from "alepha/server";
|
|
6
|
+
import * as alepha_batch0 from "alepha/batch";
|
|
7
|
+
import { DateTimeProvider } from "alepha/datetime";
|
|
8
|
+
import * as alepha_logger0 from "alepha/logger";
|
|
9
|
+
import * as alepha_queue0 from "alepha/queue";
|
|
10
|
+
import { EmailProvider } from "alepha/email";
|
|
11
|
+
import { SmsProvider } from "alepha/sms";
|
|
12
|
+
|
|
13
|
+
//#region ../../src/api/notifications/entities/notifications.d.ts
|
|
14
|
+
declare const notifications: alepha_orm66.EntityPrimitive<alepha133.TObject<{
|
|
15
|
+
id: alepha_orm66.PgAttr<alepha_orm66.PgAttr<alepha133.TString, typeof alepha_orm66.PG_PRIMARY_KEY>, typeof alepha_orm66.PG_DEFAULT>;
|
|
16
|
+
version: alepha_orm66.PgAttr<alepha_orm66.PgAttr<alepha133.TInteger, typeof alepha_orm66.PG_VERSION>, typeof alepha_orm66.PG_DEFAULT>;
|
|
17
|
+
createdAt: alepha_orm66.PgAttr<alepha_orm66.PgAttr<alepha133.TString, typeof alepha_orm66.PG_CREATED_AT>, typeof alepha_orm66.PG_DEFAULT>;
|
|
18
|
+
updatedAt: alepha_orm66.PgAttr<alepha_orm66.PgAttr<alepha133.TString, typeof alepha_orm66.PG_UPDATED_AT>, typeof alepha_orm66.PG_DEFAULT>;
|
|
19
|
+
type: alepha133.TUnsafe<"email" | "sms">;
|
|
20
|
+
template: alepha133.TString;
|
|
21
|
+
category: alepha133.TOptional<alepha133.TString>;
|
|
22
|
+
critical: alepha133.TOptional<alepha133.TBoolean>;
|
|
23
|
+
sensitive: alepha133.TOptional<alepha133.TBoolean>;
|
|
24
|
+
contact: alepha133.TString;
|
|
25
|
+
variables: alepha133.TOptional<alepha133.TRecord<"^.*$", alepha133.TAny>>;
|
|
26
|
+
scheduledAt: alepha133.TOptional<alepha133.TString>;
|
|
27
|
+
sentAt: alepha133.TOptional<alepha133.TString>;
|
|
28
|
+
error: alepha133.TOptional<alepha133.TObject<{
|
|
29
|
+
at: alepha133.TString;
|
|
30
|
+
name: alepha133.TString;
|
|
31
|
+
message: alepha133.TString;
|
|
32
|
+
}>>;
|
|
33
|
+
}>>;
|
|
34
|
+
type NotificationEntity = Static<typeof notifications.schema>;
|
|
35
|
+
//#endregion
|
|
36
|
+
//#region ../../src/api/notifications/schemas/notificationCreateSchema.d.ts
|
|
37
|
+
declare const notificationCreateSchema: alepha133.TObject<{
|
|
38
|
+
type: alepha133.TUnsafe<"email" | "sms">;
|
|
39
|
+
template: alepha133.TString;
|
|
40
|
+
contact: alepha133.TString;
|
|
41
|
+
variables: alepha133.TOptional<alepha133.TRecord<"^.*$", alepha133.TAny>>;
|
|
42
|
+
}>;
|
|
43
|
+
type NotificationCreate = Static<typeof notificationCreateSchema>;
|
|
44
|
+
//#endregion
|
|
45
|
+
//#region ../../src/api/notifications/schemas/notificationQuerySchema.d.ts
|
|
46
|
+
declare const notificationQuerySchema: alepha133.TObject<{
|
|
47
|
+
page: alepha133.TOptional<alepha133.TInteger>;
|
|
48
|
+
size: alepha133.TOptional<alepha133.TInteger>;
|
|
49
|
+
sort: alepha133.TOptional<alepha133.TString>;
|
|
50
|
+
type: alepha133.TOptional<alepha133.TUnsafe<"email" | "sms">>;
|
|
51
|
+
template: alepha133.TOptional<alepha133.TString>;
|
|
52
|
+
contact: alepha133.TOptional<alepha133.TString>;
|
|
53
|
+
category: alepha133.TOptional<alepha133.TString>;
|
|
54
|
+
status: alepha133.TOptional<alepha133.TUnsafe<"pending" | "sent" | "failed">>;
|
|
55
|
+
}>;
|
|
56
|
+
type NotificationQuery = Static<typeof notificationQuerySchema>;
|
|
57
|
+
//#endregion
|
|
58
|
+
//#region ../../src/api/notifications/primitives/$notification.d.ts
|
|
59
|
+
/**
|
|
60
|
+
* Creates a notification primitive for managing email/SMS notification templates.
|
|
61
|
+
*
|
|
62
|
+
* Provides type-safe, reusable notification templates with multi-language support,
|
|
63
|
+
* variable substitution, and categorization for different notification channels.
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```ts
|
|
67
|
+
* class NotificationTemplates {
|
|
68
|
+
* welcomeEmail = $notification({
|
|
69
|
+
* name: "welcome-email",
|
|
70
|
+
* category: "onboarding",
|
|
71
|
+
* schema: t.object({ username: t.text(), activationLink: t.text() }),
|
|
72
|
+
* email: {
|
|
73
|
+
* subject: "Welcome to our platform!",
|
|
74
|
+
* body: (vars) => `Hello ${vars.username}, click: ${vars.activationLink}`
|
|
75
|
+
* }
|
|
76
|
+
* });
|
|
77
|
+
*
|
|
78
|
+
* async sendWelcome(user: User) {
|
|
79
|
+
* await this.welcomeEmail.push({
|
|
80
|
+
* variables: { username: user.name, activationLink: generateLink() },
|
|
81
|
+
* contact: user.email
|
|
82
|
+
* });
|
|
83
|
+
* }
|
|
84
|
+
* }
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
declare const $notification: {
|
|
88
|
+
<T extends TObject>(options: NotificationPrimitiveOptions<T>): NotificationPrimitive<T>;
|
|
89
|
+
[KIND]: typeof NotificationPrimitive;
|
|
90
|
+
};
|
|
91
|
+
interface NotificationPrimitiveOptions<T extends TObject> extends NotificationMessage<T> {
|
|
92
|
+
name?: string;
|
|
93
|
+
description?: string;
|
|
94
|
+
category?: string;
|
|
95
|
+
critical?: boolean;
|
|
96
|
+
sensitive?: boolean;
|
|
97
|
+
translations?: {
|
|
98
|
+
[lang: string]: NotificationMessage<T>;
|
|
99
|
+
};
|
|
100
|
+
schema: T;
|
|
101
|
+
}
|
|
102
|
+
declare class NotificationPrimitive<T extends TObject> extends Primitive<NotificationPrimitiveOptions<T>> {
|
|
103
|
+
protected readonly notificationService: NotificationService;
|
|
104
|
+
get name(): string;
|
|
105
|
+
push(options: NotificationPushOptions<T>): Promise<void>;
|
|
106
|
+
configure(options: Partial<NotificationPrimitiveOptions<T>>): void;
|
|
107
|
+
}
|
|
108
|
+
interface NotificationPushOptions<T extends TObject> {
|
|
109
|
+
variables: StaticEncode<T>;
|
|
110
|
+
contact: string;
|
|
111
|
+
}
|
|
112
|
+
interface NotificationMessage<T extends TObject> {
|
|
113
|
+
email?: {
|
|
114
|
+
subject: string;
|
|
115
|
+
body: string | ((variables: Static<T>) => string);
|
|
116
|
+
};
|
|
117
|
+
sms?: {
|
|
118
|
+
message: string | ((variables: Static<T>) => string);
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
//#endregion
|
|
122
|
+
//#region ../../src/api/notifications/services/NotificationSenderService.d.ts
|
|
123
|
+
declare class NotificationSenderService {
|
|
124
|
+
protected readonly alepha: Alepha;
|
|
125
|
+
protected readonly log: alepha_logger0.Logger;
|
|
126
|
+
protected readonly notificationRepository: alepha_orm66.Repository<alepha133.TObject<{
|
|
127
|
+
id: alepha_orm66.PgAttr<alepha_orm66.PgAttr<alepha133.TString, typeof alepha_orm66.PG_PRIMARY_KEY>, typeof alepha_orm66.PG_DEFAULT>;
|
|
128
|
+
version: alepha_orm66.PgAttr<alepha_orm66.PgAttr<alepha133.TInteger, typeof alepha_orm66.PG_VERSION>, typeof alepha_orm66.PG_DEFAULT>;
|
|
129
|
+
createdAt: alepha_orm66.PgAttr<alepha_orm66.PgAttr<alepha133.TString, typeof alepha_orm66.PG_CREATED_AT>, typeof alepha_orm66.PG_DEFAULT>;
|
|
130
|
+
updatedAt: alepha_orm66.PgAttr<alepha_orm66.PgAttr<alepha133.TString, typeof alepha_orm66.PG_UPDATED_AT>, typeof alepha_orm66.PG_DEFAULT>;
|
|
131
|
+
type: alepha133.TUnsafe<"email" | "sms">;
|
|
132
|
+
template: alepha133.TString;
|
|
133
|
+
category: alepha133.TOptional<alepha133.TString>;
|
|
134
|
+
critical: alepha133.TOptional<alepha133.TBoolean>;
|
|
135
|
+
sensitive: alepha133.TOptional<alepha133.TBoolean>;
|
|
136
|
+
contact: alepha133.TString;
|
|
137
|
+
variables: alepha133.TOptional<alepha133.TRecord<"^.*$", alepha133.TAny>>;
|
|
138
|
+
scheduledAt: alepha133.TOptional<alepha133.TString>;
|
|
139
|
+
sentAt: alepha133.TOptional<alepha133.TString>;
|
|
140
|
+
error: alepha133.TOptional<alepha133.TObject<{
|
|
141
|
+
at: alepha133.TString;
|
|
142
|
+
name: alepha133.TString;
|
|
143
|
+
message: alepha133.TString;
|
|
144
|
+
}>>;
|
|
145
|
+
}>>;
|
|
146
|
+
protected readonly dateTimeProvider: DateTimeProvider;
|
|
147
|
+
protected readonly emailProvider: EmailProvider;
|
|
148
|
+
protected readonly smsProvider: SmsProvider;
|
|
149
|
+
send(notificationId: string | NotificationEntity): Promise<void>;
|
|
150
|
+
renderSms(notification: NotificationEntity): {
|
|
151
|
+
to: string;
|
|
152
|
+
message: string;
|
|
153
|
+
};
|
|
154
|
+
renderEmail(notification: NotificationEntity): {
|
|
155
|
+
to: string;
|
|
156
|
+
subject: string;
|
|
157
|
+
body: string;
|
|
158
|
+
};
|
|
159
|
+
protected load(notification: NotificationEntity): {
|
|
160
|
+
template: NotificationPrimitive<alepha133.TObject<alepha133.TProperties>>;
|
|
161
|
+
variables: Record<string, any>;
|
|
162
|
+
contact: string;
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
//#endregion
|
|
166
|
+
//#region ../../src/api/notifications/services/NotificationService.d.ts
|
|
167
|
+
declare const notificationServiceEnvSchema: alepha133.TObject<{
|
|
168
|
+
NOTIFICATION_QUEUE: alepha133.TOptional<alepha133.TBoolean>;
|
|
169
|
+
}>;
|
|
170
|
+
declare module "alepha" {
|
|
171
|
+
interface Env extends Partial<Static<typeof notificationServiceEnvSchema>> {}
|
|
172
|
+
}
|
|
173
|
+
declare class NotificationService {
|
|
174
|
+
protected readonly alepha: Alepha;
|
|
175
|
+
protected readonly log: alepha_logger0.Logger;
|
|
176
|
+
protected readonly env: {
|
|
177
|
+
NOTIFICATION_QUEUE?: boolean | undefined;
|
|
178
|
+
};
|
|
179
|
+
protected readonly notificationRepository: alepha_orm66.Repository<alepha133.TObject<{
|
|
180
|
+
id: alepha_orm66.PgAttr<alepha_orm66.PgAttr<alepha133.TString, typeof alepha_orm66.PG_PRIMARY_KEY>, typeof alepha_orm66.PG_DEFAULT>;
|
|
181
|
+
version: alepha_orm66.PgAttr<alepha_orm66.PgAttr<alepha133.TInteger, typeof alepha_orm66.PG_VERSION>, typeof alepha_orm66.PG_DEFAULT>;
|
|
182
|
+
createdAt: alepha_orm66.PgAttr<alepha_orm66.PgAttr<alepha133.TString, typeof alepha_orm66.PG_CREATED_AT>, typeof alepha_orm66.PG_DEFAULT>;
|
|
183
|
+
updatedAt: alepha_orm66.PgAttr<alepha_orm66.PgAttr<alepha133.TString, typeof alepha_orm66.PG_UPDATED_AT>, typeof alepha_orm66.PG_DEFAULT>;
|
|
184
|
+
type: alepha133.TUnsafe<"email" | "sms">;
|
|
185
|
+
template: alepha133.TString;
|
|
186
|
+
category: alepha133.TOptional<alepha133.TString>;
|
|
187
|
+
critical: alepha133.TOptional<alepha133.TBoolean>;
|
|
188
|
+
sensitive: alepha133.TOptional<alepha133.TBoolean>;
|
|
189
|
+
contact: alepha133.TString;
|
|
190
|
+
variables: alepha133.TOptional<alepha133.TRecord<"^.*$", alepha133.TAny>>;
|
|
191
|
+
scheduledAt: alepha133.TOptional<alepha133.TString>;
|
|
192
|
+
sentAt: alepha133.TOptional<alepha133.TString>;
|
|
193
|
+
error: alepha133.TOptional<alepha133.TObject<{
|
|
194
|
+
at: alepha133.TString;
|
|
195
|
+
name: alepha133.TString;
|
|
196
|
+
message: alepha133.TString;
|
|
197
|
+
}>>;
|
|
198
|
+
}>>;
|
|
199
|
+
protected readonly dateTimeProvider: DateTimeProvider;
|
|
200
|
+
protected readonly notificationSenderService: NotificationSenderService;
|
|
201
|
+
readonly notificationBatch: alepha_batch0.BatchPrimitive<alepha133.TObject<{
|
|
202
|
+
type: alepha133.TUnsafe<"email" | "sms">;
|
|
203
|
+
template: alepha133.TString;
|
|
204
|
+
contact: alepha133.TString;
|
|
205
|
+
variables: alepha133.TOptional<alepha133.TRecord<"^.*$", alepha133.TAny>>;
|
|
206
|
+
}>, Promise<void>>;
|
|
207
|
+
findNotificationById(id: string): Promise<alepha_orm66.PgStatic<alepha133.TObject<{
|
|
208
|
+
id: alepha_orm66.PgAttr<alepha_orm66.PgAttr<alepha133.TString, typeof alepha_orm66.PG_PRIMARY_KEY>, typeof alepha_orm66.PG_DEFAULT>;
|
|
209
|
+
version: alepha_orm66.PgAttr<alepha_orm66.PgAttr<alepha133.TInteger, typeof alepha_orm66.PG_VERSION>, typeof alepha_orm66.PG_DEFAULT>;
|
|
210
|
+
createdAt: alepha_orm66.PgAttr<alepha_orm66.PgAttr<alepha133.TString, typeof alepha_orm66.PG_CREATED_AT>, typeof alepha_orm66.PG_DEFAULT>;
|
|
211
|
+
updatedAt: alepha_orm66.PgAttr<alepha_orm66.PgAttr<alepha133.TString, typeof alepha_orm66.PG_UPDATED_AT>, typeof alepha_orm66.PG_DEFAULT>;
|
|
212
|
+
type: alepha133.TUnsafe<"email" | "sms">;
|
|
213
|
+
template: alepha133.TString;
|
|
214
|
+
category: alepha133.TOptional<alepha133.TString>;
|
|
215
|
+
critical: alepha133.TOptional<alepha133.TBoolean>;
|
|
216
|
+
sensitive: alepha133.TOptional<alepha133.TBoolean>;
|
|
217
|
+
contact: alepha133.TString;
|
|
218
|
+
variables: alepha133.TOptional<alepha133.TRecord<"^.*$", alepha133.TAny>>;
|
|
219
|
+
scheduledAt: alepha133.TOptional<alepha133.TString>;
|
|
220
|
+
sentAt: alepha133.TOptional<alepha133.TString>;
|
|
221
|
+
error: alepha133.TOptional<alepha133.TObject<{
|
|
222
|
+
at: alepha133.TString;
|
|
223
|
+
name: alepha133.TString;
|
|
224
|
+
message: alepha133.TString;
|
|
225
|
+
}>>;
|
|
226
|
+
}>, alepha_orm66.PgRelationMap<alepha133.TObject<{
|
|
227
|
+
id: alepha_orm66.PgAttr<alepha_orm66.PgAttr<alepha133.TString, typeof alepha_orm66.PG_PRIMARY_KEY>, typeof alepha_orm66.PG_DEFAULT>;
|
|
228
|
+
version: alepha_orm66.PgAttr<alepha_orm66.PgAttr<alepha133.TInteger, typeof alepha_orm66.PG_VERSION>, typeof alepha_orm66.PG_DEFAULT>;
|
|
229
|
+
createdAt: alepha_orm66.PgAttr<alepha_orm66.PgAttr<alepha133.TString, typeof alepha_orm66.PG_CREATED_AT>, typeof alepha_orm66.PG_DEFAULT>;
|
|
230
|
+
updatedAt: alepha_orm66.PgAttr<alepha_orm66.PgAttr<alepha133.TString, typeof alepha_orm66.PG_UPDATED_AT>, typeof alepha_orm66.PG_DEFAULT>;
|
|
231
|
+
type: alepha133.TUnsafe<"email" | "sms">;
|
|
232
|
+
template: alepha133.TString;
|
|
233
|
+
category: alepha133.TOptional<alepha133.TString>;
|
|
234
|
+
critical: alepha133.TOptional<alepha133.TBoolean>;
|
|
235
|
+
sensitive: alepha133.TOptional<alepha133.TBoolean>;
|
|
236
|
+
contact: alepha133.TString;
|
|
237
|
+
variables: alepha133.TOptional<alepha133.TRecord<"^.*$", alepha133.TAny>>;
|
|
238
|
+
scheduledAt: alepha133.TOptional<alepha133.TString>;
|
|
239
|
+
sentAt: alepha133.TOptional<alepha133.TString>;
|
|
240
|
+
error: alepha133.TOptional<alepha133.TObject<{
|
|
241
|
+
at: alepha133.TString;
|
|
242
|
+
name: alepha133.TString;
|
|
243
|
+
message: alepha133.TString;
|
|
244
|
+
}>>;
|
|
245
|
+
}>>>>;
|
|
246
|
+
findNotifications(q?: NotificationQuery): Promise<Page<NotificationEntity>>;
|
|
247
|
+
/**
|
|
248
|
+
* Create a new notification.
|
|
249
|
+
*/
|
|
250
|
+
createNotification(entry: NotificationCreate): Promise<void>;
|
|
251
|
+
}
|
|
252
|
+
//#endregion
|
|
253
|
+
//#region ../../src/api/notifications/controllers/NotificationController.d.ts
|
|
254
|
+
declare class NotificationController {
|
|
255
|
+
protected readonly url = "/notifications";
|
|
256
|
+
protected readonly group = "notifications";
|
|
257
|
+
protected readonly notificationService: NotificationService;
|
|
258
|
+
/**
|
|
259
|
+
* Find notifications with pagination and filtering.
|
|
260
|
+
*/
|
|
261
|
+
readonly findNotifications: alepha_server0.ActionPrimitiveFn<{
|
|
262
|
+
query: alepha133.TObject<{
|
|
263
|
+
page: alepha133.TOptional<alepha133.TInteger>;
|
|
264
|
+
size: alepha133.TOptional<alepha133.TInteger>;
|
|
265
|
+
sort: alepha133.TOptional<alepha133.TString>;
|
|
266
|
+
type: alepha133.TOptional<alepha133.TUnsafe<"email" | "sms">>;
|
|
267
|
+
template: alepha133.TOptional<alepha133.TString>;
|
|
268
|
+
contact: alepha133.TOptional<alepha133.TString>;
|
|
269
|
+
category: alepha133.TOptional<alepha133.TString>;
|
|
270
|
+
status: alepha133.TOptional<alepha133.TUnsafe<"pending" | "sent" | "failed">>;
|
|
271
|
+
}>;
|
|
272
|
+
response: alepha133.TPage<alepha133.TObject<{
|
|
273
|
+
id: alepha_orm66.PgAttr<alepha_orm66.PgAttr<alepha133.TString, typeof alepha_orm66.PG_PRIMARY_KEY>, typeof alepha_orm66.PG_DEFAULT>;
|
|
274
|
+
version: alepha_orm66.PgAttr<alepha_orm66.PgAttr<alepha133.TInteger, typeof alepha_orm66.PG_VERSION>, typeof alepha_orm66.PG_DEFAULT>;
|
|
275
|
+
createdAt: alepha_orm66.PgAttr<alepha_orm66.PgAttr<alepha133.TString, typeof alepha_orm66.PG_CREATED_AT>, typeof alepha_orm66.PG_DEFAULT>;
|
|
276
|
+
updatedAt: alepha_orm66.PgAttr<alepha_orm66.PgAttr<alepha133.TString, typeof alepha_orm66.PG_UPDATED_AT>, typeof alepha_orm66.PG_DEFAULT>;
|
|
277
|
+
type: alepha133.TUnsafe<"email" | "sms">;
|
|
278
|
+
template: alepha133.TString;
|
|
279
|
+
category: alepha133.TOptional<alepha133.TString>;
|
|
280
|
+
critical: alepha133.TOptional<alepha133.TBoolean>;
|
|
281
|
+
sensitive: alepha133.TOptional<alepha133.TBoolean>;
|
|
282
|
+
contact: alepha133.TString;
|
|
283
|
+
variables: alepha133.TOptional<alepha133.TRecord<"^.*$", alepha133.TAny>>;
|
|
284
|
+
scheduledAt: alepha133.TOptional<alepha133.TString>;
|
|
285
|
+
sentAt: alepha133.TOptional<alepha133.TString>;
|
|
286
|
+
error: alepha133.TOptional<alepha133.TObject<{
|
|
287
|
+
at: alepha133.TString;
|
|
288
|
+
name: alepha133.TString;
|
|
289
|
+
message: alepha133.TString;
|
|
290
|
+
}>>;
|
|
291
|
+
}>>;
|
|
292
|
+
}>;
|
|
293
|
+
}
|
|
294
|
+
//#endregion
|
|
295
|
+
//#region ../../src/api/notifications/jobs/NotificationJobs.d.ts
|
|
296
|
+
declare class NotificationJobs {}
|
|
297
|
+
//#endregion
|
|
298
|
+
//#region ../../src/api/notifications/queues/NotificationQueues.d.ts
|
|
299
|
+
declare class NotificationQueues {
|
|
300
|
+
protected readonly notificationSenderService: NotificationSenderService;
|
|
301
|
+
readonly processNotification: alepha_queue0.QueuePrimitive<alepha133.TObject<{
|
|
302
|
+
notificationId: alepha133.TString;
|
|
303
|
+
}>>;
|
|
304
|
+
}
|
|
305
|
+
//#endregion
|
|
306
|
+
//#region ../../src/api/notifications/schemas/notificationContactPreferencesSchema.d.ts
|
|
307
|
+
declare const notificationContactPreferencesSchema: alepha133.TObject<{
|
|
308
|
+
language: alepha133.TOptional<alepha133.TString>;
|
|
309
|
+
exclude: alepha133.TArray<alepha133.TString>;
|
|
310
|
+
}>;
|
|
311
|
+
type NotificationContactPreferences = Static<typeof notificationContactPreferencesSchema>;
|
|
312
|
+
//#endregion
|
|
313
|
+
//#region ../../src/api/notifications/index.d.ts
|
|
314
|
+
/**
|
|
315
|
+
* Provides notification management API endpoints for Alepha applications.
|
|
316
|
+
*
|
|
317
|
+
* This module includes notification sending, retrieval, status tracking,
|
|
318
|
+
* and user notification preferences management.
|
|
319
|
+
*
|
|
320
|
+
* Requires `AlephaSms` module to be loaded for SMS notifications.
|
|
321
|
+
*
|
|
322
|
+
* @module alepha.api.notifications
|
|
323
|
+
*/
|
|
324
|
+
declare const AlephaApiNotifications: alepha133.Service<alepha133.Module>;
|
|
325
|
+
//#endregion
|
|
326
|
+
export { $notification, AlephaApiNotifications, NotificationContactPreferences, NotificationController, NotificationCreate, NotificationEntity, NotificationJobs, NotificationMessage, NotificationPrimitive, NotificationPrimitiveOptions, NotificationPushOptions, NotificationQuery, NotificationQueues, NotificationSenderService, NotificationService, notificationContactPreferencesSchema, notificationCreateSchema, notificationQuerySchema, notificationServiceEnvSchema, notifications };
|
|
327
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -8,7 +8,7 @@ import { $queue } from "alepha/queue";
|
|
|
8
8
|
import { EmailProvider } from "alepha/email";
|
|
9
9
|
import { SmsProvider } from "alepha/sms";
|
|
10
10
|
|
|
11
|
-
//#region ../../src/api
|
|
11
|
+
//#region ../../src/api/notifications/entities/notifications.ts
|
|
12
12
|
const notifications = $entity({
|
|
13
13
|
name: "notifications",
|
|
14
14
|
schema: t.object({
|
|
@@ -34,7 +34,7 @@ const notifications = $entity({
|
|
|
34
34
|
});
|
|
35
35
|
|
|
36
36
|
//#endregion
|
|
37
|
-
//#region ../../src/api
|
|
37
|
+
//#region ../../src/api/notifications/schemas/notificationQuerySchema.ts
|
|
38
38
|
const notificationQuerySchema = t.extend(pageQuerySchema, {
|
|
39
39
|
type: t.optional(t.enum(["email", "sms"])),
|
|
40
40
|
template: t.optional(t.string()),
|
|
@@ -48,7 +48,7 @@ const notificationQuerySchema = t.extend(pageQuerySchema, {
|
|
|
48
48
|
});
|
|
49
49
|
|
|
50
50
|
//#endregion
|
|
51
|
-
//#region ../../src/api
|
|
51
|
+
//#region ../../src/api/notifications/primitives/$notification.ts
|
|
52
52
|
/**
|
|
53
53
|
* Creates a notification primitive for managing email/SMS notification templates.
|
|
54
54
|
*
|
|
@@ -97,7 +97,7 @@ var NotificationPrimitive = class extends Primitive {
|
|
|
97
97
|
$notification[KIND] = NotificationPrimitive;
|
|
98
98
|
|
|
99
99
|
//#endregion
|
|
100
|
-
//#region ../../src/api
|
|
100
|
+
//#region ../../src/api/notifications/services/NotificationSenderService.ts
|
|
101
101
|
var NotificationSenderService = class {
|
|
102
102
|
alepha = $inject(Alepha);
|
|
103
103
|
log = $logger();
|
|
@@ -225,7 +225,7 @@ var NotificationSenderService = class {
|
|
|
225
225
|
};
|
|
226
226
|
|
|
227
227
|
//#endregion
|
|
228
|
-
//#region ../../src/api
|
|
228
|
+
//#region ../../src/api/notifications/queues/NotificationQueues.ts
|
|
229
229
|
var NotificationQueues = class {
|
|
230
230
|
notificationSenderService = $inject(NotificationSenderService);
|
|
231
231
|
processNotification = $queue({
|
|
@@ -238,7 +238,7 @@ var NotificationQueues = class {
|
|
|
238
238
|
};
|
|
239
239
|
|
|
240
240
|
//#endregion
|
|
241
|
-
//#region ../../src/api
|
|
241
|
+
//#region ../../src/api/notifications/schemas/notificationCreateSchema.ts
|
|
242
242
|
const notificationCreateSchema = t.pick(notifications.schema, [
|
|
243
243
|
"type",
|
|
244
244
|
"contact",
|
|
@@ -247,7 +247,7 @@ const notificationCreateSchema = t.pick(notifications.schema, [
|
|
|
247
247
|
]);
|
|
248
248
|
|
|
249
249
|
//#endregion
|
|
250
|
-
//#region ../../src/api
|
|
250
|
+
//#region ../../src/api/notifications/services/NotificationService.ts
|
|
251
251
|
const notificationServiceEnvSchema = t.object({ NOTIFICATION_QUEUE: t.optional(t.boolean({ description: "If true, notifications will be queued instead of sent immediately" })) });
|
|
252
252
|
var NotificationService = class {
|
|
253
253
|
alepha = $inject(Alepha);
|
|
@@ -333,7 +333,7 @@ var NotificationService = class {
|
|
|
333
333
|
};
|
|
334
334
|
|
|
335
335
|
//#endregion
|
|
336
|
-
//#region ../../src/api
|
|
336
|
+
//#region ../../src/api/notifications/controllers/NotificationController.ts
|
|
337
337
|
var NotificationController = class {
|
|
338
338
|
url = "/notifications";
|
|
339
339
|
group = "notifications";
|
|
@@ -354,18 +354,18 @@ var NotificationController = class {
|
|
|
354
354
|
};
|
|
355
355
|
|
|
356
356
|
//#endregion
|
|
357
|
-
//#region ../../src/api
|
|
357
|
+
//#region ../../src/api/notifications/jobs/NotificationJobs.ts
|
|
358
358
|
var NotificationJobs = class {};
|
|
359
359
|
|
|
360
360
|
//#endregion
|
|
361
|
-
//#region ../../src/api
|
|
361
|
+
//#region ../../src/api/notifications/schemas/notificationContactPreferencesSchema.ts
|
|
362
362
|
const notificationContactPreferencesSchema = t.object({
|
|
363
363
|
language: t.optional(t.text()),
|
|
364
364
|
exclude: t.array(t.text())
|
|
365
365
|
});
|
|
366
366
|
|
|
367
367
|
//#endregion
|
|
368
|
-
//#region ../../src/api
|
|
368
|
+
//#region ../../src/api/notifications/index.ts
|
|
369
369
|
/**
|
|
370
370
|
* Provides notification management API endpoints for Alepha applications.
|
|
371
371
|
*
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["notifications"],"sources":["../../../src/api/notifications/entities/notifications.ts","../../../src/api/notifications/schemas/notificationQuerySchema.ts","../../../src/api/notifications/primitives/$notification.ts","../../../src/api/notifications/services/NotificationSenderService.ts","../../../src/api/notifications/queues/NotificationQueues.ts","../../../src/api/notifications/schemas/notificationCreateSchema.ts","../../../src/api/notifications/services/NotificationService.ts","../../../src/api/notifications/controllers/NotificationController.ts","../../../src/api/notifications/jobs/NotificationJobs.ts","../../../src/api/notifications/schemas/notificationContactPreferencesSchema.ts","../../../src/api/notifications/index.ts"],"sourcesContent":["import { type Static, t } from \"alepha\";\nimport { $entity, pg } from \"alepha/orm\";\n\nexport const notifications = $entity({\n name: \"notifications\",\n schema: t.object({\n id: pg.primaryKey(t.uuid()),\n\n version: pg.version(),\n\n createdAt: pg.createdAt(),\n\n updatedAt: pg.updatedAt(),\n\n // -----------------------------------------------------------------------------------------------------------------\n\n type: t.enum([\"email\", \"sms\"]),\n\n template: t.text(), // e.g. 'resetPassword'\n\n category: t.optional(\n t.text({\n description:\n \"For grouping related notifications (e.g., 'authentication', 'marketing'). Contact can filter notifications by category.\",\n }),\n ),\n\n critical: t.optional(\n t.boolean({\n description:\n \"Prioritize delivery of this notification. Set to true for important system alerts.\",\n }),\n ),\n\n sensitive: t.optional(\n t.boolean({\n description:\n \"Message won't be logged or stored in plain text. Set to true when notification contains passwords or codes.\",\n }),\n ),\n\n // -----------------------------------------------------------------------------------------------------------------\n\n contact: t.text(), // e.g. email address or phone number or user ID or whatever\n\n variables: t.optional(t.record(t.text(), t.any())),\n\n scheduledAt: t.optional(\n t.datetime({\n description:\n \"When set, the notification will be sent at or after this date/time.\",\n }),\n ),\n\n // -----------------------------------------------------------------------------------------------------------------\n\n sentAt: t.optional(t.datetime()),\n\n error: t.optional(\n t.object({\n at: t.datetime(),\n name: t.text(),\n message: t.text({ size: \"rich\" }),\n }),\n ),\n\n // TODO: retryCount, lastRetryAt, etc.\n }),\n});\n\nexport type NotificationEntity = Static<typeof notifications.schema>;\n","import type { Static } from \"alepha\";\nimport { t } from \"alepha\";\nimport { pageQuerySchema } from \"alepha/orm\";\n\nexport const notificationQuerySchema = t.extend(pageQuerySchema, {\n type: t.optional(t.enum([\"email\", \"sms\"])),\n template: t.optional(t.string()),\n contact: t.optional(t.string()),\n category: t.optional(t.string()),\n status: t.optional(t.enum([\"pending\", \"sent\", \"failed\"])),\n});\n\nexport type NotificationQuery = Static<typeof notificationQuerySchema>;\n","import {\n $inject,\n createPrimitive,\n KIND,\n Primitive,\n type Static,\n type StaticEncode,\n type TObject,\n} from \"alepha\";\nimport { NotificationService } from \"../services/NotificationService.ts\";\n\n/**\n * Creates a notification primitive for managing email/SMS notification templates.\n *\n * Provides type-safe, reusable notification templates with multi-language support,\n * variable substitution, and categorization for different notification channels.\n *\n * @example\n * ```ts\n * class NotificationTemplates {\n * welcomeEmail = $notification({\n * name: \"welcome-email\",\n * category: \"onboarding\",\n * schema: t.object({ username: t.text(), activationLink: t.text() }),\n * email: {\n * subject: \"Welcome to our platform!\",\n * body: (vars) => `Hello ${vars.username}, click: ${vars.activationLink}`\n * }\n * });\n *\n * async sendWelcome(user: User) {\n * await this.welcomeEmail.push({\n * variables: { username: user.name, activationLink: generateLink() },\n * contact: user.email\n * });\n * }\n * }\n * ```\n */\nexport const $notification = <T extends TObject>(\n options: NotificationPrimitiveOptions<T>,\n) => createPrimitive(NotificationPrimitive<T>, options);\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface NotificationPrimitiveOptions<T extends TObject>\n extends NotificationMessage<T> {\n name?: string;\n description?: string;\n category?: string;\n critical?: boolean;\n sensitive?: boolean;\n translations?: {\n // e.g., \"en\", \"fr\", even \"en-US\"\n [lang: string]: NotificationMessage<T>;\n };\n schema: T;\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class NotificationPrimitive<T extends TObject> extends Primitive<\n NotificationPrimitiveOptions<T>\n> {\n protected readonly notificationService = $inject(NotificationService);\n\n public get name() {\n return this.options.name ?? `${this.config.propertyKey}`;\n }\n\n public async push(options: NotificationPushOptions<T>) {\n if (this.options.email) {\n await this.notificationService.createNotification({\n ...options,\n type: \"email\",\n template: this.name,\n });\n }\n }\n\n public configure(options: Partial<NotificationPrimitiveOptions<T>>) {\n Object.assign(this.options, options);\n }\n}\n\n$notification[KIND] = NotificationPrimitive;\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface NotificationPushOptions<T extends TObject> {\n variables: StaticEncode<T>;\n contact: string;\n}\n\nexport interface NotificationMessage<T extends TObject> {\n email?: {\n subject: string;\n body: string | ((variables: Static<T>) => string);\n };\n sms?: {\n message: string | ((variables: Static<T>) => string);\n };\n}\n","import { $inject, Alepha, AlephaError } from \"alepha\";\nimport { DateTimeProvider } from \"alepha/datetime\";\nimport { EmailProvider } from \"alepha/email\";\nimport { $logger } from \"alepha/logger\";\nimport { $repository } from \"alepha/orm\";\nimport { SmsProvider } from \"alepha/sms\";\nimport {\n type NotificationEntity,\n notifications,\n} from \"../entities/notifications.ts\";\nimport { $notification } from \"../primitives/$notification.ts\";\n\nexport class NotificationSenderService {\n protected readonly alepha = $inject(Alepha);\n protected readonly log = $logger();\n protected readonly notificationRepository = $repository(notifications);\n protected readonly dateTimeProvider = $inject(DateTimeProvider);\n protected readonly emailProvider = $inject(EmailProvider);\n protected readonly smsProvider = $inject(SmsProvider);\n\n public async send(notificationId: string | NotificationEntity) {\n this.log.trace(\"Sending notification\", {\n notificationId:\n typeof notificationId === \"string\" ? notificationId : notificationId.id,\n });\n\n const notification =\n typeof notificationId === \"string\"\n ? await this.notificationRepository.findById(notificationId)\n : notificationId;\n\n if (notification.sentAt) {\n this.log.debug(\"Notification already sent\", {\n notificationId: notification.id,\n sentAt: notification.sentAt,\n });\n return;\n }\n\n this.log.debug(\"Processing notification\", {\n id: notification.id,\n type: notification.type,\n template: notification.template,\n contact: notification.contact,\n });\n\n try {\n if (notification.type === \"email\") {\n await this.emailProvider.send(this.renderEmail(notification));\n notification.sentAt = this.dateTimeProvider.nowISOString();\n this.log.info(\"Email notification sent\", {\n id: notification.id,\n template: notification.template,\n contact: notification.contact,\n });\n }\n if (notification.type === \"sms\") {\n await this.smsProvider.send(this.renderSms(notification));\n notification.sentAt = this.dateTimeProvider.nowISOString();\n this.log.info(\"SMS notification sent\", {\n id: notification.id,\n template: notification.template,\n contact: notification.contact,\n });\n }\n } catch (e) {\n this.log.error(\"Failed to send notification\", {\n id: notification.id,\n type: notification.type,\n template: notification.template,\n contact: notification.contact,\n error: e,\n });\n if (e instanceof Error) {\n notification.error = {\n at: this.dateTimeProvider.nowISOString(),\n name: e.name,\n message: e.message,\n };\n }\n } finally {\n await this.notificationRepository.save(notification);\n }\n }\n\n public renderSms(notification: NotificationEntity) {\n this.log.trace(\"Rendering SMS notification\", {\n id: notification.id,\n template: notification.template,\n });\n\n const { variables, contact, template } = this.load(notification);\n\n const sms = template.options.sms;\n if (!sms) {\n this.log.error(\"Notification template has no SMS defined\", {\n id: notification.id,\n template: notification.template,\n });\n throw new AlephaError(\n `Notification template ${notification.template} has no sms defined`,\n );\n }\n\n this.log.debug(\"Rendering SMS\", {\n template: notification.template,\n contact,\n });\n\n const message =\n typeof sms.message === \"function\"\n ? sms.message(variables as any)\n : sms.message;\n\n return {\n to: contact,\n message,\n };\n }\n\n public renderEmail(notification: NotificationEntity) {\n this.log.trace(\"Rendering email notification\", {\n id: notification.id,\n template: notification.template,\n });\n\n const { variables, contact, template } = this.load(notification);\n\n const email = template.options.email;\n if (!email) {\n this.log.error(\"Notification template has no email defined\", {\n id: notification.id,\n template: notification.template,\n });\n throw new AlephaError(\n `Notification template ${notification.template} has no email defined`,\n );\n }\n\n this.log.debug(\"Rendering email\", {\n template: notification.template,\n contact,\n subject: email.subject,\n });\n\n const subject = email.subject;\n\n const body =\n typeof email.body === \"function\"\n ? email.body(variables as any)\n : email.body;\n\n return {\n to: contact,\n subject,\n body,\n };\n }\n\n protected load(notification: NotificationEntity) {\n const variables = notification.variables || {};\n const contact = notification.contact;\n const template = this.alepha\n .primitives($notification)\n .find((it) => it.name === notification.template);\n\n if (!template) {\n this.log.error(\"Notification template not found\", {\n id: notification.id,\n template: notification.template,\n });\n throw new AlephaError(\n `No notification template found for ${notification.template}`,\n );\n }\n\n return {\n template,\n variables,\n contact,\n };\n }\n}\n","import { $inject, t } from \"alepha\";\nimport { $queue } from \"alepha/queue\";\nimport { NotificationSenderService } from \"../services/NotificationSenderService.ts\";\n\nexport class NotificationQueues {\n protected readonly notificationSenderService = $inject(\n NotificationSenderService,\n );\n\n public readonly processNotification = $queue({\n description: \"Queue for processing notifications\",\n schema: t.object({\n notificationId: t.string({ format: \"uuid\" }),\n }),\n handler: async (message) => {\n await this.notificationSenderService.send(message.payload.notificationId);\n },\n });\n}\n","import { type Static, t } from \"alepha\";\nimport { notifications } from \"../entities/notifications.ts\";\n\nexport const notificationCreateSchema = t.pick(notifications.schema, [\n \"type\",\n \"contact\",\n \"template\",\n \"variables\",\n]);\n\nexport type NotificationCreate = Static<typeof notificationCreateSchema>;\n","import { $env, $inject, Alepha, type Static, t } from \"alepha\";\nimport { $batch } from \"alepha/batch\";\nimport { DateTimeProvider } from \"alepha/datetime\";\nimport { $logger } from \"alepha/logger\";\nimport { $repository, type Page } from \"alepha/orm\";\nimport {\n type NotificationEntity,\n notifications,\n} from \"../entities/notifications.ts\";\nimport { NotificationQueues } from \"../queues/NotificationQueues.ts\";\nimport {\n type NotificationCreate,\n notificationCreateSchema,\n} from \"../schemas/notificationCreateSchema.ts\";\nimport type { NotificationQuery } from \"../schemas/notificationQuerySchema.ts\";\nimport { NotificationSenderService } from \"./NotificationSenderService.ts\";\n\nexport const notificationServiceEnvSchema = t.object({\n NOTIFICATION_QUEUE: t.optional(\n t.boolean({\n description:\n \"If true, notifications will be queued instead of sent immediately\",\n }),\n ),\n});\n\ndeclare module \"alepha\" {\n interface Env extends Partial<Static<typeof notificationServiceEnvSchema>> {}\n}\n\nexport class NotificationService {\n protected readonly alepha = $inject(Alepha);\n protected readonly log = $logger();\n protected readonly env = $env(notificationServiceEnvSchema);\n protected readonly notificationRepository = $repository(notifications);\n protected readonly dateTimeProvider = $inject(DateTimeProvider);\n protected readonly notificationSenderService = $inject(\n NotificationSenderService,\n );\n\n public readonly notificationBatch = $batch({\n maxSize: 100,\n maxDuration: [15, \"seconds\"],\n schema: notificationCreateSchema,\n handler: async (notifications: NotificationCreate[]) => {\n this.log.debug(\"Processing notification batch\", {\n size: notifications.length,\n templates: [...new Set(notifications.map((n) => n.template))],\n });\n\n const entities =\n await this.notificationRepository.createMany(notifications);\n\n await this.alepha\n .inject(NotificationQueues)\n .processNotification.push(\n ...entities.map((it) => ({ notificationId: it.id })),\n );\n\n this.log.info(\"Notification batch queued\", {\n count: entities.length,\n ids: entities.map((it) => it.id),\n });\n },\n });\n\n public async findNotificationById(id: string) {\n this.log.trace(\"Finding notification by ID\", { id });\n return this.notificationRepository.findOne({ where: { id } });\n }\n\n public async findNotifications(\n q: NotificationQuery = {},\n ): Promise<Page<NotificationEntity>> {\n this.log.trace(\"Finding notifications\", { query: q });\n q.sort ??= \"-createdAt\";\n\n const where = this.notificationRepository.createQueryWhere();\n\n if (q.type) {\n where.type = { eq: q.type };\n }\n\n if (q.template) {\n where.template = { like: `%${q.template}%` };\n }\n\n if (q.contact) {\n where.contact = { like: `%${q.contact}%` };\n }\n\n if (q.category) {\n where.category = { eq: q.category };\n }\n\n if (q.status) {\n if (q.status === \"sent\") {\n where.sentAt = { isNotNull: true };\n where.error = { isNull: true };\n } else if (q.status === \"failed\") {\n where.error = { isNotNull: true };\n } else if (q.status === \"pending\") {\n where.sentAt = { isNull: true };\n where.error = { isNull: true };\n }\n }\n\n return this.notificationRepository.paginate(q, { where }, { count: true });\n }\n\n /**\n * Create a new notification.\n */\n public async createNotification(entry: NotificationCreate): Promise<void> {\n this.log.trace(\"Creating notification\", {\n template: entry.template,\n type: entry.type,\n contact: entry.contact,\n });\n\n if (\n this.env.NOTIFICATION_QUEUE !== true ||\n this.alepha.isServerless() ||\n this.alepha.isTest()\n ) {\n this.log.debug(\"Sending notification immediately\", {\n template: entry.template,\n type: entry.type,\n contact: entry.contact,\n });\n const notification = await this.notificationRepository.create(entry);\n await this.notificationSenderService.send(notification);\n return;\n }\n\n this.log.debug(\"Queuing notification to batch\", {\n template: entry.template,\n type: entry.type,\n contact: entry.contact,\n });\n\n this.notificationBatch.push(entry).catch((e) => {\n this.log.error(\"Failed to push notification to batch\", {\n template: entry.template,\n type: entry.type,\n contact: entry.contact,\n error: e,\n });\n });\n }\n}\n","import { $inject } from \"alepha\";\nimport { pg } from \"alepha/orm\";\nimport { $action } from \"alepha/server\";\nimport { notifications } from \"../entities/notifications.ts\";\nimport { notificationQuerySchema } from \"../schemas/notificationQuerySchema.ts\";\nimport { NotificationService } from \"../services/NotificationService.ts\";\n\nexport class NotificationController {\n protected readonly url = \"/notifications\";\n protected readonly group = \"notifications\";\n protected readonly notificationService = $inject(NotificationService);\n\n /**\n * Find notifications with pagination and filtering.\n */\n public readonly findNotifications = $action({\n path: this.url,\n group: this.group,\n description: \"Find notifications with pagination and filtering\",\n schema: {\n query: notificationQuerySchema,\n response: pg.page(notifications.schema),\n },\n handler: ({ query }) => this.notificationService.findNotifications(query),\n });\n}\n","export class NotificationJobs {\n // - retry (lost, failed) notifications\n // - purge old notifications\n}\n","import { type Static, t } from \"alepha\";\n\nexport const notificationContactPreferencesSchema = t.object({\n language: t.optional(t.text()),\n exclude: t.array(t.text()),\n});\n\nexport type NotificationContactPreferences = Static<\n typeof notificationContactPreferencesSchema\n>;\n","import { $module } from \"alepha\";\nimport { NotificationController } from \"./controllers/NotificationController.ts\";\nimport { NotificationJobs } from \"./jobs/NotificationJobs.ts\";\nimport { $notification } from \"./primitives/$notification.ts\";\nimport { NotificationQueues } from \"./queues/NotificationQueues.ts\";\nimport { NotificationSenderService } from \"./services/NotificationSenderService.ts\";\nimport {\n NotificationService,\n notificationServiceEnvSchema,\n} from \"./services/NotificationService.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./controllers/NotificationController.ts\";\nexport * from \"./entities/notifications.ts\";\nexport * from \"./jobs/NotificationJobs.ts\";\nexport * from \"./primitives/$notification.ts\";\nexport * from \"./queues/NotificationQueues.ts\";\nexport * from \"./schemas/notificationContactPreferencesSchema.ts\";\nexport * from \"./schemas/notificationCreateSchema.ts\";\nexport * from \"./schemas/notificationQuerySchema.ts\";\nexport * from \"./services/NotificationSenderService.ts\";\nexport * from \"./services/NotificationService.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Provides notification management API endpoints for Alepha applications.\n *\n * This module includes notification sending, retrieval, status tracking,\n * and user notification preferences management.\n *\n * Requires `AlephaSms` module to be loaded for SMS notifications.\n *\n * @module alepha.api.notifications\n */\nexport const AlephaApiNotifications = $module({\n name: \"alepha.api.notifications\",\n primitives: [$notification],\n services: [\n NotificationController,\n NotificationService,\n NotificationSenderService,\n NotificationQueues,\n NotificationJobs,\n ],\n register: (alepha) => {\n const env = alepha.parseEnv(notificationServiceEnvSchema);\n if (env.NOTIFICATION_QUEUE) {\n alepha.with(NotificationQueues);\n }\n\n alepha\n .with(NotificationController)\n .with(NotificationService)\n .with(NotificationSenderService)\n .with(NotificationJobs);\n },\n});\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { $module, t } from "alepha";
|
|
2
2
|
import { $entity, pg } from "alepha/orm";
|
|
3
3
|
|
|
4
|
-
//#region ../../src/api
|
|
4
|
+
//#region ../../src/api/parameters/entities/parameters.ts
|
|
5
5
|
/**
|
|
6
6
|
* Configuration parameter entity for versioned configuration management.
|
|
7
7
|
*
|
|
@@ -49,7 +49,7 @@ const parameters = $entity({
|
|
|
49
49
|
});
|
|
50
50
|
|
|
51
51
|
//#endregion
|
|
52
|
-
//#region ../../src/api
|
|
52
|
+
//#region ../../src/api/parameters/index.browser.ts
|
|
53
53
|
const AlephaApiParameters = $module({
|
|
54
54
|
name: "alepha.api.parameters",
|
|
55
55
|
services: []
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.browser.js","names":[],"sources":["../../../src/api/parameters/entities/parameters.ts","../../../src/api/parameters/index.browser.ts"],"sourcesContent":["import { type Static, t } from \"alepha\";\nimport { $entity, pg } from \"alepha/orm\";\n\n/**\n * Parameter status values.\n *\n * - EXPIRED: Past version, no longer active\n * - CURRENT: Currently active version\n * - NEXT: Scheduled to become active (closest future date)\n * - FUTURE: Scheduled for activation after NEXT\n */\nexport type ParameterStatus = \"expired\" | \"current\" | \"next\" | \"future\";\n\n/**\n * Configuration parameter entity for versioned configuration management.\n *\n * Stores all versions of configuration parameters with:\n * - Automatic status management (expired, current, next, future)\n * - Schema versioning for migrations\n * - Activation scheduling\n * - Audit trail (creator info)\n */\nexport const parameters = $entity({\n name: \"parameters\",\n schema: t.object({\n id: pg.primaryKey(t.uuid()),\n createdAt: pg.createdAt(),\n updatedAt: pg.updatedAt(),\n\n /**\n * Configuration name using dot notation for tree hierarchy.\n * Examples: \"app.features\", \"app.pricing.tiers\", \"system.limits\"\n */\n name: t.text(),\n\n /**\n * The configuration content as JSON.\n */\n content: t.json(),\n\n /**\n * Schema version hash for detecting schema changes.\n * Used for auto-migration when schema evolves.\n */\n schemaHash: t.text(),\n\n /**\n * Current status of this parameter version.\n */\n status: pg.default(\n t.enum([\"expired\", \"current\", \"next\", \"future\"]),\n \"future\",\n ),\n\n /**\n * When this version should become active.\n * Default is immediate (now).\n */\n activationDate: t.datetime(),\n\n /**\n * When this version was deactivated (became expired).\n * Null if still active or scheduled.\n */\n expiredAt: t.optional(t.datetime()),\n\n /**\n * Version number for this configuration.\n * Auto-incremented per config name.\n */\n version: t.integer(),\n\n /**\n * Optional description of changes in this version.\n */\n changeDescription: t.optional(t.text()),\n\n /**\n * Optional tags for filtering/categorization.\n */\n tags: t.optional(t.array(t.text())),\n\n /**\n * Creator user ID (if available).\n */\n creatorId: t.optional(t.uuid()),\n\n /**\n * Creator display name for audit trail.\n */\n creatorName: t.optional(t.text()),\n\n /**\n * Previous content before this change (for rollback reference).\n */\n previousContent: t.optional(t.json()),\n\n /**\n * Migration log if schema changed.\n */\n migrationLog: t.optional(t.text()),\n }),\n indexes: [\n { columns: [\"name\", \"status\"] },\n { columns: [\"name\", \"activationDate\"] },\n { columns: [\"name\", \"version\"], unique: true },\n { columns: [\"status\"] },\n { columns: [\"activationDate\"] },\n ],\n});\n\nexport type Parameter = Static<typeof parameters.schema>;\nexport type ParameterInsert = Omit<Parameter, \"id\" | \"createdAt\" | \"updatedAt\">;\n","import { $module } from \"alepha\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./entities/parameters.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport const AlephaApiParameters = $module({\n name: \"alepha.api.parameters\",\n services: [],\n});\n"],"mappings":";;;;;;;;;;;;;AAsBA,MAAa,aAAa,QAAQ;CAChC,MAAM;CACN,QAAQ,EAAE,OAAO;EACf,IAAI,GAAG,WAAW,EAAE,MAAM,CAAC;EAC3B,WAAW,GAAG,WAAW;EACzB,WAAW,GAAG,WAAW;EAMzB,MAAM,EAAE,MAAM;EAKd,SAAS,EAAE,MAAM;EAMjB,YAAY,EAAE,MAAM;EAKpB,QAAQ,GAAG,QACT,EAAE,KAAK;GAAC;GAAW;GAAW;GAAQ;GAAS,CAAC,EAChD,SACD;EAMD,gBAAgB,EAAE,UAAU;EAM5B,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC;EAMnC,SAAS,EAAE,SAAS;EAKpB,mBAAmB,EAAE,SAAS,EAAE,MAAM,CAAC;EAKvC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;EAKnC,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC;EAK/B,aAAa,EAAE,SAAS,EAAE,MAAM,CAAC;EAKjC,iBAAiB,EAAE,SAAS,EAAE,MAAM,CAAC;EAKrC,cAAc,EAAE,SAAS,EAAE,MAAM,CAAC;EACnC,CAAC;CACF,SAAS;EACP,EAAE,SAAS,CAAC,QAAQ,SAAS,EAAE;EAC/B,EAAE,SAAS,CAAC,QAAQ,iBAAiB,EAAE;EACvC;GAAE,SAAS,CAAC,QAAQ,UAAU;GAAE,QAAQ;GAAM;EAC9C,EAAE,SAAS,CAAC,SAAS,EAAE;EACvB,EAAE,SAAS,CAAC,iBAAiB,EAAE;EAChC;CACF,CAAC;;;;ACrGF,MAAa,sBAAsB,QAAQ;CACzC,MAAM;CACN,UAAU,EAAE;CACb,CAAC"}
|
|
@@ -8,7 +8,7 @@ import * as alepha_topic0 from "alepha/topic";
|
|
|
8
8
|
import * as alepha_scheduler0 from "alepha/scheduler";
|
|
9
9
|
import { UserAccount } from "alepha/security";
|
|
10
10
|
|
|
11
|
-
//#region ../../src/api
|
|
11
|
+
//#region ../../src/api/parameters/entities/parameters.d.ts
|
|
12
12
|
/**
|
|
13
13
|
* Parameter status values.
|
|
14
14
|
*
|
|
@@ -92,7 +92,7 @@ declare const parameters: alepha_orm14.EntityPrimitive<alepha317.TObject<{
|
|
|
92
92
|
type Parameter = Static<typeof parameters.schema>;
|
|
93
93
|
type ParameterInsert = Omit<Parameter, "id" | "createdAt" | "updatedAt">;
|
|
94
94
|
//#endregion
|
|
95
|
-
//#region ../../src/api
|
|
95
|
+
//#region ../../src/api/parameters/primitives/$config.d.ts
|
|
96
96
|
/**
|
|
97
97
|
* Creates a versioned configuration primitive for managing application settings.
|
|
98
98
|
*
|
|
@@ -270,7 +270,7 @@ interface SetConfigOptions {
|
|
|
270
270
|
tags?: string[];
|
|
271
271
|
}
|
|
272
272
|
//#endregion
|
|
273
|
-
//#region ../../src/api
|
|
273
|
+
//#region ../../src/api/parameters/services/ConfigStore.d.ts
|
|
274
274
|
/**
|
|
275
275
|
* Payload for config sync events across instances.
|
|
276
276
|
*/
|
|
@@ -427,7 +427,7 @@ interface ConfigTreeNode {
|
|
|
427
427
|
children: ConfigTreeNode[];
|
|
428
428
|
}
|
|
429
429
|
//#endregion
|
|
430
|
-
//#region ../../src/api
|
|
430
|
+
//#region ../../src/api/parameters/controllers/ConfigController.d.ts
|
|
431
431
|
/**
|
|
432
432
|
* REST API controller for versioned configuration management.
|
|
433
433
|
*
|
|
@@ -701,7 +701,7 @@ declare class ConfigController {
|
|
|
701
701
|
}>;
|
|
702
702
|
}
|
|
703
703
|
//#endregion
|
|
704
|
-
//#region ../../src/api
|
|
704
|
+
//#region ../../src/api/parameters/schedulers/ConfigActivationScheduler.d.ts
|
|
705
705
|
/**
|
|
706
706
|
* Scheduler that periodically checks for scheduled configurations
|
|
707
707
|
* that should be activated.
|
|
@@ -718,7 +718,7 @@ declare class ConfigActivationScheduler {
|
|
|
718
718
|
checkActivations: alepha_scheduler0.SchedulerPrimitive;
|
|
719
719
|
}
|
|
720
720
|
//#endregion
|
|
721
|
-
//#region ../../src/api
|
|
721
|
+
//#region ../../src/api/parameters/index.d.ts
|
|
722
722
|
/**
|
|
723
723
|
* Provides versioned configuration management for Alepha applications.
|
|
724
724
|
*
|
|
@@ -735,7 +735,7 @@ declare class ConfigActivationScheduler {
|
|
|
735
735
|
* @example
|
|
736
736
|
* ```ts
|
|
737
737
|
* import { Alepha } from "alepha";
|
|
738
|
-
* import { AlephaApiParameters } from "alepha/api
|
|
738
|
+
* import { AlephaApiParameters } from "alepha/api/parameters";
|
|
739
739
|
*
|
|
740
740
|
* const alepha = Alepha.create();
|
|
741
741
|
* alepha.with(AlephaApiParameters);
|
|
@@ -6,7 +6,7 @@ import { $entity, $repository, pg } from "alepha/orm";
|
|
|
6
6
|
import { $topic } from "alepha/topic";
|
|
7
7
|
import { $scheduler } from "alepha/scheduler";
|
|
8
8
|
|
|
9
|
-
//#region ../../src/api
|
|
9
|
+
//#region ../../src/api/parameters/entities/parameters.ts
|
|
10
10
|
/**
|
|
11
11
|
* Configuration parameter entity for versioned configuration management.
|
|
12
12
|
*
|
|
@@ -54,7 +54,7 @@ const parameters = $entity({
|
|
|
54
54
|
});
|
|
55
55
|
|
|
56
56
|
//#endregion
|
|
57
|
-
//#region ../../src/api
|
|
57
|
+
//#region ../../src/api/parameters/services/ConfigStore.ts
|
|
58
58
|
/**
|
|
59
59
|
* ConfigStore manages versioned configuration persistence and synchronization.
|
|
60
60
|
*
|
|
@@ -372,7 +372,7 @@ var ConfigStore = class {
|
|
|
372
372
|
};
|
|
373
373
|
|
|
374
374
|
//#endregion
|
|
375
|
-
//#region ../../src/api
|
|
375
|
+
//#region ../../src/api/parameters/controllers/ConfigController.ts
|
|
376
376
|
const parameterResponseSchema = t.object({
|
|
377
377
|
id: t.uuid(),
|
|
378
378
|
createdAt: t.datetime(),
|
|
@@ -623,7 +623,7 @@ var ConfigController = class {
|
|
|
623
623
|
};
|
|
624
624
|
|
|
625
625
|
//#endregion
|
|
626
|
-
//#region ../../src/api
|
|
626
|
+
//#region ../../src/api/parameters/schedulers/ConfigActivationScheduler.ts
|
|
627
627
|
/**
|
|
628
628
|
* Scheduler that periodically checks for scheduled configurations
|
|
629
629
|
* that should be activated.
|
|
@@ -650,7 +650,7 @@ var ConfigActivationScheduler = class {
|
|
|
650
650
|
};
|
|
651
651
|
|
|
652
652
|
//#endregion
|
|
653
|
-
//#region ../../src/api
|
|
653
|
+
//#region ../../src/api/parameters/primitives/$config.ts
|
|
654
654
|
var ConfigPrimitive = class extends Primitive {
|
|
655
655
|
log = $logger();
|
|
656
656
|
store = $inject(ConfigStore);
|
|
@@ -826,7 +826,7 @@ const $config = (options) => {
|
|
|
826
826
|
$config[KIND] = ConfigPrimitive;
|
|
827
827
|
|
|
828
828
|
//#endregion
|
|
829
|
-
//#region ../../src/api
|
|
829
|
+
//#region ../../src/api/parameters/index.ts
|
|
830
830
|
/**
|
|
831
831
|
* Provides versioned configuration management for Alepha applications.
|
|
832
832
|
*
|
|
@@ -843,7 +843,7 @@ $config[KIND] = ConfigPrimitive;
|
|
|
843
843
|
* @example
|
|
844
844
|
* ```ts
|
|
845
845
|
* import { Alepha } from "alepha";
|
|
846
|
-
* import { AlephaApiParameters } from "alepha/api
|
|
846
|
+
* import { AlephaApiParameters } from "alepha/api/parameters";
|
|
847
847
|
*
|
|
848
848
|
* const alepha = Alepha.create();
|
|
849
849
|
* alepha.with(AlephaApiParameters);
|