@contember/engine-actions 1.3.0-alpha.4
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/src/ActionsExecutionContainerHookFactory.d.ts +8 -0
- package/dist/src/ActionsExecutionContainerHookFactory.d.ts.map +1 -0
- package/dist/src/ActionsExecutionContainerHookFactory.js +28 -0
- package/dist/src/ActionsExecutionContainerHookFactory.js.map +1 -0
- package/dist/src/ImplementationException.d.ts +3 -0
- package/dist/src/ImplementationException.d.ts.map +1 -0
- package/dist/src/ImplementationException.js +7 -0
- package/dist/src/ImplementationException.js.map +1 -0
- package/dist/src/ListenerStoreProvider.d.ts +7 -0
- package/dist/src/ListenerStoreProvider.d.ts.map +1 -0
- package/dist/src/ListenerStoreProvider.js +21 -0
- package/dist/src/ListenerStoreProvider.js.map +1 -0
- package/dist/src/dispatch/DispatchWorkerSupervisor.d.ts +17 -0
- package/dist/src/dispatch/DispatchWorkerSupervisor.d.ts.map +1 -0
- package/dist/src/dispatch/DispatchWorkerSupervisor.js +123 -0
- package/dist/src/dispatch/DispatchWorkerSupervisor.js.map +1 -0
- package/dist/src/dispatch/EventDispatcher.d.ts +25 -0
- package/dist/src/dispatch/EventDispatcher.d.ts.map +1 -0
- package/dist/src/dispatch/EventDispatcher.js +46 -0
- package/dist/src/dispatch/EventDispatcher.js.map +1 -0
- package/dist/src/dispatch/EventsRepository.d.ts +22 -0
- package/dist/src/dispatch/EventsRepository.d.ts.map +1 -0
- package/dist/src/dispatch/EventsRepository.js +138 -0
- package/dist/src/dispatch/EventsRepository.js.map +1 -0
- package/dist/src/dispatch/ProjectDispatcher.d.ts +22 -0
- package/dist/src/dispatch/ProjectDispatcher.d.ts.map +1 -0
- package/dist/src/dispatch/ProjectDispatcher.js +103 -0
- package/dist/src/dispatch/ProjectDispatcher.js.map +1 -0
- package/dist/src/dispatch/TargetHandlerResolver.d.ts +9 -0
- package/dist/src/dispatch/TargetHandlerResolver.d.ts.map +1 -0
- package/dist/src/dispatch/TargetHandlerResolver.js +17 -0
- package/dist/src/dispatch/TargetHandlerResolver.js.map +1 -0
- package/dist/src/dispatch/WebhookTargetHandler.d.ts +7 -0
- package/dist/src/dispatch/WebhookTargetHandler.d.ts.map +1 -0
- package/dist/src/dispatch/WebhookTargetHandler.js +85 -0
- package/dist/src/dispatch/WebhookTargetHandler.js.map +1 -0
- package/dist/src/dispatch/types.d.ts +27 -0
- package/dist/src/dispatch/types.d.ts.map +1 -0
- package/dist/src/dispatch/types.js +3 -0
- package/dist/src/dispatch/types.js.map +1 -0
- package/dist/src/graphql/http/ActionsApiMiddlewareFactory.d.ts +10 -0
- package/dist/src/graphql/http/ActionsApiMiddlewareFactory.d.ts.map +1 -0
- package/dist/src/graphql/http/ActionsApiMiddlewareFactory.js +31 -0
- package/dist/src/graphql/http/ActionsApiMiddlewareFactory.js.map +1 -0
- package/dist/src/graphql/http/ActionsContextResolver.d.ts +11 -0
- package/dist/src/graphql/http/ActionsContextResolver.d.ts.map +1 -0
- package/dist/src/graphql/http/ActionsContextResolver.js +33 -0
- package/dist/src/graphql/http/ActionsContextResolver.js.map +1 -0
- package/dist/src/graphql/http/ActionsGraphQLHandlerFactory.d.ts +8 -0
- package/dist/src/graphql/http/ActionsGraphQLHandlerFactory.d.ts.map +1 -0
- package/dist/src/graphql/http/ActionsGraphQLHandlerFactory.js +21 -0
- package/dist/src/graphql/http/ActionsGraphQLHandlerFactory.js.map +1 -0
- package/dist/src/graphql/http/ActionsWebsocketControllerFactory.d.ts +11 -0
- package/dist/src/graphql/http/ActionsWebsocketControllerFactory.d.ts.map +1 -0
- package/dist/src/graphql/http/ActionsWebsocketControllerFactory.js +150 -0
- package/dist/src/graphql/http/ActionsWebsocketControllerFactory.js.map +1 -0
- package/dist/src/graphql/resolvers/ActionsContext.d.ts +9 -0
- package/dist/src/graphql/resolvers/ActionsContext.d.ts.map +1 -0
- package/dist/src/graphql/resolvers/ActionsContext.js +3 -0
- package/dist/src/graphql/resolvers/ActionsContext.js.map +1 -0
- package/dist/src/graphql/resolvers/ResolversFactory.d.ts +13 -0
- package/dist/src/graphql/resolvers/ResolversFactory.d.ts.map +1 -0
- package/dist/src/graphql/resolvers/ResolversFactory.js +32 -0
- package/dist/src/graphql/resolvers/ResolversFactory.js.map +1 -0
- package/dist/src/graphql/resolvers/index.d.ts +3 -0
- package/dist/src/graphql/resolvers/index.d.ts.map +1 -0
- package/dist/src/graphql/resolvers/index.js +19 -0
- package/dist/src/graphql/resolvers/index.js.map +1 -0
- package/dist/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.d.ts +11 -0
- package/dist/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.d.ts.map +1 -0
- package/dist/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.js +16 -0
- package/dist/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.js.map +1 -0
- package/dist/src/graphql/resolvers/mutation/SetVariablesMutationResolver.d.ts +11 -0
- package/dist/src/graphql/resolvers/mutation/SetVariablesMutationResolver.d.ts.map +1 -0
- package/dist/src/graphql/resolvers/mutation/SetVariablesMutationResolver.js +16 -0
- package/dist/src/graphql/resolvers/mutation/SetVariablesMutationResolver.js.map +1 -0
- package/dist/src/graphql/resolvers/mutation/index.d.ts +3 -0
- package/dist/src/graphql/resolvers/mutation/index.d.ts.map +1 -0
- package/dist/src/graphql/resolvers/mutation/index.js +19 -0
- package/dist/src/graphql/resolvers/mutation/index.js.map +1 -0
- package/dist/src/graphql/resolvers/query/EventsQueryResolver.d.ts +11 -0
- package/dist/src/graphql/resolvers/query/EventsQueryResolver.d.ts.map +1 -0
- package/dist/src/graphql/resolvers/query/EventsQueryResolver.js +43 -0
- package/dist/src/graphql/resolvers/query/EventsQueryResolver.js.map +1 -0
- package/dist/src/graphql/resolvers/query/VariablesQueryResolver.d.ts +12 -0
- package/dist/src/graphql/resolvers/query/VariablesQueryResolver.d.ts.map +1 -0
- package/dist/src/graphql/resolvers/query/VariablesQueryResolver.js +16 -0
- package/dist/src/graphql/resolvers/query/VariablesQueryResolver.js.map +1 -0
- package/dist/src/graphql/resolvers/query/index.d.ts +2 -0
- package/dist/src/graphql/resolvers/query/index.d.ts.map +1 -0
- package/dist/src/graphql/resolvers/query/index.js +18 -0
- package/dist/src/graphql/resolvers/query/index.js.map +1 -0
- package/dist/src/graphql/schema/actions.graphql.d.ts +3 -0
- package/dist/src/graphql/schema/actions.graphql.d.ts.map +1 -0
- package/dist/src/graphql/schema/actions.graphql.js +93 -0
- package/dist/src/graphql/schema/actions.graphql.js.map +1 -0
- package/dist/src/graphql/schema/index.d.ts +224 -0
- package/dist/src/graphql/schema/index.d.ts.map +1 -0
- package/dist/src/graphql/schema/index.js +3 -0
- package/dist/src/graphql/schema/index.js.map +1 -0
- package/dist/src/index.d.ts +13 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +81 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/migrations/2023-03-10-145000-actions-variables.d.ts +3 -0
- package/dist/src/migrations/2023-03-10-145000-actions-variables.d.ts.map +1 -0
- package/dist/src/migrations/2023-03-10-145000-actions-variables.js +17 -0
- package/dist/src/migrations/2023-03-10-145000-actions-variables.js.map +1 -0
- package/dist/src/migrations/index.d.ts +3 -0
- package/dist/src/migrations/index.d.ts.map +1 -0
- package/dist/src/migrations/index.js +13 -0
- package/dist/src/migrations/index.js.map +1 -0
- package/dist/src/migrations/snapshot.d.ts +3 -0
- package/dist/src/migrations/snapshot.d.ts.map +1 -0
- package/dist/src/migrations/snapshot.js +49 -0
- package/dist/src/migrations/snapshot.js.map +1 -0
- package/dist/src/model/EventsInProcessingQuery.d.ts +9 -0
- package/dist/src/model/EventsInProcessingQuery.d.ts.map +1 -0
- package/dist/src/model/EventsInProcessingQuery.js +22 -0
- package/dist/src/model/EventsInProcessingQuery.js.map +1 -0
- package/dist/src/model/EventsToProcessQuery.d.ts +9 -0
- package/dist/src/model/EventsToProcessQuery.d.ts.map +1 -0
- package/dist/src/model/EventsToProcessQuery.js +22 -0
- package/dist/src/model/EventsToProcessQuery.js.map +1 -0
- package/dist/src/model/EventsToProcessSpecification.d.ts +4 -0
- package/dist/src/model/EventsToProcessSpecification.d.ts.map +1 -0
- package/dist/src/model/EventsToProcessSpecification.js +14 -0
- package/dist/src/model/EventsToProcessSpecification.js.map +1 -0
- package/dist/src/model/FailedEventsQuery.d.ts +9 -0
- package/dist/src/model/FailedEventsQuery.d.ts.map +1 -0
- package/dist/src/model/FailedEventsQuery.js +22 -0
- package/dist/src/model/FailedEventsQuery.js.map +1 -0
- package/dist/src/model/SetVariableCommand.d.ts +8 -0
- package/dist/src/model/SetVariableCommand.d.ts.map +1 -0
- package/dist/src/model/SetVariableCommand.js +26 -0
- package/dist/src/model/SetVariableCommand.js.map +1 -0
- package/dist/src/model/VariablesManager.d.ts +8 -0
- package/dist/src/model/VariablesManager.d.ts.map +1 -0
- package/dist/src/model/VariablesManager.js +46 -0
- package/dist/src/model/VariablesManager.js.map +1 -0
- package/dist/src/model/VariablesQuery.d.ts +12 -0
- package/dist/src/model/VariablesQuery.d.ts.map +1 -0
- package/dist/src/model/VariablesQuery.js +13 -0
- package/dist/src/model/VariablesQuery.js.map +1 -0
- package/dist/src/model/types.d.ts +16 -0
- package/dist/src/model/types.d.ts.map +1 -0
- package/dist/src/model/types.js +3 -0
- package/dist/src/model/types.js.map +1 -0
- package/dist/src/triggers/Payload.d.ts +62 -0
- package/dist/src/triggers/Payload.d.ts.map +1 -0
- package/dist/src/triggers/Payload.js +3 -0
- package/dist/src/triggers/Payload.js.map +1 -0
- package/dist/src/triggers/TriggerHandler.d.ts +26 -0
- package/dist/src/triggers/TriggerHandler.d.ts.map +1 -0
- package/dist/src/triggers/TriggerHandler.js +130 -0
- package/dist/src/triggers/TriggerHandler.js.map +1 -0
- package/dist/src/triggers/TriggerIndirectChangesFetcher.d.ts +11 -0
- package/dist/src/triggers/TriggerIndirectChangesFetcher.d.ts.map +1 -0
- package/dist/src/triggers/TriggerIndirectChangesFetcher.js +24 -0
- package/dist/src/triggers/TriggerIndirectChangesFetcher.js.map +1 -0
- package/dist/src/triggers/TriggerListeners.d.ts +9 -0
- package/dist/src/triggers/TriggerListeners.d.ts.map +1 -0
- package/dist/src/triggers/TriggerListeners.js +3 -0
- package/dist/src/triggers/TriggerListeners.js.map +1 -0
- package/dist/src/triggers/TriggerListenersBuilder.d.ts +15 -0
- package/dist/src/triggers/TriggerListenersBuilder.d.ts.map +1 -0
- package/dist/src/triggers/TriggerListenersBuilder.js +169 -0
- package/dist/src/triggers/TriggerListenersBuilder.js.map +1 -0
- package/dist/src/triggers/TriggerListenersFactory.d.ts +8 -0
- package/dist/src/triggers/TriggerListenersFactory.d.ts.map +1 -0
- package/dist/src/triggers/TriggerListenersFactory.js +18 -0
- package/dist/src/triggers/TriggerListenersFactory.js.map +1 -0
- package/dist/src/triggers/TriggerListenersStore.d.ts +48 -0
- package/dist/src/triggers/TriggerListenersStore.d.ts.map +1 -0
- package/dist/src/triggers/TriggerListenersStore.js +30 -0
- package/dist/src/triggers/TriggerListenersStore.js.map +1 -0
- package/dist/src/triggers/TriggerPayloadBuilder.d.ts +14 -0
- package/dist/src/triggers/TriggerPayloadBuilder.d.ts.map +1 -0
- package/dist/src/triggers/TriggerPayloadBuilder.js +140 -0
- package/dist/src/triggers/TriggerPayloadBuilder.js.map +1 -0
- package/dist/src/triggers/TriggerPayloadManager.d.ts +27 -0
- package/dist/src/triggers/TriggerPayloadManager.d.ts.map +1 -0
- package/dist/src/triggers/TriggerPayloadManager.js +26 -0
- package/dist/src/triggers/TriggerPayloadManager.js.map +1 -0
- package/dist/src/triggers/TriggerPayloadPersister.d.ts +18 -0
- package/dist/src/triggers/TriggerPayloadPersister.d.ts.map +1 -0
- package/dist/src/triggers/TriggerPayloadPersister.js +44 -0
- package/dist/src/triggers/TriggerPayloadPersister.js.map +1 -0
- package/dist/src/triggers/index.d.ts +8 -0
- package/dist/src/triggers/index.d.ts.map +1 -0
- package/dist/src/triggers/index.js +24 -0
- package/dist/src/triggers/index.js.map +1 -0
- package/dist/src/tsconfig.tsbuildinfo +1 -0
- package/dist/src/utils/assertNever.d.ts +2 -0
- package/dist/src/utils/assertNever.d.ts.map +1 -0
- package/dist/src/utils/assertNever.js +8 -0
- package/dist/src/utils/assertNever.js.map +1 -0
- package/dist/src/utils/map.d.ts +2 -0
- package/dist/src/utils/map.d.ts.map +1 -0
- package/dist/src/utils/map.js +14 -0
- package/dist/src/utils/map.js.map +1 -0
- package/dist/tests/cases/integration/triggers.manyHasManyWatch.test.d.ts +2 -0
- package/dist/tests/cases/integration/triggers.manyHasManyWatch.test.d.ts.map +1 -0
- package/dist/tests/cases/integration/triggers.manyHasManyWatch.test.js +442 -0
- package/dist/tests/cases/integration/triggers.manyHasManyWatch.test.js.map +1 -0
- package/dist/tests/cases/integration/triggers.manyHasOneWatch.test.d.ts +2 -0
- package/dist/tests/cases/integration/triggers.manyHasOneWatch.test.d.ts.map +1 -0
- package/dist/tests/cases/integration/triggers.manyHasOneWatch.test.js +449 -0
- package/dist/tests/cases/integration/triggers.manyHasOneWatch.test.js.map +1 -0
- package/dist/tests/cases/integration/triggers.rootWatch.test.d.ts +2 -0
- package/dist/tests/cases/integration/triggers.rootWatch.test.d.ts.map +1 -0
- package/dist/tests/cases/integration/triggers.rootWatch.test.js +159 -0
- package/dist/tests/cases/integration/triggers.rootWatch.test.js.map +1 -0
- package/dist/tests/cases/integration/utils.d.ts +4 -0
- package/dist/tests/cases/integration/utils.d.ts.map +1 -0
- package/dist/tests/cases/integration/utils.js +12 -0
- package/dist/tests/cases/integration/utils.js.map +1 -0
- package/dist/tests/cases/unit/generator.test.d.ts +2 -0
- package/dist/tests/cases/unit/generator.test.d.ts.map +1 -0
- package/dist/tests/cases/unit/generator.test.js +627 -0
- package/dist/tests/cases/unit/generator.test.js.map +1 -0
- package/dist/tests/src/gql.d.ts +2 -0
- package/dist/tests/src/gql.d.ts.map +1 -0
- package/dist/tests/src/gql.js +14 -0
- package/dist/tests/src/gql.js.map +1 -0
- package/dist/tests/tsconfig.tsbuildinfo +1 -0
- package/graphql-actions.codegen.yml +21 -0
- package/package.json +41 -0
- package/src/ActionsExecutionContainerHookFactory.ts +28 -0
- package/src/ImplementationException.ts +2 -0
- package/src/ListenerStoreProvider.ts +17 -0
- package/src/dispatch/DispatchWorkerSupervisor.ts +137 -0
- package/src/dispatch/EventDispatcher.ts +64 -0
- package/src/dispatch/EventsRepository.ts +165 -0
- package/src/dispatch/ProjectDispatcher.ts +119 -0
- package/src/dispatch/TargetHandlerResolver.ts +18 -0
- package/src/dispatch/WebhookTargetHandler.ts +88 -0
- package/src/dispatch/types.ts +31 -0
- package/src/graphql/http/ActionsApiMiddlewareFactory.ts +36 -0
- package/src/graphql/http/ActionsContextResolver.ts +38 -0
- package/src/graphql/http/ActionsGraphQLHandlerFactory.ts +23 -0
- package/src/graphql/http/ActionsWebsocketControllerFactory.ts +143 -0
- package/src/graphql/resolvers/ActionsContext.ts +9 -0
- package/src/graphql/resolvers/ResolversFactory.ts +35 -0
- package/src/graphql/resolvers/index.ts +2 -0
- package/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.ts +16 -0
- package/src/graphql/resolvers/mutation/SetVariablesMutationResolver.ts +19 -0
- package/src/graphql/resolvers/mutation/index.ts +2 -0
- package/src/graphql/resolvers/query/EventsQueryResolver.ts +55 -0
- package/src/graphql/resolvers/query/VariablesQueryResolver.ts +18 -0
- package/src/graphql/resolvers/query/index.ts +1 -0
- package/src/graphql/schema/actions.graphql.ts +91 -0
- package/src/graphql/schema/index.ts +295 -0
- package/src/index.ts +88 -0
- package/src/migrations/2023-03-10-145000-actions-variables.ts +16 -0
- package/src/migrations/index.ts +7 -0
- package/src/migrations/snapshot.ts +47 -0
- package/src/model/EventsInProcessingQuery.ts +21 -0
- package/src/model/EventsToProcessQuery.ts +21 -0
- package/src/model/EventsToProcessSpecification.ts +11 -0
- package/src/model/FailedEventsQuery.ts +21 -0
- package/src/model/SetVariableCommand.ts +26 -0
- package/src/model/VariablesManager.ts +49 -0
- package/src/model/VariablesQuery.ts +17 -0
- package/src/model/types.ts +15 -0
- package/src/triggers/Payload.ts +82 -0
- package/src/triggers/TriggerHandler.ts +161 -0
- package/src/triggers/TriggerIndirectChangesFetcher.ts +30 -0
- package/src/triggers/TriggerListeners.ts +16 -0
- package/src/triggers/TriggerListenersBuilder.ts +190 -0
- package/src/triggers/TriggerListenersFactory.ts +19 -0
- package/src/triggers/TriggerListenersStore.ts +76 -0
- package/src/triggers/TriggerPayloadBuilder.ts +148 -0
- package/src/triggers/TriggerPayloadManager.ts +47 -0
- package/src/triggers/TriggerPayloadPersister.ts +43 -0
- package/src/triggers/index.ts +7 -0
- package/src/tsconfig.json +21 -0
- package/src/utils/assertNever.ts +3 -0
- package/src/utils/map.ts +13 -0
- package/tests/cases/integration/triggers.manyHasManyWatch.test.ts +437 -0
- package/tests/cases/integration/triggers.manyHasOneWatch.test.ts +446 -0
- package/tests/cases/integration/triggers.rootWatch.test.ts +152 -0
- package/tests/cases/integration/utils.ts +9 -0
- package/tests/cases/unit/generator.test.ts +689 -0
- package/tests/src/gql.ts +7 -0
- package/tests/tsconfig.json +16 -0
- package/tsconfig.json +5 -0
- package/tsconfig.settings.json +8 -0
- package/vite.config.js +3 -0
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
import { GraphQLResolveInfo, GraphQLScalarType, GraphQLScalarTypeConfig } from 'graphql'
|
|
2
|
+
export type Maybe<T> = T | null
|
|
3
|
+
export type InputMaybe<T> = Maybe<T>
|
|
4
|
+
export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] }
|
|
5
|
+
export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> }
|
|
6
|
+
export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> }
|
|
7
|
+
export type RequireFields<T, K extends keyof T> = Omit<T, K> & { [P in K]-?: NonNullable<T[P]> }
|
|
8
|
+
/** All built-in and custom scalars, mapped to their actual values */
|
|
9
|
+
export type Scalars = {
|
|
10
|
+
ID: string
|
|
11
|
+
String: string
|
|
12
|
+
Boolean: boolean
|
|
13
|
+
Int: number
|
|
14
|
+
Float: number
|
|
15
|
+
DateTime: Date
|
|
16
|
+
Json: any
|
|
17
|
+
Uuid: String
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export type Event = {
|
|
21
|
+
readonly __typename?: 'Event'
|
|
22
|
+
readonly createdAt: Scalars['DateTime']
|
|
23
|
+
readonly id: Scalars['Uuid']
|
|
24
|
+
readonly lastStateChange: Scalars['DateTime']
|
|
25
|
+
readonly log: Scalars['Json']
|
|
26
|
+
readonly numRetries: Scalars['Int']
|
|
27
|
+
readonly payload: Scalars['Json']
|
|
28
|
+
readonly resolvedAt?: Maybe<Scalars['DateTime']>
|
|
29
|
+
readonly stage: Scalars['String']
|
|
30
|
+
readonly state: EventState
|
|
31
|
+
readonly target: Scalars['String']
|
|
32
|
+
readonly transactionId: Scalars['Uuid']
|
|
33
|
+
readonly visibleAt?: Maybe<Scalars['DateTime']>
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export type EventArgs = {
|
|
37
|
+
/** Max 10000 */
|
|
38
|
+
readonly limit?: InputMaybe<Scalars['Int']>
|
|
39
|
+
readonly offset?: InputMaybe<Scalars['Int']>
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export type EventState =
|
|
43
|
+
| 'created'
|
|
44
|
+
| 'failed'
|
|
45
|
+
| 'processing'
|
|
46
|
+
| 'retrying'
|
|
47
|
+
| 'stopped'
|
|
48
|
+
| 'succeed'
|
|
49
|
+
|
|
50
|
+
export type Mutation = {
|
|
51
|
+
readonly __typename?: 'Mutation'
|
|
52
|
+
readonly processBatch: ProcessBatchResponse
|
|
53
|
+
readonly setVariables: SetVariablesResponse
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
export type MutationSetVariablesArgs = {
|
|
58
|
+
args: SetVariablesArgs
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export type ProcessBatchResponse = {
|
|
62
|
+
readonly __typename?: 'ProcessBatchResponse'
|
|
63
|
+
readonly ok: Scalars['Boolean']
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export type Query = {
|
|
67
|
+
readonly __typename?: 'Query'
|
|
68
|
+
readonly eventsInProcessing: ReadonlyArray<Event>
|
|
69
|
+
readonly eventsToProcess: ReadonlyArray<Event>
|
|
70
|
+
readonly failedEvents: ReadonlyArray<Event>
|
|
71
|
+
readonly variables: ReadonlyArray<Variable>
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
export type QueryEventsInProcessingArgs = {
|
|
76
|
+
args?: InputMaybe<EventArgs>
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
export type QueryEventsToProcessArgs = {
|
|
81
|
+
args?: InputMaybe<EventArgs>
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
export type QueryFailedEventsArgs = {
|
|
86
|
+
args?: InputMaybe<EventArgs>
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export type SetVariablesArgs = {
|
|
90
|
+
readonly mode?: InputMaybe<SetVariablesMode>
|
|
91
|
+
readonly variables: ReadonlyArray<VariableInput>
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Defines how it handles original variables.
|
|
96
|
+
* - MERGE merges with new values (default behaviour)
|
|
97
|
+
* - SET replaces all variables
|
|
98
|
+
* - APPEND_ONLY_MISSING appends values if not already exist
|
|
99
|
+
*/
|
|
100
|
+
export type SetVariablesMode =
|
|
101
|
+
| 'APPEND_ONLY_MISSING'
|
|
102
|
+
| 'MERGE'
|
|
103
|
+
| 'SET'
|
|
104
|
+
|
|
105
|
+
export type SetVariablesResponse = {
|
|
106
|
+
readonly __typename?: 'SetVariablesResponse'
|
|
107
|
+
readonly ok: Scalars['Boolean']
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export type Variable = {
|
|
111
|
+
readonly __typename?: 'Variable'
|
|
112
|
+
readonly name: Scalars['String']
|
|
113
|
+
readonly value: Scalars['String']
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export type VariableInput = {
|
|
117
|
+
readonly name: Scalars['String']
|
|
118
|
+
readonly value: Scalars['String']
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
export type ResolverTypeWrapper<T> = Promise<T> | T
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
export type ResolverWithResolve<TResult, TParent, TContext, TArgs> = {
|
|
127
|
+
resolve: ResolverFn<TResult, TParent, TContext, TArgs>
|
|
128
|
+
}
|
|
129
|
+
export type Resolver<TResult, TParent = {}, TContext = {}, TArgs = {}> = ResolverFn<TResult, TParent, TContext, TArgs> | ResolverWithResolve<TResult, TParent, TContext, TArgs>
|
|
130
|
+
|
|
131
|
+
export type ResolverFn<TResult, TParent, TContext, TArgs> = (
|
|
132
|
+
parent: TParent,
|
|
133
|
+
args: TArgs,
|
|
134
|
+
context: TContext,
|
|
135
|
+
info: GraphQLResolveInfo
|
|
136
|
+
) => Promise<TResult> | TResult
|
|
137
|
+
|
|
138
|
+
export type SubscriptionSubscribeFn<TResult, TParent, TContext, TArgs> = (
|
|
139
|
+
parent: TParent,
|
|
140
|
+
args: TArgs,
|
|
141
|
+
context: TContext,
|
|
142
|
+
info: GraphQLResolveInfo
|
|
143
|
+
) => AsyncIterable<TResult> | Promise<AsyncIterable<TResult>>
|
|
144
|
+
|
|
145
|
+
export type SubscriptionResolveFn<TResult, TParent, TContext, TArgs> = (
|
|
146
|
+
parent: TParent,
|
|
147
|
+
args: TArgs,
|
|
148
|
+
context: TContext,
|
|
149
|
+
info: GraphQLResolveInfo
|
|
150
|
+
) => TResult | Promise<TResult>
|
|
151
|
+
|
|
152
|
+
export interface SubscriptionSubscriberObject<TResult, TKey extends string, TParent, TContext, TArgs> {
|
|
153
|
+
subscribe: SubscriptionSubscribeFn<{ [key in TKey]: TResult }, TParent, TContext, TArgs>
|
|
154
|
+
resolve?: SubscriptionResolveFn<TResult, { [key in TKey]: TResult }, TContext, TArgs>
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export interface SubscriptionResolverObject<TResult, TParent, TContext, TArgs> {
|
|
158
|
+
subscribe: SubscriptionSubscribeFn<any, TParent, TContext, TArgs>
|
|
159
|
+
resolve: SubscriptionResolveFn<TResult, any, TContext, TArgs>
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
export type SubscriptionObject<TResult, TKey extends string, TParent, TContext, TArgs> =
|
|
163
|
+
| SubscriptionSubscriberObject<TResult, TKey, TParent, TContext, TArgs>
|
|
164
|
+
| SubscriptionResolverObject<TResult, TParent, TContext, TArgs>
|
|
165
|
+
|
|
166
|
+
export type SubscriptionResolver<TResult, TKey extends string, TParent = {}, TContext = {}, TArgs = {}> =
|
|
167
|
+
| ((...args: any[]) => SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>)
|
|
168
|
+
| SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>
|
|
169
|
+
|
|
170
|
+
export type TypeResolveFn<TTypes, TParent = {}, TContext = {}> = (
|
|
171
|
+
parent: TParent,
|
|
172
|
+
context: TContext,
|
|
173
|
+
info: GraphQLResolveInfo
|
|
174
|
+
) => Maybe<TTypes> | Promise<Maybe<TTypes>>
|
|
175
|
+
|
|
176
|
+
export type IsTypeOfResolverFn<T = {}, TContext = {}> = (obj: T, context: TContext, info: GraphQLResolveInfo) => boolean | Promise<boolean>
|
|
177
|
+
|
|
178
|
+
export type NextResolverFn<T> = () => Promise<T>
|
|
179
|
+
|
|
180
|
+
export type DirectiveResolverFn<TResult = {}, TParent = {}, TContext = {}, TArgs = {}> = (
|
|
181
|
+
next: NextResolverFn<TResult>,
|
|
182
|
+
parent: TParent,
|
|
183
|
+
args: TArgs,
|
|
184
|
+
context: TContext,
|
|
185
|
+
info: GraphQLResolveInfo
|
|
186
|
+
) => TResult | Promise<TResult>
|
|
187
|
+
|
|
188
|
+
/** Mapping between all available schema types and the resolvers types */
|
|
189
|
+
export type ResolversTypes = {
|
|
190
|
+
Boolean: ResolverTypeWrapper<Scalars['Boolean']>
|
|
191
|
+
DateTime: ResolverTypeWrapper<Scalars['DateTime']>
|
|
192
|
+
Event: ResolverTypeWrapper<Event>
|
|
193
|
+
EventArgs: EventArgs
|
|
194
|
+
EventState: EventState
|
|
195
|
+
Int: ResolverTypeWrapper<Scalars['Int']>
|
|
196
|
+
Json: ResolverTypeWrapper<Scalars['Json']>
|
|
197
|
+
Mutation: ResolverTypeWrapper<{}>
|
|
198
|
+
ProcessBatchResponse: ResolverTypeWrapper<ProcessBatchResponse>
|
|
199
|
+
Query: ResolverTypeWrapper<{}>
|
|
200
|
+
SetVariablesArgs: SetVariablesArgs
|
|
201
|
+
SetVariablesMode: SetVariablesMode
|
|
202
|
+
SetVariablesResponse: ResolverTypeWrapper<SetVariablesResponse>
|
|
203
|
+
String: ResolverTypeWrapper<Scalars['String']>
|
|
204
|
+
Uuid: ResolverTypeWrapper<Scalars['Uuid']>
|
|
205
|
+
Variable: ResolverTypeWrapper<Variable>
|
|
206
|
+
VariableInput: VariableInput
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/** Mapping between all available schema types and the resolvers parents */
|
|
210
|
+
export type ResolversParentTypes = {
|
|
211
|
+
Boolean: Scalars['Boolean']
|
|
212
|
+
DateTime: Scalars['DateTime']
|
|
213
|
+
Event: Event
|
|
214
|
+
EventArgs: EventArgs
|
|
215
|
+
Int: Scalars['Int']
|
|
216
|
+
Json: Scalars['Json']
|
|
217
|
+
Mutation: {}
|
|
218
|
+
ProcessBatchResponse: ProcessBatchResponse
|
|
219
|
+
Query: {}
|
|
220
|
+
SetVariablesArgs: SetVariablesArgs
|
|
221
|
+
SetVariablesResponse: SetVariablesResponse
|
|
222
|
+
String: Scalars['String']
|
|
223
|
+
Uuid: Scalars['Uuid']
|
|
224
|
+
Variable: Variable
|
|
225
|
+
VariableInput: VariableInput
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
export interface DateTimeScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes['DateTime'], any> {
|
|
229
|
+
name: 'DateTime'
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
export type EventResolvers<ContextType = any, ParentType extends ResolversParentTypes['Event'] = ResolversParentTypes['Event']> = {
|
|
233
|
+
createdAt?: Resolver<ResolversTypes['DateTime'], ParentType, ContextType>
|
|
234
|
+
id?: Resolver<ResolversTypes['Uuid'], ParentType, ContextType>
|
|
235
|
+
lastStateChange?: Resolver<ResolversTypes['DateTime'], ParentType, ContextType>
|
|
236
|
+
log?: Resolver<ResolversTypes['Json'], ParentType, ContextType>
|
|
237
|
+
numRetries?: Resolver<ResolversTypes['Int'], ParentType, ContextType>
|
|
238
|
+
payload?: Resolver<ResolversTypes['Json'], ParentType, ContextType>
|
|
239
|
+
resolvedAt?: Resolver<Maybe<ResolversTypes['DateTime']>, ParentType, ContextType>
|
|
240
|
+
stage?: Resolver<ResolversTypes['String'], ParentType, ContextType>
|
|
241
|
+
state?: Resolver<ResolversTypes['EventState'], ParentType, ContextType>
|
|
242
|
+
target?: Resolver<ResolversTypes['String'], ParentType, ContextType>
|
|
243
|
+
transactionId?: Resolver<ResolversTypes['Uuid'], ParentType, ContextType>
|
|
244
|
+
visibleAt?: Resolver<Maybe<ResolversTypes['DateTime']>, ParentType, ContextType>
|
|
245
|
+
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
export interface JsonScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes['Json'], any> {
|
|
249
|
+
name: 'Json'
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
export type MutationResolvers<ContextType = any, ParentType extends ResolversParentTypes['Mutation'] = ResolversParentTypes['Mutation']> = {
|
|
253
|
+
processBatch?: Resolver<ResolversTypes['ProcessBatchResponse'], ParentType, ContextType>
|
|
254
|
+
setVariables?: Resolver<ResolversTypes['SetVariablesResponse'], ParentType, ContextType, RequireFields<MutationSetVariablesArgs, 'args'>>
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
export type ProcessBatchResponseResolvers<ContextType = any, ParentType extends ResolversParentTypes['ProcessBatchResponse'] = ResolversParentTypes['ProcessBatchResponse']> = {
|
|
258
|
+
ok?: Resolver<ResolversTypes['Boolean'], ParentType, ContextType>
|
|
259
|
+
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
export type QueryResolvers<ContextType = any, ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']> = {
|
|
263
|
+
eventsInProcessing?: Resolver<ReadonlyArray<ResolversTypes['Event']>, ParentType, ContextType, Partial<QueryEventsInProcessingArgs>>
|
|
264
|
+
eventsToProcess?: Resolver<ReadonlyArray<ResolversTypes['Event']>, ParentType, ContextType, Partial<QueryEventsToProcessArgs>>
|
|
265
|
+
failedEvents?: Resolver<ReadonlyArray<ResolversTypes['Event']>, ParentType, ContextType, Partial<QueryFailedEventsArgs>>
|
|
266
|
+
variables?: Resolver<ReadonlyArray<ResolversTypes['Variable']>, ParentType, ContextType>
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
export type SetVariablesResponseResolvers<ContextType = any, ParentType extends ResolversParentTypes['SetVariablesResponse'] = ResolversParentTypes['SetVariablesResponse']> = {
|
|
270
|
+
ok?: Resolver<ResolversTypes['Boolean'], ParentType, ContextType>
|
|
271
|
+
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
export interface UuidScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes['Uuid'], any> {
|
|
275
|
+
name: 'Uuid'
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
export type VariableResolvers<ContextType = any, ParentType extends ResolversParentTypes['Variable'] = ResolversParentTypes['Variable']> = {
|
|
279
|
+
name?: Resolver<ResolversTypes['String'], ParentType, ContextType>
|
|
280
|
+
value?: Resolver<ResolversTypes['String'], ParentType, ContextType>
|
|
281
|
+
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
export type Resolvers<ContextType = any> = {
|
|
285
|
+
DateTime?: GraphQLScalarType
|
|
286
|
+
Event?: EventResolvers<ContextType>
|
|
287
|
+
Json?: GraphQLScalarType
|
|
288
|
+
Mutation?: MutationResolvers<ContextType>
|
|
289
|
+
ProcessBatchResponse?: ProcessBatchResponseResolvers<ContextType>
|
|
290
|
+
Query?: QueryResolvers<ContextType>
|
|
291
|
+
SetVariablesResponse?: SetVariablesResponseResolvers<ContextType>
|
|
292
|
+
Uuid?: GraphQLScalarType
|
|
293
|
+
Variable?: VariableResolvers<ContextType>
|
|
294
|
+
}
|
|
295
|
+
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { Plugin } from '@contember/engine-plugins'
|
|
2
|
+
import { migrationsGroup } from './migrations'
|
|
3
|
+
import { ActionsExecutionContainerHookFactory } from './ActionsExecutionContainerHookFactory'
|
|
4
|
+
import { ListenerStoreProvider } from './ListenerStoreProvider'
|
|
5
|
+
import { MigrationGroup } from '@contember/database-migrations'
|
|
6
|
+
import { MasterContainerBuilder, MasterContainerHook } from '@contember/engine-http'
|
|
7
|
+
import { ActionsApiMiddlewareFactory } from './graphql/http/ActionsApiMiddlewareFactory'
|
|
8
|
+
import { ActionsGraphQLHandlerFactory } from './graphql/http/ActionsGraphQLHandlerFactory'
|
|
9
|
+
import { ResolversFactory } from './graphql/resolvers/ResolversFactory'
|
|
10
|
+
import { EventsQueryResolver, ProcessBatchMutationResolver, SetVariablesMutationResolver } from './graphql/resolvers'
|
|
11
|
+
import { EventDispatcher } from './dispatch/EventDispatcher'
|
|
12
|
+
import { EventsRepository } from './dispatch/EventsRepository'
|
|
13
|
+
import { TargetHandlerResolver } from './dispatch/TargetHandlerResolver'
|
|
14
|
+
import { WebhookTargetHandler } from './dispatch/WebhookTargetHandler'
|
|
15
|
+
import { ActionsContextResolver } from './graphql/http/ActionsContextResolver'
|
|
16
|
+
import { ActionsWebsocketControllerFactory } from './graphql/http/ActionsWebsocketControllerFactory'
|
|
17
|
+
import { DispatchWorkerSupervisorFactory } from './dispatch/DispatchWorkerSupervisor'
|
|
18
|
+
import { ProjectDispatcherFactory } from './dispatch/ProjectDispatcher'
|
|
19
|
+
import { VariablesQueryResolver } from './graphql/resolvers/query/VariablesQueryResolver'
|
|
20
|
+
import { VariablesManager } from './model/VariablesManager'
|
|
21
|
+
|
|
22
|
+
export {
|
|
23
|
+
TriggerListenersFactory,
|
|
24
|
+
TriggerListenersStore,
|
|
25
|
+
TriggerHandler,
|
|
26
|
+
TriggerPayloadManager,
|
|
27
|
+
TriggerIndirectChangesFetcher,
|
|
28
|
+
} from './triggers'
|
|
29
|
+
export { ActionsExecutionContainerHookFactory } from './ActionsExecutionContainerHookFactory'
|
|
30
|
+
export { ListenerStoreProvider } from './ListenerStoreProvider'
|
|
31
|
+
|
|
32
|
+
export default class ActionsPlugin implements Plugin {
|
|
33
|
+
name = 'contember/actions'
|
|
34
|
+
|
|
35
|
+
getSystemMigrations(): MigrationGroup {
|
|
36
|
+
return migrationsGroup
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
getExecutionContainerHook() {
|
|
40
|
+
const hookFactory = new ActionsExecutionContainerHookFactory(new ListenerStoreProvider())
|
|
41
|
+
return hookFactory.create()
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
getMasterContainerHook() {
|
|
45
|
+
const hook: MasterContainerHook = (builder: MasterContainerBuilder) => {
|
|
46
|
+
return builder
|
|
47
|
+
.addService('actions_variableManager', () => {
|
|
48
|
+
return new VariablesManager()
|
|
49
|
+
})
|
|
50
|
+
.addService('actions_eventDispatcher', ({ actions_variableManager }) => {
|
|
51
|
+
const eventsRepository = new EventsRepository()
|
|
52
|
+
const webhookTargetHandler = new WebhookTargetHandler()
|
|
53
|
+
const targetHandlerResolver = new TargetHandlerResolver(webhookTargetHandler)
|
|
54
|
+
return new EventDispatcher(eventsRepository, actions_variableManager, targetHandlerResolver)
|
|
55
|
+
})
|
|
56
|
+
.addService('actions_dispatchWorkerSupervisorFactory', ({ actions_eventDispatcher }) => {
|
|
57
|
+
const projectDispatcherFactory = new ProjectDispatcherFactory(actions_eventDispatcher)
|
|
58
|
+
return new DispatchWorkerSupervisorFactory(projectDispatcherFactory)
|
|
59
|
+
})
|
|
60
|
+
.setupService('application', (it, { projectContextResolver, debugMode, actions_eventDispatcher, actions_dispatchWorkerSupervisorFactory, actions_variableManager }) => {
|
|
61
|
+
const handlerFactory = new ActionsGraphQLHandlerFactory()
|
|
62
|
+
const eventsQueryResolver = new EventsQueryResolver()
|
|
63
|
+
const processBatchMutationResolver = new ProcessBatchMutationResolver(actions_eventDispatcher)
|
|
64
|
+
const variablesQueryResolver = new VariablesQueryResolver(actions_variableManager)
|
|
65
|
+
const setVariablesMutationResolver = new SetVariablesMutationResolver(actions_variableManager)
|
|
66
|
+
const resolversFactory = new ResolversFactory(
|
|
67
|
+
eventsQueryResolver,
|
|
68
|
+
processBatchMutationResolver,
|
|
69
|
+
variablesQueryResolver,
|
|
70
|
+
setVariablesMutationResolver,
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
const actionsContextResolver = new ActionsContextResolver(debugMode, projectContextResolver)
|
|
74
|
+
const actionsMiddlewareFactory = new ActionsApiMiddlewareFactory(actionsContextResolver, handlerFactory.create(resolversFactory))
|
|
75
|
+
const actionsWebsocketMiddlewareFactory = new ActionsWebsocketControllerFactory(debugMode, actionsContextResolver, actions_dispatchWorkerSupervisorFactory)
|
|
76
|
+
it.addRoute('actions', '/actions/:projectSlug', actionsMiddlewareFactory.create())
|
|
77
|
+
it.addWebsocketRoute('actions', '/actions/_worker', actionsWebsocketMiddlewareFactory.create())
|
|
78
|
+
})
|
|
79
|
+
.setupService('applicationWorkers', (it, { actions_dispatchWorkerSupervisorFactory, projectGroupContainer, serverConfig }) => {
|
|
80
|
+
if (!(serverConfig as any).projectGroup) {
|
|
81
|
+
it.registerWorker(this.name, actions_dispatchWorkerSupervisorFactory.create(projectGroupContainer))
|
|
82
|
+
}
|
|
83
|
+
}) as unknown as MasterContainerBuilder
|
|
84
|
+
|
|
85
|
+
}
|
|
86
|
+
return hook
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { MigrationBuilder } from '@contember/database-migrations'
|
|
2
|
+
|
|
3
|
+
const sql = `
|
|
4
|
+
CREATE TABLE actions_variable
|
|
5
|
+
(
|
|
6
|
+
id UUID PRIMARY KEY NOT NULL,
|
|
7
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
8
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
9
|
+
name TEXT NOT NULL UNIQUE,
|
|
10
|
+
value TEXT NOT NULL
|
|
11
|
+
)
|
|
12
|
+
`
|
|
13
|
+
|
|
14
|
+
export default async function (builder: MigrationBuilder) {
|
|
15
|
+
builder.sql(sql)
|
|
16
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import snapshot from './snapshot'
|
|
2
|
+
import { MigrationGroup } from '@contember/database-migrations'
|
|
3
|
+
import _20230310145000actionsvariables from './2023-03-10-145000-actions-variables'
|
|
4
|
+
|
|
5
|
+
export const migrationsGroup = new MigrationGroup(snapshot, {
|
|
6
|
+
'2023-03-10-145000-actions-variables': _20230310145000actionsvariables,
|
|
7
|
+
})
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { MigrationBuilder } from '@contember/database-migrations'
|
|
2
|
+
|
|
3
|
+
export default async function (builder: MigrationBuilder) {
|
|
4
|
+
builder.sql(`
|
|
5
|
+
CREATE TYPE ACTIONS_TRIGGER_STATE AS ENUM (
|
|
6
|
+
'created' ,
|
|
7
|
+
'retrying',
|
|
8
|
+
'processing',
|
|
9
|
+
'succeed',
|
|
10
|
+
'failed',
|
|
11
|
+
'stopped'
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
CREATE TABLE actions_event
|
|
15
|
+
(
|
|
16
|
+
id UUID PRIMARY KEY NOT NULL,
|
|
17
|
+
transaction_id UUID NOT NULL,
|
|
18
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
19
|
+
resolved_at TIMESTAMPTZ,
|
|
20
|
+
visible_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
21
|
+
num_retries INT NOT NULL,
|
|
22
|
+
state ACTIONS_TRIGGER_STATE NOT NULL DEFAULT 'created',
|
|
23
|
+
last_state_change TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
24
|
+
stage_id UUID NOT NULL
|
|
25
|
+
REFERENCES stage
|
|
26
|
+
ON DELETE CASCADE,
|
|
27
|
+
schema_id INTEGER NOT NULL
|
|
28
|
+
REFERENCES schema_migration,
|
|
29
|
+
target TEXT NOT NULL,
|
|
30
|
+
trigger TEXT NOT NULL,
|
|
31
|
+
priority INT NOT NULL DEFAULT 0,
|
|
32
|
+
payload JSONB NOT NULL,
|
|
33
|
+
log JSONB NOT NULL DEFAULT '[]'
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
CREATE INDEX ON actions_event (priority DESC, visible_at) WHERE state IN ('created', 'retrying', 'processing');
|
|
37
|
+
|
|
38
|
+
CREATE TABLE actions_variable
|
|
39
|
+
(
|
|
40
|
+
id UUID PRIMARY KEY NOT NULL,
|
|
41
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
42
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
43
|
+
name TEXT NOT NULL UNIQUE,
|
|
44
|
+
value TEXT NOT NULL
|
|
45
|
+
)
|
|
46
|
+
`)
|
|
47
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { DatabaseQuery, DatabaseQueryable, SelectBuilder } from '@contember/database'
|
|
2
|
+
import { EventRow } from './types'
|
|
3
|
+
import { EventArgs } from '../graphql/schema'
|
|
4
|
+
|
|
5
|
+
export class EventsInProcessingQuery extends DatabaseQuery<EventRow[]> {
|
|
6
|
+
constructor(
|
|
7
|
+
private readonly args: EventArgs,
|
|
8
|
+
) {
|
|
9
|
+
super()
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
async fetch(queryable: DatabaseQueryable): Promise<EventRow[]> {
|
|
13
|
+
return SelectBuilder.create<EventRow>()
|
|
14
|
+
.from('actions_event')
|
|
15
|
+
.select('*')
|
|
16
|
+
.where(it => it.in('state', ['processing']))
|
|
17
|
+
.orderBy('last_state_change', 'asc')
|
|
18
|
+
.limit(this.args.limit ?? 100, this.args.offset ?? 0)
|
|
19
|
+
.getResult(queryable.db)
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { DatabaseQuery, DatabaseQueryable, SelectBuilder } from '@contember/database'
|
|
2
|
+
import { EventRow } from './types'
|
|
3
|
+
import { EventArgs } from '../graphql/schema'
|
|
4
|
+
import { eventsToProcessSpecification } from './EventsToProcessSpecification'
|
|
5
|
+
|
|
6
|
+
export class EventsToProcessQuery extends DatabaseQuery<EventRow[]> {
|
|
7
|
+
constructor(
|
|
8
|
+
private readonly args: EventArgs,
|
|
9
|
+
) {
|
|
10
|
+
super()
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
async fetch(queryable: DatabaseQueryable): Promise<EventRow[]> {
|
|
14
|
+
return SelectBuilder.create<EventRow>()
|
|
15
|
+
.from('actions_event')
|
|
16
|
+
.select('*')
|
|
17
|
+
.match(eventsToProcessSpecification)
|
|
18
|
+
.limit(this.args.limit ?? 100, this.args.offset ?? 0)
|
|
19
|
+
.getResult(queryable.db)
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Operator, SelectBuilderSpecification } from '@contember/database'
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
export const eventsToProcessStateSpecification: SelectBuilderSpecification = qb => qb
|
|
5
|
+
.where(it => it.in('state', ['retrying', 'created', 'processing']))
|
|
6
|
+
|
|
7
|
+
export const eventsToProcessSpecification: SelectBuilderSpecification = qb => qb
|
|
8
|
+
.match(eventsToProcessStateSpecification)
|
|
9
|
+
.where(it => it.compare('visible_at', Operator.lte, 'now'))
|
|
10
|
+
.orderBy('priority', 'desc')
|
|
11
|
+
.orderBy('visible_at')
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { DatabaseQuery, DatabaseQueryable, SelectBuilder } from '@contember/database'
|
|
2
|
+
import { EventRow } from './types'
|
|
3
|
+
import { EventArgs } from '../graphql/schema'
|
|
4
|
+
|
|
5
|
+
export class FailedEventsQuery extends DatabaseQuery<EventRow[]> {
|
|
6
|
+
constructor(
|
|
7
|
+
private readonly args: EventArgs,
|
|
8
|
+
) {
|
|
9
|
+
super()
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
async fetch(queryable: DatabaseQueryable): Promise<EventRow[]> {
|
|
13
|
+
return SelectBuilder.create<EventRow>()
|
|
14
|
+
.from('actions_event')
|
|
15
|
+
.select('*')
|
|
16
|
+
.where(it => it.in('state', ['failed', 'retrying']))
|
|
17
|
+
.orderBy('last_state_change', 'desc')
|
|
18
|
+
.limit(this.args.limit ?? 100, this.args.offset ?? 0)
|
|
19
|
+
.getResult(queryable.db)
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Command } from '@contember/engine-system-api'
|
|
2
|
+
import { ConflictActionType, InsertBuilder, Literal } from '@contember/database'
|
|
3
|
+
|
|
4
|
+
export class SetVariableCommand implements Command<void> {
|
|
5
|
+
|
|
6
|
+
constructor(
|
|
7
|
+
private readonly name: string,
|
|
8
|
+
private readonly value: string,
|
|
9
|
+
) {
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
async execute({ providers, db }: Command.Args): Promise<void> {
|
|
13
|
+
await InsertBuilder.create()
|
|
14
|
+
.into('actions_variable')
|
|
15
|
+
.values({
|
|
16
|
+
id: providers.uuid(),
|
|
17
|
+
name: this.name,
|
|
18
|
+
value: this.value,
|
|
19
|
+
})
|
|
20
|
+
.onConflict(ConflictActionType.update, ['name'], {
|
|
21
|
+
value: this.value,
|
|
22
|
+
updated_at: new Literal('NOW()'),
|
|
23
|
+
})
|
|
24
|
+
.execute(db)
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { DatabaseContext } from '@contember/engine-system-api'
|
|
2
|
+
import { VariablesQuery } from './VariablesQuery'
|
|
3
|
+
import { SetVariablesArgs } from '../graphql/schema'
|
|
4
|
+
import { DeleteBuilder } from '@contember/database'
|
|
5
|
+
import { SetVariableCommand } from './SetVariableCommand'
|
|
6
|
+
|
|
7
|
+
export type VariablesMap = Record<string, string>
|
|
8
|
+
|
|
9
|
+
export class VariablesManager {
|
|
10
|
+
public async fetchVariables(db: DatabaseContext): Promise<VariablesMap> {
|
|
11
|
+
return Object.fromEntries((await db.queryHandler.fetch(new VariablesQuery())).map(it => [it.name, it.value]))
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
public async setVariables(db: DatabaseContext, args: SetVariablesArgs) {
|
|
15
|
+
return await db.transaction(async db => {
|
|
16
|
+
const current = await this.fetchVariables(db)
|
|
17
|
+
const mode = args.mode ?? 'MERGE'
|
|
18
|
+
const inputVariables = Object.fromEntries(args.variables.map(it => [it.name, it.value]))
|
|
19
|
+
|
|
20
|
+
let newVariables: VariablesMap = {}
|
|
21
|
+
switch (mode) {
|
|
22
|
+
case 'APPEND_ONLY_MISSING':
|
|
23
|
+
newVariables = { ...inputVariables, ...current }
|
|
24
|
+
break
|
|
25
|
+
case 'MERGE':
|
|
26
|
+
newVariables = { ...current, ...inputVariables }
|
|
27
|
+
break
|
|
28
|
+
case 'SET':
|
|
29
|
+
newVariables = inputVariables
|
|
30
|
+
break
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const toDelete = Object.keys(current).filter(it => !(it in newVariables))
|
|
34
|
+
if (toDelete.length > 0) {
|
|
35
|
+
await DeleteBuilder.create()
|
|
36
|
+
.from('actions_variable')
|
|
37
|
+
.where(it => it.in('name', toDelete))
|
|
38
|
+
.execute(db.client)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
for (const [name, value] of Object.entries(newVariables)) {
|
|
42
|
+
if (value === current[name]) {
|
|
43
|
+
continue
|
|
44
|
+
}
|
|
45
|
+
await db.commandBus.execute(new SetVariableCommand(name, value))
|
|
46
|
+
}
|
|
47
|
+
})
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { DatabaseQuery, DatabaseQueryable, SelectBuilder } from '@contember/database'
|
|
2
|
+
|
|
3
|
+
export class VariablesQuery extends DatabaseQuery<VariableRow[]> {
|
|
4
|
+
public async fetch(queryable: DatabaseQueryable): Promise<VariableRow[]> {
|
|
5
|
+
return await SelectBuilder.create<VariableRow>()
|
|
6
|
+
.from('actions_variable')
|
|
7
|
+
.getResult(queryable.db)
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export type VariableRow = {
|
|
12
|
+
id: string
|
|
13
|
+
name: string
|
|
14
|
+
value: string
|
|
15
|
+
created_at: Date
|
|
16
|
+
updated_at: Date
|
|
17
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type EventRow = {
|
|
2
|
+
id: string
|
|
3
|
+
transaction_id: string
|
|
4
|
+
created_at: Date
|
|
5
|
+
resolved_at: Date | null
|
|
6
|
+
visible_at: Date
|
|
7
|
+
num_retries: number
|
|
8
|
+
state: 'created' | 'retrying' | 'processing' | 'succeed' | 'failed' | 'stopped'
|
|
9
|
+
last_state_change: Date
|
|
10
|
+
stage_id: number
|
|
11
|
+
schema_id: string
|
|
12
|
+
target: string
|
|
13
|
+
payload: any
|
|
14
|
+
log: any[]
|
|
15
|
+
}
|