alepha 0.14.2 → 0.14.3
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/dist/api/audits/index.browser.js +5 -5
- package/dist/api/audits/index.browser.js.map +1 -1
- package/dist/api/audits/index.d.ts +784 -784
- package/dist/api/audits/index.d.ts.map +1 -1
- package/dist/api/audits/index.js +13 -13
- package/dist/api/audits/index.js.map +1 -1
- package/dist/api/files/index.browser.js +5 -5
- package/dist/api/files/index.browser.js.map +1 -1
- package/dist/api/files/index.d.ts +57 -57
- package/dist/api/files/index.d.ts.map +1 -1
- package/dist/api/files/index.js +71 -71
- package/dist/api/files/index.js.map +1 -1
- package/dist/api/jobs/index.browser.js +5 -5
- package/dist/api/jobs/index.browser.js.map +1 -1
- package/dist/api/jobs/index.d.ts +165 -165
- package/dist/api/jobs/index.d.ts.map +1 -1
- package/dist/api/jobs/index.js +10 -10
- package/dist/api/jobs/index.js.map +1 -1
- package/dist/api/notifications/index.browser.js +10 -10
- package/dist/api/notifications/index.browser.js.map +1 -1
- package/dist/api/notifications/index.d.ts +583 -171
- package/dist/api/notifications/index.d.ts.map +1 -1
- package/dist/api/notifications/index.js +12 -12
- package/dist/api/notifications/index.js.map +1 -1
- package/dist/api/parameters/index.browser.js +163 -10
- package/dist/api/parameters/index.browser.js.map +1 -1
- package/dist/api/parameters/index.d.ts +281 -276
- package/dist/api/parameters/index.d.ts.map +1 -1
- package/dist/api/parameters/index.js +196 -91
- package/dist/api/parameters/index.js.map +1 -1
- package/dist/api/users/index.browser.js +19 -19
- package/dist/api/users/index.browser.js.map +1 -1
- package/dist/api/users/index.d.ts +1137 -1123
- package/dist/api/users/index.d.ts.map +1 -1
- package/dist/api/users/index.js +827 -596
- package/dist/api/users/index.js.map +1 -1
- package/dist/api/verifications/index.browser.js +6 -6
- package/dist/api/verifications/index.browser.js.map +1 -1
- package/dist/api/verifications/index.d.ts +13 -13
- package/dist/api/verifications/index.d.ts.map +1 -1
- package/dist/api/verifications/index.js +6 -6
- package/dist/api/verifications/index.js.map +1 -1
- package/dist/bin/index.d.ts +1 -2
- package/dist/bin/index.js +0 -1
- package/dist/bin/index.js.map +1 -1
- package/dist/cli/index.d.ts +137 -112
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +371 -259
- package/dist/cli/index.js.map +1 -1
- package/dist/command/index.d.ts +45 -5
- package/dist/command/index.d.ts.map +1 -1
- package/dist/command/index.js +97 -17
- package/dist/command/index.js.map +1 -1
- package/dist/core/index.browser.js +14 -18
- package/dist/core/index.browser.js.map +1 -1
- package/dist/core/index.d.ts +29 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +14 -18
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.native.js +14 -18
- package/dist/core/index.native.js.map +1 -1
- package/dist/fake/index.js +195 -168
- package/dist/fake/index.js.map +1 -1
- package/dist/file/index.d.ts +8 -0
- package/dist/file/index.d.ts.map +1 -1
- package/dist/file/index.js +3 -0
- package/dist/file/index.js.map +1 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/orm/index.d.ts +32 -32
- package/dist/orm/index.d.ts.map +1 -1
- package/dist/orm/index.js +12 -12
- package/dist/orm/index.js.map +1 -1
- package/dist/security/index.d.ts +1 -1
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js +1 -1
- package/dist/security/index.js.map +1 -1
- package/dist/server/auth/index.d.ts +171 -155
- package/dist/server/auth/index.d.ts.map +1 -1
- package/dist/server/auth/index.js +0 -1
- package/dist/server/auth/index.js.map +1 -1
- package/dist/server/compress/index.d.ts.map +1 -1
- package/dist/server/compress/index.js +2 -0
- package/dist/server/compress/index.js.map +1 -1
- package/dist/server/core/index.d.ts.map +1 -1
- package/dist/server/core/index.js +1 -1
- package/dist/server/core/index.js.map +1 -1
- package/dist/server/links/index.browser.js +22 -6
- package/dist/server/links/index.browser.js.map +1 -1
- package/dist/server/links/index.d.ts +46 -44
- package/dist/server/links/index.d.ts.map +1 -1
- package/dist/server/links/index.js +24 -41
- package/dist/server/links/index.js.map +1 -1
- package/dist/server/security/index.d.ts +9 -9
- package/dist/server/swagger/index.d.ts +2 -1
- package/dist/server/swagger/index.d.ts.map +1 -1
- package/dist/server/swagger/index.js +8 -3
- package/dist/server/swagger/index.js.map +1 -1
- package/dist/vite/index.d.ts.map +1 -1
- package/dist/vite/index.js +12 -4
- package/dist/vite/index.js.map +1 -1
- package/dist/websocket/index.d.ts +7 -7
- package/package.json +7 -7
- package/src/api/audits/controllers/{AuditController.ts → AdminAuditController.ts} +5 -6
- package/src/api/audits/entities/audits.ts +5 -5
- package/src/api/audits/index.browser.ts +1 -1
- package/src/api/audits/index.ts +3 -3
- package/src/api/audits/primitives/$audit.spec.ts +276 -0
- package/src/api/audits/services/AuditService.spec.ts +495 -0
- package/src/api/files/__tests__/$bucket.spec.ts +91 -0
- package/src/api/files/controllers/AdminFileStatsController.spec.ts +166 -0
- package/src/api/files/controllers/{StorageStatsController.ts → AdminFileStatsController.ts} +2 -2
- package/src/api/files/controllers/FileController.spec.ts +558 -0
- package/src/api/files/controllers/FileController.ts +4 -5
- package/src/api/files/entities/files.ts +5 -5
- package/src/api/files/index.browser.ts +1 -1
- package/src/api/files/index.ts +4 -4
- package/src/api/files/jobs/FileJobs.spec.ts +52 -0
- package/src/api/files/services/FileService.spec.ts +109 -0
- package/src/api/jobs/__tests__/JobController.spec.ts +343 -0
- package/src/api/jobs/controllers/{JobController.ts → AdminJobController.ts} +2 -2
- package/src/api/jobs/entities/jobExecutions.ts +5 -5
- package/src/api/jobs/index.ts +3 -3
- package/src/api/jobs/primitives/$job.spec.ts +476 -0
- package/src/api/notifications/controllers/{NotificationController.ts → AdminNotificationController.ts} +4 -5
- package/src/api/notifications/entities/notifications.ts +5 -5
- package/src/api/notifications/index.browser.ts +1 -1
- package/src/api/notifications/index.ts +4 -4
- package/src/api/parameters/controllers/{ConfigController.ts → AdminConfigController.ts} +46 -107
- package/src/api/parameters/entities/parameters.ts +7 -17
- package/src/api/parameters/index.ts +3 -3
- package/src/api/parameters/primitives/$config.spec.ts +356 -0
- package/src/api/parameters/schemas/activateConfigBodySchema.ts +12 -0
- package/src/api/parameters/schemas/checkScheduledResponseSchema.ts +8 -0
- package/src/api/parameters/schemas/configCurrentResponseSchema.ts +13 -0
- package/src/api/parameters/schemas/configHistoryResponseSchema.ts +9 -0
- package/src/api/parameters/schemas/configNameParamSchema.ts +10 -0
- package/src/api/parameters/schemas/configNamesResponseSchema.ts +8 -0
- package/src/api/parameters/schemas/configTreeNodeSchema.ts +13 -0
- package/src/api/parameters/schemas/configVersionParamSchema.ts +9 -0
- package/src/api/parameters/schemas/configVersionResponseSchema.ts +9 -0
- package/src/api/parameters/schemas/configsByStatusResponseSchema.ts +9 -0
- package/src/api/parameters/schemas/createConfigVersionBodySchema.ts +24 -0
- package/src/api/parameters/schemas/index.ts +15 -0
- package/src/api/parameters/schemas/parameterResponseSchema.ts +26 -0
- package/src/api/parameters/schemas/parameterStatusSchema.ts +13 -0
- package/src/api/parameters/schemas/rollbackConfigBodySchema.ts +15 -0
- package/src/api/parameters/schemas/statusParamSchema.ts +9 -0
- package/src/api/users/__tests__/EmailVerification.spec.ts +369 -0
- package/src/api/users/__tests__/PasswordReset.spec.ts +550 -0
- package/src/api/users/controllers/AdminIdentityController.spec.ts +365 -0
- package/src/api/users/controllers/{IdentityController.ts → AdminIdentityController.ts} +3 -4
- package/src/api/users/controllers/AdminSessionController.spec.ts +274 -0
- package/src/api/users/controllers/{SessionController.ts → AdminSessionController.ts} +3 -4
- package/src/api/users/controllers/AdminUserController.spec.ts +372 -0
- package/src/api/users/controllers/AdminUserController.ts +116 -0
- package/src/api/users/controllers/UserController.ts +4 -107
- package/src/api/users/controllers/UserRealmController.ts +3 -0
- package/src/api/users/entities/identities.ts +6 -6
- package/src/api/users/entities/sessions.ts +6 -6
- package/src/api/users/entities/users.ts +9 -9
- package/src/api/users/index.ts +9 -6
- package/src/api/users/primitives/$userRealm.ts +13 -8
- package/src/api/users/services/CredentialService.spec.ts +509 -0
- package/src/api/users/services/CredentialService.ts +46 -0
- package/src/api/users/services/IdentityService.ts +15 -0
- package/src/api/users/services/RegistrationService.spec.ts +630 -0
- package/src/api/users/services/RegistrationService.ts +18 -0
- package/src/api/users/services/SessionService.spec.ts +301 -0
- package/src/api/users/services/SessionService.ts +110 -1
- package/src/api/users/services/UserService.ts +67 -2
- package/src/api/verifications/__tests__/CodeVerification.spec.ts +318 -0
- package/src/api/verifications/__tests__/LinkVerification.spec.ts +279 -0
- package/src/api/verifications/entities/verifications.ts +6 -6
- package/src/api/verifications/jobs/VerificationJobs.spec.ts +50 -0
- package/src/batch/__tests__/startup-buffering.spec.ts +458 -0
- package/src/batch/primitives/$batch.spec.ts +766 -0
- package/src/batch/providers/BatchProvider.spec.ts +786 -0
- package/src/bin/index.ts +0 -1
- package/src/bucket/__tests__/shared.ts +194 -0
- package/src/bucket/primitives/$bucket.spec.ts +104 -0
- package/src/bucket/providers/FileStorageProvider.spec.ts +13 -0
- package/src/bucket/providers/LocalFileStorageProvider.spec.ts +77 -0
- package/src/bucket/providers/MemoryFileStorageProvider.spec.ts +82 -0
- package/src/cache/core/__tests__/shared.ts +377 -0
- package/src/cache/core/primitives/$cache.spec.ts +111 -0
- package/src/cache/redis/__tests__/cache-redis.spec.ts +70 -0
- package/src/cli/apps/AlephaCli.ts +25 -4
- package/src/cli/commands/dev.ts +19 -7
- package/src/cli/commands/gen/changelog.spec.ts +315 -0
- package/src/cli/commands/{changelog.ts → gen/changelog.ts} +9 -9
- package/src/cli/commands/gen/openapi.ts +71 -0
- package/src/cli/commands/gen.ts +18 -0
- package/src/cli/commands/init.ts +2 -0
- package/src/cli/commands/root.ts +12 -3
- package/src/cli/commands/typecheck.ts +5 -0
- package/src/cli/index.ts +2 -1
- package/src/cli/services/AlephaCliUtils.ts +71 -32
- package/src/cli/services/GitMessageParser.ts +1 -1
- package/src/command/helpers/Asker.spec.ts +127 -0
- package/src/command/helpers/Runner.spec.ts +126 -0
- package/src/command/primitives/$command.spec.ts +1588 -0
- package/src/command/providers/CliProvider.ts +74 -24
- package/src/core/Alepha.ts +45 -0
- package/src/core/__tests__/Alepha-emit.spec.ts +22 -0
- package/src/core/__tests__/Alepha-graph.spec.ts +93 -0
- package/src/core/__tests__/Alepha-has.spec.ts +41 -0
- package/src/core/__tests__/Alepha-inject.spec.ts +93 -0
- package/src/core/__tests__/Alepha-register.spec.ts +81 -0
- package/src/core/__tests__/Alepha-start.spec.ts +176 -0
- package/src/core/__tests__/Alepha-with.spec.ts +14 -0
- package/src/core/__tests__/TypeBox-usecases.spec.ts +35 -0
- package/src/core/__tests__/TypeBoxLocale.spec.ts +15 -0
- package/src/core/__tests__/descriptor.spec.ts +34 -0
- package/src/core/__tests__/fixtures/A.ts +5 -0
- package/src/core/__tests__/pagination.spec.ts +77 -0
- package/src/core/helpers/jsonSchemaToTypeBox.ts +2 -2
- package/src/core/primitives/$atom.spec.ts +43 -0
- package/src/core/primitives/$hook.spec.ts +130 -0
- package/src/core/primitives/$inject.spec.ts +175 -0
- package/src/core/primitives/$module.spec.ts +115 -0
- package/src/core/providers/CodecManager.spec.ts +740 -0
- package/src/core/providers/EventManager.spec.ts +762 -0
- package/src/core/providers/EventManager.ts +4 -0
- package/src/core/providers/StateManager.spec.ts +365 -0
- package/src/core/providers/TypeProvider.spec.ts +1607 -0
- package/src/core/providers/TypeProvider.ts +20 -26
- package/src/datetime/primitives/$interval.spec.ts +103 -0
- package/src/datetime/providers/DateTimeProvider.spec.ts +86 -0
- package/src/email/primitives/$email.spec.ts +175 -0
- package/src/email/providers/LocalEmailProvider.spec.ts +341 -0
- package/src/fake/__tests__/keyName.example.ts +40 -0
- package/src/fake/__tests__/keyName.spec.ts +152 -0
- package/src/fake/__tests__/module.example.ts +32 -0
- package/src/fake/providers/FakeProvider.spec.ts +438 -0
- package/src/file/providers/FileSystemProvider.ts +8 -0
- package/src/file/providers/NodeFileSystemProvider.spec.ts +418 -0
- package/src/file/providers/NodeFileSystemProvider.ts +5 -0
- package/src/file/services/FileDetector.spec.ts +591 -0
- package/src/lock/core/__tests__/shared.ts +190 -0
- package/src/lock/core/providers/MemoryLockProvider.spec.ts +25 -0
- package/src/lock/redis/providers/RedisLockProvider.spec.ts +25 -0
- package/src/logger/__tests__/SimpleFormatterProvider.spec.ts +109 -0
- package/src/logger/primitives/$logger.spec.ts +108 -0
- package/src/logger/services/Logger.spec.ts +295 -0
- package/src/mcp/__tests__/errors.spec.ts +175 -0
- package/src/mcp/__tests__/integration.spec.ts +450 -0
- package/src/mcp/helpers/jsonrpc.spec.ts +380 -0
- package/src/mcp/primitives/$prompt.spec.ts +468 -0
- package/src/mcp/primitives/$resource.spec.ts +390 -0
- package/src/mcp/primitives/$tool.spec.ts +406 -0
- package/src/mcp/providers/McpServerProvider.spec.ts +797 -0
- package/src/orm/__tests__/$repository-crud.spec.ts +276 -0
- package/src/orm/__tests__/$repository-hooks.spec.ts +325 -0
- package/src/orm/__tests__/$repository-orderBy.spec.ts +128 -0
- package/src/orm/__tests__/$repository-pagination-sort.spec.ts +149 -0
- package/src/orm/__tests__/$repository-save.spec.ts +37 -0
- package/src/orm/__tests__/ModelBuilder-integration.spec.ts +490 -0
- package/src/orm/__tests__/ModelBuilder-types.spec.ts +186 -0
- package/src/orm/__tests__/PostgresProvider.spec.ts +46 -0
- package/src/orm/__tests__/delete-returning.spec.ts +256 -0
- package/src/orm/__tests__/deletedAt.spec.ts +80 -0
- package/src/orm/__tests__/enums.spec.ts +315 -0
- package/src/orm/__tests__/execute.spec.ts +72 -0
- package/src/orm/__tests__/fixtures/bigEntitySchema.ts +65 -0
- package/src/orm/__tests__/fixtures/userEntitySchema.ts +27 -0
- package/src/orm/__tests__/joins.spec.ts +1114 -0
- package/src/orm/__tests__/page.spec.ts +287 -0
- package/src/orm/__tests__/primaryKey.spec.ts +87 -0
- package/src/orm/__tests__/query-date-encoding.spec.ts +402 -0
- package/src/orm/__tests__/ref-auto-onDelete.spec.ts +156 -0
- package/src/orm/__tests__/references.spec.ts +102 -0
- package/src/orm/__tests__/security.spec.ts +710 -0
- package/src/orm/__tests__/sqlite.spec.ts +111 -0
- package/src/orm/__tests__/string-operators.spec.ts +429 -0
- package/src/orm/__tests__/timestamps.spec.ts +388 -0
- package/src/orm/__tests__/validation.spec.ts +183 -0
- package/src/orm/__tests__/version.spec.ts +64 -0
- package/src/orm/helpers/parseQueryString.spec.ts +196 -0
- package/src/orm/primitives/$repository.spec.ts +137 -0
- package/src/orm/primitives/$sequence.spec.ts +29 -0
- package/src/orm/primitives/$transaction.spec.ts +82 -0
- package/src/orm/providers/drivers/BunPostgresProvider.ts +3 -3
- package/src/orm/providers/drivers/BunSqliteProvider.ts +1 -1
- package/src/orm/providers/drivers/CloudflareD1Provider.ts +1 -1
- package/src/orm/providers/drivers/DatabaseProvider.ts +1 -1
- package/src/orm/providers/drivers/NodePostgresProvider.ts +3 -3
- package/src/orm/providers/drivers/NodeSqliteProvider.ts +1 -1
- package/src/orm/providers/drivers/PglitePostgresProvider.ts +2 -2
- package/src/orm/services/ModelBuilder.spec.ts +575 -0
- package/src/orm/services/Repository.spec.ts +137 -0
- package/src/queue/core/__tests__/shared.ts +143 -0
- package/src/queue/core/providers/MemoryQueueProvider.spec.ts +23 -0
- package/src/queue/core/providers/WorkerProvider.spec.ts +378 -0
- package/src/queue/redis/providers/RedisQueueProvider.spec.ts +23 -0
- package/src/redis/__tests__/redis.spec.ts +58 -0
- package/src/retry/primitives/$retry.spec.ts +234 -0
- package/src/retry/providers/RetryProvider.spec.ts +438 -0
- package/src/router/__tests__/match.spec.ts +252 -0
- package/src/router/providers/RouterProvider.spec.ts +197 -0
- package/src/scheduler/__tests__/$scheduler-cron.spec.ts +25 -0
- package/src/scheduler/__tests__/$scheduler-interval.spec.ts +25 -0
- package/src/scheduler/__tests__/shared.ts +77 -0
- package/src/security/__tests__/bug-1-wildcard-after-start.spec.ts +229 -0
- package/src/security/__tests__/bug-2-password-validation.spec.ts +245 -0
- package/src/security/__tests__/bug-3-regex-vulnerability.spec.ts +407 -0
- package/src/security/__tests__/bug-4-oauth2-validation.spec.ts +439 -0
- package/src/security/__tests__/multi-layer-permissions.spec.ts +522 -0
- package/src/security/primitives/$permission.spec.ts +30 -0
- package/src/security/primitives/$permission.ts +2 -2
- package/src/security/primitives/$realm.spec.ts +101 -0
- package/src/security/primitives/$role.spec.ts +52 -0
- package/src/security/primitives/$serviceAccount.spec.ts +61 -0
- package/src/security/providers/SecurityProvider.spec.ts +350 -0
- package/src/server/auth/providers/ServerAuthProvider.ts +0 -2
- package/src/server/cache/providers/ServerCacheProvider.spec.ts +942 -0
- package/src/server/compress/providers/ServerCompressProvider.spec.ts +31 -0
- package/src/server/compress/providers/ServerCompressProvider.ts +2 -0
- package/src/server/cookies/providers/ServerCookiesProvider.spec.ts +253 -0
- package/src/server/core/__tests__/ServerRouterProvider-getRoutes.spec.ts +334 -0
- package/src/server/core/__tests__/ServerRouterProvider-requestId.spec.ts +129 -0
- package/src/server/core/primitives/$action.spec.ts +191 -0
- package/src/server/core/primitives/$route.spec.ts +65 -0
- package/src/server/core/providers/ServerBodyParserProvider.spec.ts +93 -0
- package/src/server/core/providers/ServerLoggerProvider.spec.ts +100 -0
- package/src/server/core/providers/ServerProvider.ts +3 -1
- package/src/server/core/services/HttpClient.spec.ts +123 -0
- package/src/server/core/services/UserAgentParser.spec.ts +111 -0
- package/src/server/cors/providers/ServerCorsProvider.spec.ts +481 -0
- package/src/server/health/providers/ServerHealthProvider.spec.ts +22 -0
- package/src/server/helmet/providers/ServerHelmetProvider.spec.ts +105 -0
- package/src/server/links/__tests__/$action.spec.ts +238 -0
- package/src/server/links/__tests__/fixtures/CrudApp.ts +122 -0
- package/src/server/links/__tests__/requestId.spec.ts +120 -0
- package/src/server/links/primitives/$remote.spec.ts +228 -0
- package/src/server/links/providers/LinkProvider.spec.ts +54 -0
- package/src/server/links/providers/LinkProvider.ts +49 -3
- package/src/server/links/providers/ServerLinksProvider.ts +1 -53
- package/src/server/links/schemas/apiLinksResponseSchema.ts +7 -0
- package/src/server/metrics/providers/ServerMetricsProvider.spec.ts +25 -0
- package/src/server/multipart/providers/ServerMultipartProvider.spec.ts +528 -0
- package/src/server/proxy/primitives/$proxy.spec.ts +87 -0
- package/src/server/rate-limit/__tests__/ActionRateLimit.spec.ts +211 -0
- package/src/server/rate-limit/providers/ServerRateLimitProvider.spec.ts +344 -0
- package/src/server/security/__tests__/BasicAuth.spec.ts +684 -0
- package/src/server/security/__tests__/ServerSecurityProvider-realm.spec.ts +388 -0
- package/src/server/security/providers/ServerSecurityProvider.spec.ts +123 -0
- package/src/server/static/primitives/$serve.spec.ts +193 -0
- package/src/server/swagger/__tests__/ui.spec.ts +52 -0
- package/src/server/swagger/primitives/$swagger.spec.ts +193 -0
- package/src/server/swagger/providers/ServerSwaggerProvider.ts +18 -8
- package/src/sms/primitives/$sms.spec.ts +165 -0
- package/src/sms/providers/LocalSmsProvider.spec.ts +224 -0
- package/src/sms/providers/MemorySmsProvider.spec.ts +193 -0
- package/src/thread/primitives/$thread.spec.ts +186 -0
- package/src/topic/core/__tests__/shared.ts +144 -0
- package/src/topic/core/providers/MemoryTopicProvider.spec.ts +23 -0
- package/src/topic/redis/providers/RedisTopicProvider.spec.ts +23 -0
- package/src/vite/plugins/viteAlephaDev.ts +16 -4
- package/src/vite/tasks/runAlepha.ts +7 -1
- package/src/websocket/__tests__/$websocket-new.spec.ts +195 -0
- package/src/websocket/primitives/$channel.spec.ts +30 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { Alepha } from "alepha";
|
|
2
|
+
import { DateTimeProvider } from "alepha/datetime";
|
|
3
|
+
import { FileSystemProvider } from "alepha/file";
|
|
4
|
+
import { describe, expect, it } from "vitest";
|
|
5
|
+
import { FileJobs, FileService } from "../index.ts";
|
|
6
|
+
|
|
7
|
+
describe("FileJobRegistry", () => {
|
|
8
|
+
const alepha = Alepha.create();
|
|
9
|
+
const jobs = alepha.inject(FileJobs);
|
|
10
|
+
const service = alepha.inject(FileService);
|
|
11
|
+
const dtp = alepha.inject(DateTimeProvider);
|
|
12
|
+
const fs = alepha.inject(FileSystemProvider);
|
|
13
|
+
|
|
14
|
+
const createFile = (
|
|
15
|
+
textOrOpts: string | { text: string; name?: string; type?: string },
|
|
16
|
+
opts?: { name?: string; type?: string },
|
|
17
|
+
) => {
|
|
18
|
+
if (typeof textOrOpts === "string") {
|
|
19
|
+
return fs.createFile({ text: textOrOpts, ...(opts || {}) });
|
|
20
|
+
}
|
|
21
|
+
return fs.createFile(textOrOpts);
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
it("should remove expired files", { retry: 2 }, async () => {
|
|
25
|
+
const file = createFile("");
|
|
26
|
+
|
|
27
|
+
await Promise.all([
|
|
28
|
+
service.uploadFile(file),
|
|
29
|
+
service.uploadFile(file, {
|
|
30
|
+
expirationDate: new Date().toISOString(),
|
|
31
|
+
}),
|
|
32
|
+
service.uploadFile(file, {
|
|
33
|
+
expirationDate: dtp.now().add(1, "hour").toISOString(),
|
|
34
|
+
}),
|
|
35
|
+
service.uploadFile(file, {
|
|
36
|
+
expirationDate: dtp.now().add(4, "hours").toISOString(),
|
|
37
|
+
}),
|
|
38
|
+
]);
|
|
39
|
+
|
|
40
|
+
const list = () => service.findFiles().then((it) => it.content);
|
|
41
|
+
|
|
42
|
+
expect(await list()).toHaveLength(4);
|
|
43
|
+
|
|
44
|
+
await jobs.purgeFiles.trigger();
|
|
45
|
+
|
|
46
|
+
expect(await list()).toHaveLength(3);
|
|
47
|
+
|
|
48
|
+
await dtp.travel(2, "hours");
|
|
49
|
+
|
|
50
|
+
expect(await list()).toHaveLength(2); // TODO: fail sometimes here
|
|
51
|
+
});
|
|
52
|
+
});
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { Alepha, type Service } from "alepha";
|
|
3
|
+
import {
|
|
4
|
+
$bucket,
|
|
5
|
+
FileStorageProvider,
|
|
6
|
+
LocalFileStorageProvider,
|
|
7
|
+
MemoryFileStorageProvider,
|
|
8
|
+
} from "alepha/bucket";
|
|
9
|
+
import { FileSystemProvider } from "alepha/file";
|
|
10
|
+
import { describe, expect, it } from "vitest";
|
|
11
|
+
import { AlephaApiFiles, FileController } from "../index.ts";
|
|
12
|
+
|
|
13
|
+
const testFileServiceOperations = async (
|
|
14
|
+
provider: Service<FileStorageProvider>,
|
|
15
|
+
) => {
|
|
16
|
+
const alepha = Alepha.create()
|
|
17
|
+
.with({
|
|
18
|
+
provide: FileStorageProvider,
|
|
19
|
+
use: provider,
|
|
20
|
+
})
|
|
21
|
+
.with(AlephaApiFiles);
|
|
22
|
+
|
|
23
|
+
class Assets {
|
|
24
|
+
images = $bucket({
|
|
25
|
+
name: randomUUID(),
|
|
26
|
+
ttl: 1000,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const assets = alepha.inject(Assets);
|
|
31
|
+
const ctrl = alepha.inject(FileController);
|
|
32
|
+
const fs = alepha.inject(FileSystemProvider);
|
|
33
|
+
|
|
34
|
+
await alepha.start();
|
|
35
|
+
|
|
36
|
+
const createFile = (
|
|
37
|
+
textOrOpts: string | { text: string; name?: string; type?: string },
|
|
38
|
+
opts?: { name?: string; type?: string },
|
|
39
|
+
) => {
|
|
40
|
+
if (typeof textOrOpts === "string") {
|
|
41
|
+
return fs.createFile({ text: textOrOpts, ...(opts || {}) });
|
|
42
|
+
}
|
|
43
|
+
return fs.createFile(textOrOpts);
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
await assets.images.upload(
|
|
47
|
+
createFile("Hello World 1", {
|
|
48
|
+
type: "text/plain",
|
|
49
|
+
name: "hello.txt",
|
|
50
|
+
}),
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
const files = await ctrl.findFiles.run({});
|
|
54
|
+
|
|
55
|
+
expect(files.content[0].bucket).toBe(assets.images.name);
|
|
56
|
+
|
|
57
|
+
await ctrl.uploadFile.run({
|
|
58
|
+
query: {
|
|
59
|
+
bucket: assets.images.name,
|
|
60
|
+
},
|
|
61
|
+
body: {
|
|
62
|
+
file: createFile("Hello World 2"),
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
await ctrl.uploadFile.fetch({
|
|
67
|
+
query: {
|
|
68
|
+
bucket: assets.images.name,
|
|
69
|
+
},
|
|
70
|
+
body: {
|
|
71
|
+
file: createFile("Hello World 3"),
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
await ctrl.uploadFile.fetch({
|
|
76
|
+
query: {
|
|
77
|
+
bucket: assets.images.name,
|
|
78
|
+
},
|
|
79
|
+
body: {
|
|
80
|
+
file: createFile("Hello World 4"),
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
const files2 = await ctrl.findFiles.run({});
|
|
85
|
+
|
|
86
|
+
expect(files2.content.length).toBe(4);
|
|
87
|
+
|
|
88
|
+
const response = await ctrl.streamFile.run({
|
|
89
|
+
params: { id: files2.content[1].id },
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
expect(await response.text()).toBe("Hello World 3");
|
|
93
|
+
|
|
94
|
+
const response2 = await ctrl.streamFile.fetch({
|
|
95
|
+
params: { id: files2.content[0].id },
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
expect(await response2.data.text()).toBe("Hello World 4");
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
describe("FileService", () => {
|
|
102
|
+
it("should handle basic file operations with memory storage", async () => {
|
|
103
|
+
await testFileServiceOperations(MemoryFileStorageProvider);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it("should handle basic file operations with local storage", async () => {
|
|
107
|
+
await testFileServiceOperations(LocalFileStorageProvider);
|
|
108
|
+
});
|
|
109
|
+
});
|
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
import { Alepha } from "alepha";
|
|
2
|
+
import { DateTimeProvider, dayjs } from "alepha/datetime";
|
|
3
|
+
import { $logger } from "alepha/logger";
|
|
4
|
+
import { describe, expect, it } from "vitest";
|
|
5
|
+
import { $job, AdminJobController, JobService } from "../index.ts";
|
|
6
|
+
|
|
7
|
+
describe("JobController", () => {
|
|
8
|
+
class App {
|
|
9
|
+
testJob = $job({
|
|
10
|
+
name: "test-job",
|
|
11
|
+
handler: async () => {
|
|
12
|
+
// Test job that is manually triggered
|
|
13
|
+
},
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
dailyJob = $job({
|
|
17
|
+
name: "daily-job",
|
|
18
|
+
handler: async () => {
|
|
19
|
+
// Another test job
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const setup = async () => {
|
|
25
|
+
const alepha = Alepha.create();
|
|
26
|
+
const app = alepha.inject(App);
|
|
27
|
+
const ctrl = alepha.inject(AdminJobController);
|
|
28
|
+
const service = alepha.inject(JobService);
|
|
29
|
+
const dtp = alepha.inject(DateTimeProvider);
|
|
30
|
+
await alepha.start();
|
|
31
|
+
return { alepha, app, ctrl, service, dtp };
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
describe("getJobs", () => {
|
|
35
|
+
it("should return all job names", async () => {
|
|
36
|
+
const { ctrl } = await setup();
|
|
37
|
+
const jobs = await ctrl.getJobs();
|
|
38
|
+
expect(jobs).toContain("test-job");
|
|
39
|
+
expect(jobs).toContain("daily-job");
|
|
40
|
+
expect(jobs.length).toBeGreaterThanOrEqual(2);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it("should return empty array when no jobs exist", async () => {
|
|
44
|
+
const alepha = Alepha.create();
|
|
45
|
+
const ctrl = alepha.inject(AdminJobController);
|
|
46
|
+
await alepha.start();
|
|
47
|
+
const jobs = await ctrl.getJobs();
|
|
48
|
+
expect(jobs).toEqual([]);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
describe("getJobExecutions", () => {
|
|
53
|
+
it("should return job executions for a specific job", async () => {
|
|
54
|
+
const { app, ctrl } = await setup();
|
|
55
|
+
|
|
56
|
+
// Trigger a job to create execution records
|
|
57
|
+
await app.testJob.trigger();
|
|
58
|
+
|
|
59
|
+
const executions = await ctrl.getJobExecutions({
|
|
60
|
+
query: { job: "test-job" },
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
expect(executions.content.length).toBeGreaterThan(0);
|
|
64
|
+
expect(executions.content[0].job).toBe("test-job");
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it("should populate finishedAt when job completes", async () => {
|
|
68
|
+
const { app, ctrl } = await setup();
|
|
69
|
+
|
|
70
|
+
await app.testJob.trigger();
|
|
71
|
+
|
|
72
|
+
const executions = await ctrl.getJobExecutions({
|
|
73
|
+
query: { job: "test-job", status: "COMPLETED" },
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
expect(executions.content.length).toBeGreaterThan(0);
|
|
77
|
+
const execution = executions.content[0];
|
|
78
|
+
expect(execution.status).toBe("COMPLETED");
|
|
79
|
+
expect(execution.finishedAt).toBeDefined();
|
|
80
|
+
expect(new Date(execution.finishedAt!).valueOf()).toBeGreaterThan(0);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it("should capture logs during job execution", async () => {
|
|
84
|
+
class TestAppWithLogs {
|
|
85
|
+
log = $logger();
|
|
86
|
+
|
|
87
|
+
loggingJob = $job({
|
|
88
|
+
name: "logging-job",
|
|
89
|
+
handler: async () => {
|
|
90
|
+
this.log.info("Starting job execution");
|
|
91
|
+
this.log.info("Processing data");
|
|
92
|
+
this.log.info("Job completed successfully");
|
|
93
|
+
},
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const alepha = Alepha.create();
|
|
98
|
+
const testApp = alepha.inject(TestAppWithLogs);
|
|
99
|
+
const ctrl = alepha.inject(AdminJobController);
|
|
100
|
+
await alepha.start();
|
|
101
|
+
|
|
102
|
+
await testApp.loggingJob.trigger();
|
|
103
|
+
|
|
104
|
+
const executions = await ctrl.getJobExecutions({
|
|
105
|
+
query: { job: "logging-job" },
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
expect(executions.content.length).toBeGreaterThan(0);
|
|
109
|
+
const execution = executions.content[0];
|
|
110
|
+
expect(execution.logs).toBeDefined();
|
|
111
|
+
expect(Array.isArray(execution.logs)).toBe(true);
|
|
112
|
+
const logInfos = execution.logs?.filter(
|
|
113
|
+
(log: any) => log.level === "INFO",
|
|
114
|
+
);
|
|
115
|
+
expect(logInfos?.length).toBeGreaterThanOrEqual(3);
|
|
116
|
+
expect(logInfos?.[0].message).toBe("Starting job execution");
|
|
117
|
+
expect(logInfos?.[1].message).toBe("Processing data");
|
|
118
|
+
expect(logInfos?.[2].message).toBe("Job completed successfully");
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it("should capture error and finishedAt when job fails", async () => {
|
|
122
|
+
// Create a separate Alepha instance with a failing job
|
|
123
|
+
class FailingApp {
|
|
124
|
+
failingJob = $job({
|
|
125
|
+
name: "failing-job",
|
|
126
|
+
handler: async () => {
|
|
127
|
+
throw new Error("Intentional test failure");
|
|
128
|
+
},
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const alepha = Alepha.create();
|
|
133
|
+
const failingApp = alepha.inject(FailingApp);
|
|
134
|
+
const ctrl = alepha.inject(AdminJobController);
|
|
135
|
+
await alepha.start();
|
|
136
|
+
|
|
137
|
+
// Trigger the job (it will fail silently)
|
|
138
|
+
await failingApp.failingJob.trigger().catch(() => {
|
|
139
|
+
// Expected to fail
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
const executions = await ctrl.getJobExecutions({
|
|
143
|
+
query: { job: "failing-job", status: "FAILED" },
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
expect(executions.content.length).toBeGreaterThan(0);
|
|
147
|
+
const execution = executions.content[0];
|
|
148
|
+
expect(execution.status).toBe("FAILED");
|
|
149
|
+
expect(execution.error).toBe("Intentional test failure");
|
|
150
|
+
expect(execution.finishedAt).toBeDefined();
|
|
151
|
+
expect(new Date(execution.finishedAt!).valueOf()).toBeGreaterThan(0);
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
it("should return empty list when job has no executions", async () => {
|
|
155
|
+
const { ctrl } = await setup();
|
|
156
|
+
|
|
157
|
+
const executions = await ctrl.getJobExecutions({
|
|
158
|
+
query: { job: "test-job" },
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
expect(executions.content).toEqual([]);
|
|
162
|
+
expect(executions.page.totalElements).toBe(0);
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
it("should filter executions by status", async () => {
|
|
166
|
+
const { app, ctrl } = await setup();
|
|
167
|
+
|
|
168
|
+
// Trigger job to create STARTED and COMPLETED execution
|
|
169
|
+
await app.testJob.trigger();
|
|
170
|
+
|
|
171
|
+
const allExecutions = await ctrl.getJobExecutions({
|
|
172
|
+
query: { job: "test-job" },
|
|
173
|
+
});
|
|
174
|
+
expect(allExecutions.content.length).toBeGreaterThan(0);
|
|
175
|
+
|
|
176
|
+
const completedExecutions = await ctrl.getJobExecutions({
|
|
177
|
+
query: { job: "test-job", status: "COMPLETED" },
|
|
178
|
+
});
|
|
179
|
+
expect(
|
|
180
|
+
completedExecutions.content.every((e) => e.status === "COMPLETED"),
|
|
181
|
+
).toBe(true);
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
it("should support pagination", async () => {
|
|
185
|
+
const { app, ctrl } = await setup();
|
|
186
|
+
|
|
187
|
+
// Trigger job multiple times
|
|
188
|
+
await app.testJob.trigger();
|
|
189
|
+
await app.testJob.trigger();
|
|
190
|
+
await app.testJob.trigger();
|
|
191
|
+
|
|
192
|
+
const page1 = await ctrl.getJobExecutions({
|
|
193
|
+
query: { job: "test-job", size: 2, page: 0 },
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
expect(page1.content.length).toBeLessThanOrEqual(2);
|
|
197
|
+
expect(page1.page.totalElements).toBeGreaterThanOrEqual(3);
|
|
198
|
+
|
|
199
|
+
if (page1.page.totalElements && page1.page.totalElements > 2) {
|
|
200
|
+
const page2 = await ctrl.getJobExecutions({
|
|
201
|
+
query: { job: "test-job", size: 2, page: 1 },
|
|
202
|
+
});
|
|
203
|
+
expect(page2.content.length).toBeGreaterThan(0);
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
it("should return executions sorted by creation date descending by default", async () => {
|
|
208
|
+
const { app, ctrl } = await setup();
|
|
209
|
+
|
|
210
|
+
// Trigger job multiple times
|
|
211
|
+
await app.testJob.trigger();
|
|
212
|
+
await app.testJob.trigger();
|
|
213
|
+
|
|
214
|
+
const executions = await ctrl.getJobExecutions({
|
|
215
|
+
query: { job: "test-job" },
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
expect(executions.content.length).toBeGreaterThanOrEqual(2);
|
|
219
|
+
|
|
220
|
+
// Verify descending order
|
|
221
|
+
for (let i = 1; i < executions.content.length; i++) {
|
|
222
|
+
const prev = dayjs(executions.content[i - 1].createdAt);
|
|
223
|
+
const curr = dayjs(executions.content[i].createdAt);
|
|
224
|
+
expect(prev.valueOf()).toBeGreaterThanOrEqual(curr.valueOf());
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
describe("triggerJob", () => {
|
|
230
|
+
it("should trigger a job by name", async () => {
|
|
231
|
+
const { ctrl } = await setup();
|
|
232
|
+
|
|
233
|
+
const result = await ctrl.triggerJob({
|
|
234
|
+
body: { name: "test-job" },
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
expect(result.ok).toBe(true);
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
it("should throw error for non-existent job", async () => {
|
|
241
|
+
const { ctrl } = await setup();
|
|
242
|
+
|
|
243
|
+
await expect(
|
|
244
|
+
ctrl.triggerJob({
|
|
245
|
+
body: { name: "non-existent-job" },
|
|
246
|
+
}),
|
|
247
|
+
).rejects.toThrow("Job not found: non-existent-job");
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
it("should create execution record when job is triggered", async () => {
|
|
251
|
+
const { ctrl } = await setup();
|
|
252
|
+
|
|
253
|
+
// Get initial execution count
|
|
254
|
+
const initialExecutions = await ctrl.getJobExecutions({
|
|
255
|
+
query: { job: "test-job" },
|
|
256
|
+
});
|
|
257
|
+
const initialCount = initialExecutions.page.totalElements ?? 0;
|
|
258
|
+
|
|
259
|
+
// Trigger job
|
|
260
|
+
await ctrl.triggerJob({
|
|
261
|
+
body: { name: "test-job" },
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
// Verify execution record was created
|
|
265
|
+
const finalExecutions = await ctrl.getJobExecutions({
|
|
266
|
+
query: { job: "test-job" },
|
|
267
|
+
});
|
|
268
|
+
expect(finalExecutions.page.totalElements ?? 0).toBe(initialCount + 1);
|
|
269
|
+
});
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
describe("integration scenarios", () => {
|
|
273
|
+
it("should handle complete job lifecycle", async () => {
|
|
274
|
+
const { ctrl } = await setup();
|
|
275
|
+
|
|
276
|
+
// Get all jobs
|
|
277
|
+
const jobs = await ctrl.getJobs();
|
|
278
|
+
expect(jobs).toContain("test-job");
|
|
279
|
+
|
|
280
|
+
// Trigger job
|
|
281
|
+
const triggerResult = await ctrl.triggerJob({
|
|
282
|
+
body: { name: "test-job" },
|
|
283
|
+
});
|
|
284
|
+
expect(triggerResult.ok).toBe(true);
|
|
285
|
+
|
|
286
|
+
// Get executions
|
|
287
|
+
const executions = await ctrl.getJobExecutions({
|
|
288
|
+
query: { job: "test-job" },
|
|
289
|
+
});
|
|
290
|
+
expect(executions.content.length).toBeGreaterThan(0);
|
|
291
|
+
const execution = executions.content[0];
|
|
292
|
+
expect(execution.job).toBe("test-job");
|
|
293
|
+
expect(execution.status).toBe("COMPLETED");
|
|
294
|
+
expect(execution.finishedAt).toBeDefined();
|
|
295
|
+
expect(execution.createdAt).toBeDefined();
|
|
296
|
+
expect(execution.updatedAt).toBeDefined();
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
it("should handle multiple jobs with different execution statuses", async () => {
|
|
300
|
+
const { app, ctrl } = await setup();
|
|
301
|
+
|
|
302
|
+
// Trigger both jobs
|
|
303
|
+
await app.testJob.trigger();
|
|
304
|
+
await app.dailyJob.trigger();
|
|
305
|
+
|
|
306
|
+
// Get all executions for test-job
|
|
307
|
+
const testJobExecutions = await ctrl.getJobExecutions({
|
|
308
|
+
query: { job: "test-job" },
|
|
309
|
+
});
|
|
310
|
+
expect(testJobExecutions.content.length).toBeGreaterThan(0);
|
|
311
|
+
expect(testJobExecutions.content.every((e) => e.job === "test-job")).toBe(
|
|
312
|
+
true,
|
|
313
|
+
);
|
|
314
|
+
|
|
315
|
+
// Get all executions for daily-job
|
|
316
|
+
const dailyJobExecutions = await ctrl.getJobExecutions({
|
|
317
|
+
query: { job: "daily-job" },
|
|
318
|
+
});
|
|
319
|
+
expect(dailyJobExecutions.content.length).toBeGreaterThan(0);
|
|
320
|
+
expect(
|
|
321
|
+
dailyJobExecutions.content.every((e) => e.job === "daily-job"),
|
|
322
|
+
).toBe(true);
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
it("should track job execution history over multiple triggers", async () => {
|
|
326
|
+
const { app, ctrl } = await setup();
|
|
327
|
+
|
|
328
|
+
// Trigger job multiple times
|
|
329
|
+
await app.testJob.trigger();
|
|
330
|
+
await app.testJob.trigger();
|
|
331
|
+
await app.testJob.trigger();
|
|
332
|
+
|
|
333
|
+
const executions = await ctrl.getJobExecutions({
|
|
334
|
+
query: { job: "test-job" },
|
|
335
|
+
});
|
|
336
|
+
|
|
337
|
+
expect(executions.page.totalElements).toBeGreaterThanOrEqual(3);
|
|
338
|
+
|
|
339
|
+
// Verify all executions are for the same job
|
|
340
|
+
expect(executions.content.every((e) => e.job === "test-job")).toBe(true);
|
|
341
|
+
});
|
|
342
|
+
});
|
|
343
|
+
});
|
|
@@ -5,9 +5,9 @@ import { jobExecutionResourceSchema } from "../schemas/jobExecutionResourceSchem
|
|
|
5
5
|
import { triggerJobSchema } from "../schemas/triggerJobSchema.ts";
|
|
6
6
|
import { JobService } from "../services/JobService.ts";
|
|
7
7
|
|
|
8
|
-
export class
|
|
8
|
+
export class AdminJobController {
|
|
9
9
|
protected readonly url: string = "/jobs";
|
|
10
|
-
protected readonly group: string = "jobs";
|
|
10
|
+
protected readonly group: string = "admin:jobs";
|
|
11
11
|
protected readonly jobService = $inject(JobService);
|
|
12
12
|
|
|
13
13
|
public readonly getJobs = $action({
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { type Static, t } from "alepha";
|
|
2
2
|
import { logEntrySchema } from "alepha/logger";
|
|
3
|
-
import { $entity,
|
|
3
|
+
import { $entity, db } from "alepha/orm";
|
|
4
4
|
|
|
5
5
|
export const jobExecutions = $entity({
|
|
6
6
|
name: "job_executions",
|
|
7
7
|
schema: t.object({
|
|
8
|
-
id:
|
|
9
|
-
version:
|
|
10
|
-
createdAt:
|
|
11
|
-
updatedAt:
|
|
8
|
+
id: db.primaryKey(t.uuid()),
|
|
9
|
+
version: db.version(),
|
|
10
|
+
createdAt: db.createdAt(),
|
|
11
|
+
updatedAt: db.updatedAt(),
|
|
12
12
|
finishedAt: t.optional(t.datetime()),
|
|
13
13
|
job: t.string(),
|
|
14
14
|
status: t.enum(["STARTED", "FAILED", "COMPLETED"]),
|
package/src/api/jobs/index.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { $module } from "alepha";
|
|
2
|
-
import {
|
|
2
|
+
import { AdminJobController } from "./controllers/AdminJobController.ts";
|
|
3
3
|
import { JobProvider } from "./providers/JobProvider.ts";
|
|
4
4
|
import { JobService } from "./services/JobService.ts";
|
|
5
5
|
|
|
6
6
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
7
7
|
|
|
8
|
-
export * from "./controllers/
|
|
8
|
+
export * from "./controllers/AdminJobController.ts";
|
|
9
9
|
export * from "./entities/jobExecutions.ts";
|
|
10
10
|
export * from "./primitives/$job.ts";
|
|
11
11
|
export * from "./providers/JobProvider.ts";
|
|
@@ -26,5 +26,5 @@ export * from "./services/JobService.ts";
|
|
|
26
26
|
*/
|
|
27
27
|
export const AlephaApiJobs = $module({
|
|
28
28
|
name: "alepha.api.jobs",
|
|
29
|
-
services: [
|
|
29
|
+
services: [AdminJobController, JobProvider, JobService],
|
|
30
30
|
});
|