@contember/engine-actions 2.1.0-alpha.9 → 2.1.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +47 -0
- package/dist/development/index.cjs +54 -24
- package/dist/development/index.cjs.map +1 -1
- package/dist/development/index.js +54 -24
- package/dist/development/index.js.map +1 -1
- package/dist/development/src/ActionsExecutionContainerHookFactory.cjs +24 -11
- package/dist/development/src/ActionsExecutionContainerHookFactory.cjs.map +1 -1
- package/dist/development/src/ActionsExecutionContainerHookFactory.js +24 -11
- package/dist/development/src/ActionsExecutionContainerHookFactory.js.map +1 -1
- package/dist/development/src/ListenerStoreProvider.cjs.map +1 -1
- package/dist/development/src/ListenerStoreProvider.js.map +1 -1
- package/dist/development/src/authorization/ActionsAuthorizationActions.cjs +2 -0
- package/dist/development/src/authorization/ActionsAuthorizationActions.cjs.map +1 -1
- package/dist/development/src/authorization/ActionsAuthorizationActions.js +2 -0
- package/dist/development/src/authorization/ActionsAuthorizationActions.js.map +1 -1
- package/dist/development/src/authorization/ActionsPermissionsFactory.cjs.map +1 -1
- package/dist/development/src/authorization/ActionsPermissionsFactory.js.map +1 -1
- package/dist/development/src/dispatch/DispatchWorkerSupervisor.cjs +16 -14
- package/dist/development/src/dispatch/DispatchWorkerSupervisor.cjs.map +1 -1
- package/dist/development/src/dispatch/DispatchWorkerSupervisor.js +16 -14
- package/dist/development/src/dispatch/DispatchWorkerSupervisor.js.map +1 -1
- package/dist/development/src/dispatch/EventDispatcher.cjs.map +1 -1
- package/dist/development/src/dispatch/EventDispatcher.js.map +1 -1
- package/dist/development/src/dispatch/EventsRepository.cjs +33 -15
- package/dist/development/src/dispatch/EventsRepository.cjs.map +1 -1
- package/dist/development/src/dispatch/EventsRepository.js +33 -15
- package/dist/development/src/dispatch/EventsRepository.js.map +1 -1
- package/dist/development/src/dispatch/LazyDispatchWorker.cjs +67 -0
- package/dist/development/src/dispatch/LazyDispatchWorker.cjs.map +1 -0
- package/dist/development/src/dispatch/LazyDispatchWorker.js +67 -0
- package/dist/development/src/dispatch/LazyDispatchWorker.js.map +1 -0
- package/dist/development/src/dispatch/ProjectDispatcher.cjs +3 -3
- package/dist/development/src/dispatch/ProjectDispatcher.cjs.map +1 -1
- package/dist/development/src/dispatch/ProjectDispatcher.js +2 -2
- package/dist/development/src/dispatch/ProjectDispatcher.js.map +1 -1
- package/dist/development/src/dispatch/TargetHandlerResolver.cjs.map +1 -1
- package/dist/development/src/dispatch/TargetHandlerResolver.js.map +1 -1
- package/dist/development/src/dispatch/WebhookFetcher.cjs.map +1 -1
- package/dist/development/src/dispatch/WebhookFetcher.js.map +1 -1
- package/dist/development/src/dispatch/WebhookTargetHandler.cjs +6 -1
- package/dist/development/src/dispatch/WebhookTargetHandler.cjs.map +1 -1
- package/dist/development/src/dispatch/WebhookTargetHandler.js +6 -1
- package/dist/development/src/dispatch/WebhookTargetHandler.js.map +1 -1
- package/dist/development/src/graphql/http/ActionsApiMiddlewareFactory.cjs +1 -0
- package/dist/development/src/graphql/http/ActionsApiMiddlewareFactory.cjs.map +1 -1
- package/dist/development/src/graphql/http/ActionsApiMiddlewareFactory.js +1 -0
- package/dist/development/src/graphql/http/ActionsApiMiddlewareFactory.js.map +1 -1
- package/dist/development/src/graphql/http/ActionsContextResolver.cjs +8 -11
- package/dist/development/src/graphql/http/ActionsContextResolver.cjs.map +1 -1
- package/dist/development/src/graphql/http/ActionsContextResolver.js +8 -11
- package/dist/development/src/graphql/http/ActionsContextResolver.js.map +1 -1
- package/dist/development/src/graphql/http/ActionsGraphQLHandlerFactory.cjs.map +1 -1
- package/dist/development/src/graphql/http/ActionsGraphQLHandlerFactory.js.map +1 -1
- package/dist/development/src/graphql/http/ActionsWebsocketControllerFactory.cjs +6 -3
- package/dist/development/src/graphql/http/ActionsWebsocketControllerFactory.cjs.map +1 -1
- package/dist/development/src/graphql/http/ActionsWebsocketControllerFactory.js +6 -3
- package/dist/development/src/graphql/http/ActionsWebsocketControllerFactory.js.map +1 -1
- package/dist/development/src/graphql/resolvers/ResolversFactory.cjs +7 -2
- package/dist/development/src/graphql/resolvers/ResolversFactory.cjs.map +1 -1
- package/dist/development/src/graphql/resolvers/ResolversFactory.js +8 -3
- package/dist/development/src/graphql/resolvers/ResolversFactory.js.map +1 -1
- package/dist/development/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.cjs.map +1 -1
- package/dist/development/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.js.map +1 -1
- package/dist/development/src/graphql/resolvers/mutation/RetryEventMutationResolver.cjs +21 -0
- package/dist/development/src/graphql/resolvers/mutation/RetryEventMutationResolver.cjs.map +1 -0
- package/dist/development/src/graphql/resolvers/mutation/RetryEventMutationResolver.js +21 -0
- package/dist/development/src/graphql/resolvers/mutation/RetryEventMutationResolver.js.map +1 -0
- package/dist/development/src/graphql/resolvers/mutation/SetVariablesMutationResolver.cjs.map +1 -1
- package/dist/development/src/graphql/resolvers/mutation/SetVariablesMutationResolver.js.map +1 -1
- package/dist/development/src/graphql/resolvers/mutation/StopEventMutationResolver.cjs +19 -0
- package/dist/development/src/graphql/resolvers/mutation/StopEventMutationResolver.cjs.map +1 -0
- package/dist/development/src/graphql/resolvers/mutation/StopEventMutationResolver.js +19 -0
- package/dist/development/src/graphql/resolvers/mutation/StopEventMutationResolver.js.map +1 -0
- package/dist/development/src/graphql/resolvers/query/EventsQueryResolver.cjs +14 -1
- package/dist/development/src/graphql/resolvers/query/EventsQueryResolver.cjs.map +1 -1
- package/dist/development/src/graphql/resolvers/query/EventsQueryResolver.js +14 -1
- package/dist/development/src/graphql/resolvers/query/EventsQueryResolver.js.map +1 -1
- package/dist/development/src/graphql/resolvers/query/VariablesQueryResolver.cjs.map +1 -1
- package/dist/development/src/graphql/resolvers/query/VariablesQueryResolver.js.map +1 -1
- package/dist/development/src/graphql/schema/actions.graphql.cjs +18 -4
- package/dist/development/src/graphql/schema/actions.graphql.cjs.map +1 -1
- package/dist/development/src/graphql/schema/actions.graphql.js +18 -4
- package/dist/development/src/graphql/schema/actions.graphql.js.map +1 -1
- package/dist/development/src/migrations/2023-03-10-145000-actions-variables.cjs.map +1 -1
- package/dist/development/src/migrations/2023-03-10-145000-actions-variables.js.map +1 -1
- package/dist/development/src/migrations/2025-05-28-160000-action-event-user.cjs +16 -0
- package/dist/development/src/migrations/2025-05-28-160000-action-event-user.cjs.map +1 -0
- package/dist/development/src/migrations/2025-05-28-160000-action-event-user.js +17 -0
- package/dist/development/src/migrations/2025-05-28-160000-action-event-user.js.map +1 -0
- package/dist/development/src/migrations/index.cjs +3 -1
- package/dist/development/src/migrations/index.cjs.map +1 -1
- package/dist/development/src/migrations/index.js +3 -1
- package/dist/development/src/migrations/index.js.map +1 -1
- package/dist/development/src/migrations/snapshot.cjs +5 -2
- package/dist/development/src/migrations/snapshot.cjs.map +1 -1
- package/dist/development/src/migrations/snapshot.js +5 -2
- package/dist/development/src/migrations/snapshot.js.map +1 -1
- package/dist/development/src/model/EventByIdQuery.cjs +17 -0
- package/dist/development/src/model/EventByIdQuery.cjs.map +1 -0
- package/dist/development/src/model/EventByIdQuery.js +17 -0
- package/dist/development/src/model/EventByIdQuery.js.map +1 -0
- package/dist/development/src/model/EventsInProcessingQuery.cjs.map +1 -1
- package/dist/development/src/model/EventsInProcessingQuery.js.map +1 -1
- package/dist/development/src/model/EventsToProcessQuery.cjs.map +1 -1
- package/dist/development/src/model/EventsToProcessQuery.js.map +1 -1
- package/dist/development/src/model/EventsToProcessSpecification.cjs.map +1 -1
- package/dist/development/src/model/EventsToProcessSpecification.js.map +1 -1
- package/dist/development/src/model/FailedEventsQuery.cjs.map +1 -1
- package/dist/development/src/model/FailedEventsQuery.js.map +1 -1
- package/dist/development/src/model/SetVariableCommand.cjs.map +1 -1
- package/dist/development/src/model/SetVariableCommand.js.map +1 -1
- package/dist/development/src/model/VariablesManager.cjs.map +1 -1
- package/dist/development/src/model/VariablesManager.js.map +1 -1
- package/dist/development/src/model/VariablesQuery.cjs.map +1 -1
- package/dist/development/src/model/VariablesQuery.js.map +1 -1
- package/dist/development/src/triggers/TriggerHandler.cjs +17 -14
- package/dist/development/src/triggers/TriggerHandler.cjs.map +1 -1
- package/dist/development/src/triggers/TriggerHandler.js +17 -14
- package/dist/development/src/triggers/TriggerHandler.js.map +1 -1
- package/dist/development/src/triggers/TriggerIndirectChangesFetcher.cjs +44 -2
- package/dist/development/src/triggers/TriggerIndirectChangesFetcher.cjs.map +1 -1
- package/dist/development/src/triggers/TriggerIndirectChangesFetcher.js +44 -2
- package/dist/development/src/triggers/TriggerIndirectChangesFetcher.js.map +1 -1
- package/dist/development/src/triggers/TriggerListenersBuilder.cjs.map +1 -1
- package/dist/development/src/triggers/TriggerListenersBuilder.js.map +1 -1
- package/dist/development/src/triggers/TriggerListenersFactory.cjs.map +1 -1
- package/dist/development/src/triggers/TriggerListenersFactory.js.map +1 -1
- package/dist/development/src/triggers/TriggerListenersStore.cjs.map +1 -1
- package/dist/development/src/triggers/TriggerListenersStore.js.map +1 -1
- package/dist/development/src/triggers/TriggerPayloadBuilder.cjs +45 -16
- package/dist/development/src/triggers/TriggerPayloadBuilder.cjs.map +1 -1
- package/dist/development/src/triggers/TriggerPayloadBuilder.js +45 -16
- package/dist/development/src/triggers/TriggerPayloadBuilder.js.map +1 -1
- package/dist/development/src/triggers/TriggerPayloadManager.cjs.map +1 -1
- package/dist/development/src/triggers/TriggerPayloadManager.js.map +1 -1
- package/dist/development/src/triggers/TriggerPayloadPersister.cjs +36 -20
- package/dist/development/src/triggers/TriggerPayloadPersister.cjs.map +1 -1
- package/dist/development/src/triggers/TriggerPayloadPersister.js +36 -20
- package/dist/development/src/triggers/TriggerPayloadPersister.js.map +1 -1
- package/dist/development/src/utils/assertNever.cjs.map +1 -1
- package/dist/development/src/utils/assertNever.js.map +1 -1
- package/dist/development/src/utils/map.cjs.map +1 -1
- package/dist/development/src/utils/map.js.map +1 -1
- package/dist/development/src/utils/notifyChannel.cjs +9 -0
- package/dist/development/src/utils/notifyChannel.cjs.map +1 -0
- package/dist/development/src/utils/notifyChannel.js +9 -0
- package/dist/development/src/utils/notifyChannel.js.map +1 -0
- package/dist/production/index.cjs +54 -24
- package/dist/production/index.cjs.map +1 -1
- package/dist/production/index.js +54 -24
- package/dist/production/index.js.map +1 -1
- package/dist/production/src/ActionsExecutionContainerHookFactory.cjs +24 -11
- package/dist/production/src/ActionsExecutionContainerHookFactory.cjs.map +1 -1
- package/dist/production/src/ActionsExecutionContainerHookFactory.js +24 -11
- package/dist/production/src/ActionsExecutionContainerHookFactory.js.map +1 -1
- package/dist/production/src/ListenerStoreProvider.cjs.map +1 -1
- package/dist/production/src/ListenerStoreProvider.js.map +1 -1
- package/dist/production/src/authorization/ActionsAuthorizationActions.cjs +2 -0
- package/dist/production/src/authorization/ActionsAuthorizationActions.cjs.map +1 -1
- package/dist/production/src/authorization/ActionsAuthorizationActions.js +2 -0
- package/dist/production/src/authorization/ActionsAuthorizationActions.js.map +1 -1
- package/dist/production/src/authorization/ActionsPermissionsFactory.cjs.map +1 -1
- package/dist/production/src/authorization/ActionsPermissionsFactory.js.map +1 -1
- package/dist/production/src/dispatch/DispatchWorkerSupervisor.cjs +16 -14
- package/dist/production/src/dispatch/DispatchWorkerSupervisor.cjs.map +1 -1
- package/dist/production/src/dispatch/DispatchWorkerSupervisor.js +16 -14
- package/dist/production/src/dispatch/DispatchWorkerSupervisor.js.map +1 -1
- package/dist/production/src/dispatch/EventDispatcher.cjs.map +1 -1
- package/dist/production/src/dispatch/EventDispatcher.js.map +1 -1
- package/dist/production/src/dispatch/EventsRepository.cjs +33 -15
- package/dist/production/src/dispatch/EventsRepository.cjs.map +1 -1
- package/dist/production/src/dispatch/EventsRepository.js +33 -15
- package/dist/production/src/dispatch/EventsRepository.js.map +1 -1
- package/dist/production/src/dispatch/LazyDispatchWorker.cjs +67 -0
- package/dist/production/src/dispatch/LazyDispatchWorker.cjs.map +1 -0
- package/dist/production/src/dispatch/LazyDispatchWorker.js +67 -0
- package/dist/production/src/dispatch/LazyDispatchWorker.js.map +1 -0
- package/dist/production/src/dispatch/ProjectDispatcher.cjs +3 -3
- package/dist/production/src/dispatch/ProjectDispatcher.cjs.map +1 -1
- package/dist/production/src/dispatch/ProjectDispatcher.js +2 -2
- package/dist/production/src/dispatch/ProjectDispatcher.js.map +1 -1
- package/dist/production/src/dispatch/TargetHandlerResolver.cjs.map +1 -1
- package/dist/production/src/dispatch/TargetHandlerResolver.js.map +1 -1
- package/dist/production/src/dispatch/WebhookFetcher.cjs.map +1 -1
- package/dist/production/src/dispatch/WebhookFetcher.js.map +1 -1
- package/dist/production/src/dispatch/WebhookTargetHandler.cjs +6 -1
- package/dist/production/src/dispatch/WebhookTargetHandler.cjs.map +1 -1
- package/dist/production/src/dispatch/WebhookTargetHandler.js +6 -1
- package/dist/production/src/dispatch/WebhookTargetHandler.js.map +1 -1
- package/dist/production/src/graphql/http/ActionsApiMiddlewareFactory.cjs +1 -0
- package/dist/production/src/graphql/http/ActionsApiMiddlewareFactory.cjs.map +1 -1
- package/dist/production/src/graphql/http/ActionsApiMiddlewareFactory.js +1 -0
- package/dist/production/src/graphql/http/ActionsApiMiddlewareFactory.js.map +1 -1
- package/dist/production/src/graphql/http/ActionsContextResolver.cjs +8 -11
- package/dist/production/src/graphql/http/ActionsContextResolver.cjs.map +1 -1
- package/dist/production/src/graphql/http/ActionsContextResolver.js +8 -11
- package/dist/production/src/graphql/http/ActionsContextResolver.js.map +1 -1
- package/dist/production/src/graphql/http/ActionsGraphQLHandlerFactory.cjs.map +1 -1
- package/dist/production/src/graphql/http/ActionsGraphQLHandlerFactory.js.map +1 -1
- package/dist/production/src/graphql/http/ActionsWebsocketControllerFactory.cjs +6 -3
- package/dist/production/src/graphql/http/ActionsWebsocketControllerFactory.cjs.map +1 -1
- package/dist/production/src/graphql/http/ActionsWebsocketControllerFactory.js +6 -3
- package/dist/production/src/graphql/http/ActionsWebsocketControllerFactory.js.map +1 -1
- package/dist/production/src/graphql/resolvers/ResolversFactory.cjs +7 -2
- package/dist/production/src/graphql/resolvers/ResolversFactory.cjs.map +1 -1
- package/dist/production/src/graphql/resolvers/ResolversFactory.js +8 -3
- package/dist/production/src/graphql/resolvers/ResolversFactory.js.map +1 -1
- package/dist/production/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.cjs.map +1 -1
- package/dist/production/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.js.map +1 -1
- package/dist/production/src/graphql/resolvers/mutation/RetryEventMutationResolver.cjs +21 -0
- package/dist/production/src/graphql/resolvers/mutation/RetryEventMutationResolver.cjs.map +1 -0
- package/dist/production/src/graphql/resolvers/mutation/RetryEventMutationResolver.js +21 -0
- package/dist/production/src/graphql/resolvers/mutation/RetryEventMutationResolver.js.map +1 -0
- package/dist/production/src/graphql/resolvers/mutation/SetVariablesMutationResolver.cjs.map +1 -1
- package/dist/production/src/graphql/resolvers/mutation/SetVariablesMutationResolver.js.map +1 -1
- package/dist/production/src/graphql/resolvers/mutation/StopEventMutationResolver.cjs +19 -0
- package/dist/production/src/graphql/resolvers/mutation/StopEventMutationResolver.cjs.map +1 -0
- package/dist/production/src/graphql/resolvers/mutation/StopEventMutationResolver.js +19 -0
- package/dist/production/src/graphql/resolvers/mutation/StopEventMutationResolver.js.map +1 -0
- package/dist/production/src/graphql/resolvers/query/EventsQueryResolver.cjs +14 -1
- package/dist/production/src/graphql/resolvers/query/EventsQueryResolver.cjs.map +1 -1
- package/dist/production/src/graphql/resolvers/query/EventsQueryResolver.js +14 -1
- package/dist/production/src/graphql/resolvers/query/EventsQueryResolver.js.map +1 -1
- package/dist/production/src/graphql/resolvers/query/VariablesQueryResolver.cjs.map +1 -1
- package/dist/production/src/graphql/resolvers/query/VariablesQueryResolver.js.map +1 -1
- package/dist/production/src/graphql/schema/actions.graphql.cjs +18 -4
- package/dist/production/src/graphql/schema/actions.graphql.cjs.map +1 -1
- package/dist/production/src/graphql/schema/actions.graphql.js +18 -4
- package/dist/production/src/graphql/schema/actions.graphql.js.map +1 -1
- package/dist/production/src/migrations/2023-03-10-145000-actions-variables.cjs.map +1 -1
- package/dist/production/src/migrations/2023-03-10-145000-actions-variables.js.map +1 -1
- package/dist/production/src/migrations/2025-05-28-160000-action-event-user.cjs +16 -0
- package/dist/production/src/migrations/2025-05-28-160000-action-event-user.cjs.map +1 -0
- package/dist/production/src/migrations/2025-05-28-160000-action-event-user.js +17 -0
- package/dist/production/src/migrations/2025-05-28-160000-action-event-user.js.map +1 -0
- package/dist/production/src/migrations/index.cjs +3 -1
- package/dist/production/src/migrations/index.cjs.map +1 -1
- package/dist/production/src/migrations/index.js +3 -1
- package/dist/production/src/migrations/index.js.map +1 -1
- package/dist/production/src/migrations/snapshot.cjs +5 -2
- package/dist/production/src/migrations/snapshot.cjs.map +1 -1
- package/dist/production/src/migrations/snapshot.js +5 -2
- package/dist/production/src/migrations/snapshot.js.map +1 -1
- package/dist/production/src/model/EventByIdQuery.cjs +17 -0
- package/dist/production/src/model/EventByIdQuery.cjs.map +1 -0
- package/dist/production/src/model/EventByIdQuery.js +17 -0
- package/dist/production/src/model/EventByIdQuery.js.map +1 -0
- package/dist/production/src/model/EventsInProcessingQuery.cjs.map +1 -1
- package/dist/production/src/model/EventsInProcessingQuery.js.map +1 -1
- package/dist/production/src/model/EventsToProcessQuery.cjs.map +1 -1
- package/dist/production/src/model/EventsToProcessQuery.js.map +1 -1
- package/dist/production/src/model/EventsToProcessSpecification.cjs.map +1 -1
- package/dist/production/src/model/EventsToProcessSpecification.js.map +1 -1
- package/dist/production/src/model/FailedEventsQuery.cjs.map +1 -1
- package/dist/production/src/model/FailedEventsQuery.js.map +1 -1
- package/dist/production/src/model/SetVariableCommand.cjs.map +1 -1
- package/dist/production/src/model/SetVariableCommand.js.map +1 -1
- package/dist/production/src/model/VariablesManager.cjs.map +1 -1
- package/dist/production/src/model/VariablesManager.js.map +1 -1
- package/dist/production/src/model/VariablesQuery.cjs.map +1 -1
- package/dist/production/src/model/VariablesQuery.js.map +1 -1
- package/dist/production/src/triggers/TriggerHandler.cjs +17 -14
- package/dist/production/src/triggers/TriggerHandler.cjs.map +1 -1
- package/dist/production/src/triggers/TriggerHandler.js +17 -14
- package/dist/production/src/triggers/TriggerHandler.js.map +1 -1
- package/dist/production/src/triggers/TriggerIndirectChangesFetcher.cjs +44 -2
- package/dist/production/src/triggers/TriggerIndirectChangesFetcher.cjs.map +1 -1
- package/dist/production/src/triggers/TriggerIndirectChangesFetcher.js +44 -2
- package/dist/production/src/triggers/TriggerIndirectChangesFetcher.js.map +1 -1
- package/dist/production/src/triggers/TriggerListenersBuilder.cjs.map +1 -1
- package/dist/production/src/triggers/TriggerListenersBuilder.js.map +1 -1
- package/dist/production/src/triggers/TriggerListenersFactory.cjs.map +1 -1
- package/dist/production/src/triggers/TriggerListenersFactory.js.map +1 -1
- package/dist/production/src/triggers/TriggerListenersStore.cjs.map +1 -1
- package/dist/production/src/triggers/TriggerListenersStore.js.map +1 -1
- package/dist/production/src/triggers/TriggerPayloadBuilder.cjs +45 -16
- package/dist/production/src/triggers/TriggerPayloadBuilder.cjs.map +1 -1
- package/dist/production/src/triggers/TriggerPayloadBuilder.js +45 -16
- package/dist/production/src/triggers/TriggerPayloadBuilder.js.map +1 -1
- package/dist/production/src/triggers/TriggerPayloadManager.cjs.map +1 -1
- package/dist/production/src/triggers/TriggerPayloadManager.js.map +1 -1
- package/dist/production/src/triggers/TriggerPayloadPersister.cjs +36 -20
- package/dist/production/src/triggers/TriggerPayloadPersister.cjs.map +1 -1
- package/dist/production/src/triggers/TriggerPayloadPersister.js +36 -20
- package/dist/production/src/triggers/TriggerPayloadPersister.js.map +1 -1
- package/dist/production/src/utils/assertNever.cjs.map +1 -1
- package/dist/production/src/utils/assertNever.js.map +1 -1
- package/dist/production/src/utils/map.cjs.map +1 -1
- package/dist/production/src/utils/map.js.map +1 -1
- package/dist/production/src/utils/notifyChannel.cjs +9 -0
- package/dist/production/src/utils/notifyChannel.cjs.map +1 -0
- package/dist/production/src/utils/notifyChannel.js +9 -0
- package/dist/production/src/utils/notifyChannel.js.map +1 -0
- package/dist/tests/cases/unit/lazyDispatchWorker.test.d.ts +2 -0
- package/dist/tests/cases/unit/lazyDispatchWorker.test.d.ts.map +1 -0
- package/dist/tests/tsconfig.tsbuildinfo +1 -1
- package/dist/types/ActionsExecutionContainerHookFactory.d.ts.map +1 -1
- package/dist/types/authorization/ActionsAuthorizationActions.d.ts +10 -0
- package/dist/types/authorization/ActionsAuthorizationActions.d.ts.map +1 -1
- package/dist/types/dispatch/DispatchWorkerSupervisor.d.ts.map +1 -1
- package/dist/types/dispatch/EventDispatcher.d.ts.map +1 -1
- package/dist/types/dispatch/EventsRepository.d.ts +2 -1
- package/dist/types/dispatch/EventsRepository.d.ts.map +1 -1
- package/dist/types/dispatch/LazyDispatchWorker.d.ts +11 -0
- package/dist/types/dispatch/LazyDispatchWorker.d.ts.map +1 -0
- package/dist/types/dispatch/ProjectDispatcher.d.ts.map +1 -1
- package/dist/types/dispatch/WebhookTargetHandler.d.ts.map +1 -1
- package/dist/types/dispatch/types.d.ts +1 -1
- package/dist/types/dispatch/types.d.ts.map +1 -1
- package/dist/types/graphql/http/ActionsApiMiddlewareFactory.d.ts.map +1 -1
- package/dist/types/graphql/http/ActionsContextResolver.d.ts.map +1 -1
- package/dist/types/graphql/http/ActionsGraphQLHandlerFactory.d.ts.map +1 -1
- package/dist/types/graphql/http/ActionsWebsocketControllerFactory.d.ts.map +1 -1
- package/dist/types/graphql/resolvers/ActionsContext.d.ts +3 -0
- package/dist/types/graphql/resolvers/ActionsContext.d.ts.map +1 -1
- package/dist/types/graphql/resolvers/ResolversFactory.d.ts +4 -2
- package/dist/types/graphql/resolvers/ResolversFactory.d.ts.map +1 -1
- package/dist/types/graphql/resolvers/mutation/RetryEventMutationResolver.d.ts +11 -0
- package/dist/types/graphql/resolvers/mutation/RetryEventMutationResolver.d.ts.map +1 -0
- package/dist/types/graphql/resolvers/mutation/SetVariablesMutationResolver.d.ts.map +1 -1
- package/dist/types/graphql/resolvers/mutation/StopEventMutationResolver.d.ts +11 -0
- package/dist/types/graphql/resolvers/mutation/StopEventMutationResolver.d.ts.map +1 -0
- package/dist/types/graphql/resolvers/mutation/index.d.ts +2 -0
- package/dist/types/graphql/resolvers/mutation/index.d.ts.map +1 -1
- package/dist/types/graphql/resolvers/query/EventsQueryResolver.d.ts +3 -0
- package/dist/types/graphql/resolvers/query/EventsQueryResolver.d.ts.map +1 -1
- package/dist/types/graphql/resolvers/query/VariablesQueryResolver.d.ts.map +1 -1
- package/dist/types/graphql/schema/actions.graphql.d.ts.map +1 -1
- package/dist/types/graphql/schema/index.d.ts +45 -2
- package/dist/types/graphql/schema/index.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/migrations/2023-03-10-145000-actions-variables.d.ts.map +1 -1
- package/dist/types/migrations/2025-05-28-160000-action-event-user.d.ts +3 -0
- package/dist/types/migrations/2025-05-28-160000-action-event-user.d.ts.map +1 -0
- package/dist/types/migrations/index.d.ts.map +1 -1
- package/dist/types/migrations/snapshot.d.ts.map +1 -1
- package/dist/types/model/EventByIdQuery.d.ts +8 -0
- package/dist/types/model/EventByIdQuery.d.ts.map +1 -0
- package/dist/types/model/EventsToProcessSpecification.d.ts.map +1 -1
- package/dist/types/model/SetVariableCommand.d.ts.map +1 -1
- package/dist/types/model/types.d.ts +3 -0
- package/dist/types/model/types.d.ts.map +1 -1
- package/dist/types/triggers/TriggerHandler.d.ts.map +1 -1
- package/dist/types/triggers/TriggerIndirectChangesFetcher.d.ts +11 -3
- package/dist/types/triggers/TriggerIndirectChangesFetcher.d.ts.map +1 -1
- package/dist/types/triggers/TriggerListeners.d.ts.map +1 -1
- package/dist/types/triggers/TriggerListenersBuilder.d.ts.map +1 -1
- package/dist/types/triggers/TriggerListenersStore.d.ts +2 -2
- package/dist/types/triggers/TriggerListenersStore.d.ts.map +1 -1
- package/dist/types/triggers/TriggerPayloadBuilder.d.ts.map +1 -1
- package/dist/types/triggers/TriggerPayloadManager.d.ts +2 -1
- package/dist/types/triggers/TriggerPayloadManager.d.ts.map +1 -1
- package/dist/types/triggers/TriggerPayloadPersister.d.ts +9 -4
- package/dist/types/triggers/TriggerPayloadPersister.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/dist/types/utils/notifyChannel.d.ts +4 -0
- package/dist/types/utils/notifyChannel.d.ts.map +1 -0
- package/graphql.codegen.yml +2 -2
- package/package.json +26 -21
- package/src/ActionsExecutionContainerHookFactory.ts +27 -11
- package/src/authorization/ActionsAuthorizationActions.ts +2 -0
- package/src/dispatch/DispatchWorkerSupervisor.ts +17 -16
- package/src/dispatch/EventDispatcher.ts +0 -2
- package/src/dispatch/EventsRepository.ts +63 -43
- package/src/dispatch/LazyDispatchWorker.ts +72 -0
- package/src/dispatch/ProjectDispatcher.ts +6 -11
- package/src/dispatch/WebhookTargetHandler.ts +18 -9
- package/src/dispatch/types.ts +1 -2
- package/src/graphql/http/ActionsApiMiddlewareFactory.ts +7 -5
- package/src/graphql/http/ActionsContextResolver.ts +1 -2
- package/src/graphql/http/ActionsGraphQLHandlerFactory.ts +0 -1
- package/src/graphql/http/ActionsWebsocketControllerFactory.ts +7 -5
- package/src/graphql/resolvers/ActionsContext.ts +1 -0
- package/src/graphql/resolvers/ResolversFactory.ts +9 -2
- package/src/graphql/resolvers/mutation/RetryEventMutationResolver.ts +22 -0
- package/src/graphql/resolvers/mutation/SetVariablesMutationResolver.ts +0 -1
- package/src/graphql/resolvers/mutation/StopEventMutationResolver.ts +19 -0
- package/src/graphql/resolvers/mutation/index.ts +2 -0
- package/src/graphql/resolvers/query/EventsQueryResolver.ts +15 -8
- package/src/graphql/resolvers/query/VariablesQueryResolver.ts +0 -1
- package/src/graphql/schema/actions.graphql.ts +18 -4
- package/src/graphql/schema/index.ts +84 -30
- package/src/index.ts +66 -35
- package/src/migrations/2023-03-10-145000-actions-variables.ts +1 -1
- package/src/migrations/2025-05-28-160000-action-event-user.ts +16 -0
- package/src/migrations/index.ts +2 -0
- package/src/migrations/snapshot.ts +6 -3
- package/src/model/EventByIdQuery.ts +21 -0
- package/src/model/EventsToProcessSpecification.ts +9 -8
- package/src/model/SetVariableCommand.ts +0 -1
- package/src/model/types.ts +3 -0
- package/src/triggers/TriggerHandler.ts +16 -15
- package/src/triggers/TriggerIndirectChangesFetcher.ts +62 -3
- package/src/triggers/TriggerListeners.ts +1 -8
- package/src/triggers/TriggerListenersBuilder.ts +3 -6
- package/src/triggers/TriggerListenersStore.ts +2 -2
- package/src/triggers/TriggerPayloadBuilder.ts +43 -13
- package/src/triggers/TriggerPayloadManager.ts +2 -4
- package/src/triggers/TriggerPayloadPersister.ts +28 -10
- package/src/utils/notifyChannel.ts +6 -0
- package/tests/cases/unit/generator.test.ts +133 -136
- package/tests/cases/unit/lazyDispatchWorker.test.ts +226 -0
- package/tests/cases/unit/webhookHandler.test.ts +47 -35
- package/vitest.config.ts +0 -3
package/src/index.ts
CHANGED
|
@@ -7,7 +7,13 @@ import { MasterContainerBuilder, MasterContainerHook } from '@contember/engine-h
|
|
|
7
7
|
import { ActionsApiMiddlewareFactory } from './graphql/http/ActionsApiMiddlewareFactory'
|
|
8
8
|
import { ActionsGraphQLHandlerFactory } from './graphql/http/ActionsGraphQLHandlerFactory'
|
|
9
9
|
import { ResolversFactory } from './graphql/resolvers/ResolversFactory'
|
|
10
|
-
import {
|
|
10
|
+
import {
|
|
11
|
+
EventsQueryResolver,
|
|
12
|
+
ProcessBatchMutationResolver,
|
|
13
|
+
RetryEventMutationResolver,
|
|
14
|
+
SetVariablesMutationResolver,
|
|
15
|
+
StopEventMutationResolver,
|
|
16
|
+
} from './graphql/resolvers'
|
|
11
17
|
import { EventDispatcher } from './dispatch/EventDispatcher'
|
|
12
18
|
import { EventsRepository } from './dispatch/EventsRepository'
|
|
13
19
|
import { TargetHandlerResolver } from './dispatch/TargetHandlerResolver'
|
|
@@ -15,6 +21,7 @@ import { WebhookTargetHandler } from './dispatch/WebhookTargetHandler'
|
|
|
15
21
|
import { ActionsContextResolver } from './graphql/http/ActionsContextResolver'
|
|
16
22
|
import { ActionsWebsocketControllerFactory } from './graphql/http/ActionsWebsocketControllerFactory'
|
|
17
23
|
import { DispatchWorkerSupervisorFactory } from './dispatch/DispatchWorkerSupervisor'
|
|
24
|
+
import { LazyDispatchWorker } from './dispatch/LazyDispatchWorker'
|
|
18
25
|
import { ProjectDispatcherFactory } from './dispatch/ProjectDispatcher'
|
|
19
26
|
import { VariablesQueryResolver } from './graphql/resolvers/query/VariablesQueryResolver'
|
|
20
27
|
import { VariablesManager } from './model/VariablesManager'
|
|
@@ -22,13 +29,7 @@ import { AccessEvaluator, Authorizator } from '@contember/authorization'
|
|
|
22
29
|
import { ActionsPermissionsFactory } from './authorization'
|
|
23
30
|
import { WebhookFetcherNative } from './dispatch/WebhookFetcher'
|
|
24
31
|
|
|
25
|
-
export {
|
|
26
|
-
TriggerListenersFactory,
|
|
27
|
-
TriggerListenersStore,
|
|
28
|
-
TriggerHandler,
|
|
29
|
-
TriggerPayloadManager,
|
|
30
|
-
TriggerIndirectChangesFetcher,
|
|
31
|
-
} from './triggers'
|
|
32
|
+
export { TriggerHandler, TriggerIndirectChangesFetcher, TriggerListenersFactory, TriggerListenersStore, TriggerPayloadManager } from './triggers'
|
|
32
33
|
export { ActionsExecutionContainerHookFactory } from './ActionsExecutionContainerHookFactory'
|
|
33
34
|
export { ListenerStoreProvider } from './ListenerStoreProvider'
|
|
34
35
|
|
|
@@ -50,11 +51,13 @@ export default class ActionsPlugin implements Plugin {
|
|
|
50
51
|
.addService('actions_variableManager', () => {
|
|
51
52
|
return new VariablesManager()
|
|
52
53
|
})
|
|
53
|
-
.addService('
|
|
54
|
-
|
|
54
|
+
.addService('actions_eventRepository', () => {
|
|
55
|
+
return new EventsRepository()
|
|
56
|
+
})
|
|
57
|
+
.addService('actions_eventDispatcher', ({ actions_eventRepository, actions_variableManager }) => {
|
|
55
58
|
const webhookTargetHandler = new WebhookTargetHandler(new WebhookFetcherNative())
|
|
56
59
|
const targetHandlerResolver = new TargetHandlerResolver(webhookTargetHandler)
|
|
57
|
-
return new EventDispatcher(
|
|
60
|
+
return new EventDispatcher(actions_eventRepository, actions_variableManager, targetHandlerResolver)
|
|
58
61
|
})
|
|
59
62
|
.addService('actions_dispatchWorkerSupervisorFactory', ({ actions_eventDispatcher }) => {
|
|
60
63
|
const projectDispatcherFactory = new ProjectDispatcherFactory(actions_eventDispatcher)
|
|
@@ -63,31 +66,59 @@ export default class ActionsPlugin implements Plugin {
|
|
|
63
66
|
.addService('actions_authorizator', () => {
|
|
64
67
|
return new Authorizator.Default(new AccessEvaluator.PermissionEvaluator(new ActionsPermissionsFactory().create()))
|
|
65
68
|
})
|
|
66
|
-
.setupService(
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
69
|
+
.setupService(
|
|
70
|
+
'application',
|
|
71
|
+
(
|
|
72
|
+
it,
|
|
73
|
+
{
|
|
74
|
+
projectContextResolver,
|
|
75
|
+
debugMode,
|
|
76
|
+
actions_eventRepository,
|
|
77
|
+
actions_eventDispatcher,
|
|
78
|
+
actions_dispatchWorkerSupervisorFactory,
|
|
79
|
+
actions_variableManager,
|
|
80
|
+
actions_authorizator,
|
|
81
|
+
},
|
|
82
|
+
) => {
|
|
83
|
+
const handlerFactory = new ActionsGraphQLHandlerFactory()
|
|
84
|
+
const eventsQueryResolver = new EventsQueryResolver()
|
|
85
|
+
const processBatchMutationResolver = new ProcessBatchMutationResolver(actions_eventDispatcher)
|
|
86
|
+
const variablesQueryResolver = new VariablesQueryResolver(actions_variableManager)
|
|
87
|
+
const setVariablesMutationResolver = new SetVariablesMutationResolver(actions_variableManager)
|
|
88
|
+
const resolversFactory = new ResolversFactory(
|
|
89
|
+
eventsQueryResolver,
|
|
90
|
+
processBatchMutationResolver,
|
|
91
|
+
variablesQueryResolver,
|
|
92
|
+
setVariablesMutationResolver,
|
|
93
|
+
new RetryEventMutationResolver(actions_eventRepository),
|
|
94
|
+
new StopEventMutationResolver(actions_eventRepository),
|
|
95
|
+
)
|
|
90
96
|
|
|
97
|
+
const actionsContextResolver = new ActionsContextResolver(debugMode, projectContextResolver)
|
|
98
|
+
const actionsMiddlewareFactory = new ActionsApiMiddlewareFactory(
|
|
99
|
+
actionsContextResolver,
|
|
100
|
+
handlerFactory.create(resolversFactory),
|
|
101
|
+
actions_authorizator,
|
|
102
|
+
)
|
|
103
|
+
const actionsWebsocketMiddlewareFactory = new ActionsWebsocketControllerFactory(
|
|
104
|
+
debugMode,
|
|
105
|
+
actionsContextResolver,
|
|
106
|
+
actions_dispatchWorkerSupervisorFactory,
|
|
107
|
+
)
|
|
108
|
+
it.addRoute('actions', '/actions/:projectSlug', actionsMiddlewareFactory.create())
|
|
109
|
+
it.addWebsocketRoute('actions', '/actions/_worker', actionsWebsocketMiddlewareFactory.create())
|
|
110
|
+
},
|
|
111
|
+
)
|
|
112
|
+
.setupService(
|
|
113
|
+
'applicationWorkers',
|
|
114
|
+
(it, { actions_dispatchWorkerSupervisorFactory, projectGroupContainer, projectGroupContainerResolver, serverConfig }) => {
|
|
115
|
+
if (!(serverConfig as any).projectGroup) {
|
|
116
|
+
it.registerWorker(this.name, actions_dispatchWorkerSupervisorFactory.create(projectGroupContainer))
|
|
117
|
+
} else {
|
|
118
|
+
it.registerWorker(this.name, new LazyDispatchWorker(projectGroupContainerResolver, actions_dispatchWorkerSupervisorFactory))
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
) as unknown as MasterContainerBuilder
|
|
91
122
|
}
|
|
92
123
|
return hook
|
|
93
124
|
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { MigrationBuilder } from '@contember/database-migrations'
|
|
2
|
+
|
|
3
|
+
const sql = `
|
|
4
|
+
ALTER TABLE actions_event
|
|
5
|
+
ADD COLUMN IF NOT EXISTS identity_id UUID DEFAULT NULL;
|
|
6
|
+
|
|
7
|
+
ALTER TABLE actions_event
|
|
8
|
+
ADD COLUMN IF NOT EXISTS ip_address INET DEFAULT NULL;
|
|
9
|
+
|
|
10
|
+
ALTER TABLE actions_event
|
|
11
|
+
ADD COLUMN IF NOT EXISTS user_agent TEXT DEFAULT NULL;
|
|
12
|
+
`
|
|
13
|
+
|
|
14
|
+
export default async function(builder: MigrationBuilder) {
|
|
15
|
+
builder.sql(sql)
|
|
16
|
+
}
|
package/src/migrations/index.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import snapshot from './snapshot'
|
|
2
2
|
import { MigrationGroup } from '@contember/database-migrations'
|
|
3
3
|
import _20230310145000actionsvariables from './2023-03-10-145000-actions-variables'
|
|
4
|
+
import _20250528160000actioneventuser from './2025-05-28-160000-action-event-user'
|
|
4
5
|
|
|
5
6
|
export const migrationsGroup = new MigrationGroup(snapshot, {
|
|
6
7
|
'2023-03-10-145000-actions-variables': _20230310145000actionsvariables,
|
|
8
|
+
'2025-05-28-160000-action-event-user': _20250528160000actioneventuser,
|
|
7
9
|
})
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { MigrationBuilder } from '@contember/database-migrations'
|
|
2
2
|
|
|
3
|
-
export default async function
|
|
3
|
+
export default async function(builder: MigrationBuilder) {
|
|
4
4
|
builder.sql(`
|
|
5
5
|
CREATE TYPE ACTIONS_TRIGGER_STATE AS ENUM (
|
|
6
6
|
'created' ,
|
|
@@ -30,11 +30,14 @@ export default async function (builder: MigrationBuilder) {
|
|
|
30
30
|
trigger TEXT NOT NULL,
|
|
31
31
|
priority INT NOT NULL DEFAULT 0,
|
|
32
32
|
payload JSONB NOT NULL,
|
|
33
|
-
log JSONB NOT NULL DEFAULT '[]'
|
|
33
|
+
log JSONB NOT NULL DEFAULT '[]',
|
|
34
|
+
identity_id UUID DEFAULT NULL,
|
|
35
|
+
ip_address INET DEFAULT NULL,
|
|
36
|
+
user_agent TEXT DEFAULT NULL
|
|
34
37
|
);
|
|
35
38
|
|
|
36
39
|
CREATE INDEX ON actions_event (priority DESC, visible_at) WHERE state IN ('created', 'retrying', 'processing');
|
|
37
|
-
|
|
40
|
+
|
|
38
41
|
CREATE TABLE actions_variable
|
|
39
42
|
(
|
|
40
43
|
id UUID PRIMARY KEY NOT NULL,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { DatabaseQuery, DatabaseQueryable, SelectBuilder } from '@contember/database'
|
|
2
|
+
import { EventRow } from './types'
|
|
3
|
+
|
|
4
|
+
export class EventByIdQuery extends DatabaseQuery<EventRow | null> {
|
|
5
|
+
constructor(
|
|
6
|
+
private readonly id: string,
|
|
7
|
+
) {
|
|
8
|
+
super()
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
async fetch(queryable: DatabaseQueryable): Promise<EventRow | null> {
|
|
12
|
+
const result = await SelectBuilder.create<EventRow>()
|
|
13
|
+
.from('actions_event')
|
|
14
|
+
.select('*')
|
|
15
|
+
.where({
|
|
16
|
+
id: this.id,
|
|
17
|
+
})
|
|
18
|
+
.getResult(queryable.db)
|
|
19
|
+
return this.fetchOneOrNull(result)
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { Operator, SelectBuilderSpecification } from '@contember/database'
|
|
2
2
|
|
|
3
|
+
export const eventsToProcessStateSpecification: SelectBuilderSpecification = qb =>
|
|
4
|
+
qb
|
|
5
|
+
.where(it => it.in('state', ['retrying', 'created', 'processing']))
|
|
3
6
|
|
|
4
|
-
export const
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
.orderBy('priority', 'desc')
|
|
11
|
-
.orderBy('visible_at')
|
|
7
|
+
export const eventsToProcessSpecification: SelectBuilderSpecification = qb =>
|
|
8
|
+
qb
|
|
9
|
+
.match(eventsToProcessStateSpecification)
|
|
10
|
+
.where(it => it.compare('visible_at', Operator.lte, 'now'))
|
|
11
|
+
.orderBy('priority', 'desc')
|
|
12
|
+
.orderBy('visible_at')
|
|
@@ -2,7 +2,6 @@ import { Command } from '@contember/engine-system-api'
|
|
|
2
2
|
import { ConflictActionType, InsertBuilder, Literal } from '@contember/database'
|
|
3
3
|
|
|
4
4
|
export class SetVariableCommand implements Command<void> {
|
|
5
|
-
|
|
6
5
|
constructor(
|
|
7
6
|
private readonly name: string,
|
|
8
7
|
private readonly value: string,
|
package/src/model/types.ts
CHANGED
|
@@ -71,31 +71,30 @@ export class TriggerHandler {
|
|
|
71
71
|
|
|
72
72
|
private async directUpdateHandler(event: AfterUpdateEvent) {
|
|
73
73
|
const updateListeners = this.listenersStore.getUpdateListeners(event.entity.name)
|
|
74
|
-
updateListeners.map(listener => {
|
|
74
|
+
await Promise.all(updateListeners.map(listener => {
|
|
75
75
|
if (event.data.some(it => listener.fields.has(it.fieldName) && it.value !== it.old)) {
|
|
76
|
-
this.payloadManager.add({
|
|
76
|
+
return this.payloadManager.add({
|
|
77
77
|
listener,
|
|
78
78
|
entity: event.entity,
|
|
79
79
|
primary: event.id,
|
|
80
80
|
cause: event,
|
|
81
81
|
})
|
|
82
82
|
}
|
|
83
|
-
})
|
|
83
|
+
}))
|
|
84
84
|
}
|
|
85
85
|
|
|
86
86
|
private async directCreateHandler(event: AfterInsertEvent) {
|
|
87
87
|
const createListeners = this.listenersStore.getCreateListener(event.entity.name)
|
|
88
|
-
createListeners.map(listener => {
|
|
89
|
-
this.payloadManager.add({
|
|
88
|
+
await Promise.all(createListeners.map(listener => {
|
|
89
|
+
return this.payloadManager.add({
|
|
90
90
|
listener,
|
|
91
91
|
entity: event.entity,
|
|
92
92
|
primary: event.id,
|
|
93
93
|
cause: event,
|
|
94
94
|
})
|
|
95
|
-
})
|
|
95
|
+
}))
|
|
96
96
|
}
|
|
97
97
|
|
|
98
|
-
|
|
99
98
|
/**
|
|
100
99
|
* Collect affected triggers after entity was created or before it was deleted.
|
|
101
100
|
* todo: after insert, it should probably check only owning relations, because other relations are connected later, so it would be always empty
|
|
@@ -103,9 +102,11 @@ export class TriggerHandler {
|
|
|
103
102
|
private async indirectChangesEntityHandler(event: BeforeDeleteEvent | AfterInsertEvent) {
|
|
104
103
|
//
|
|
105
104
|
const indirectEntityListeners = this.listenersStore.getIndirectListeners(event.entity.name)
|
|
106
|
-
const promises =
|
|
107
|
-
|
|
108
|
-
|
|
105
|
+
const promises = indirectEntityListeners.map(listener =>
|
|
106
|
+
this.collectDeepChanges(event, listener, {
|
|
107
|
+
[event.entity.primary]: { eq: event.id },
|
|
108
|
+
})
|
|
109
|
+
)
|
|
109
110
|
await Promise.all(promises)
|
|
110
111
|
}
|
|
111
112
|
|
|
@@ -142,20 +143,20 @@ export class TriggerHandler {
|
|
|
142
143
|
await Promise.all(promises)
|
|
143
144
|
}
|
|
144
145
|
|
|
145
|
-
|
|
146
146
|
private async collectDeepChanges(
|
|
147
147
|
cause: EventCause,
|
|
148
148
|
listener: IndirectListener | JunctionListener,
|
|
149
149
|
where: Input.Where,
|
|
150
150
|
) {
|
|
151
151
|
const result = await this.changesFetcher.fetch(listener, where)
|
|
152
|
-
|
|
153
|
-
this.payloadManager.add({
|
|
152
|
+
await Promise.all(result.map(row => {
|
|
153
|
+
return this.payloadManager.add({
|
|
154
154
|
listener,
|
|
155
155
|
entity: listener.rootEntity,
|
|
156
|
-
primary: row,
|
|
156
|
+
primary: row.id,
|
|
157
157
|
cause,
|
|
158
|
+
nodes: row.nodes,
|
|
158
159
|
})
|
|
159
|
-
}
|
|
160
|
+
}))
|
|
160
161
|
}
|
|
161
162
|
}
|
|
@@ -1,12 +1,21 @@
|
|
|
1
1
|
import { Mapper, PathFactory, WhereBuilder } from '@contember/engine-content-api'
|
|
2
2
|
import { IndirectListener, JunctionListener } from './TriggerListenersStore'
|
|
3
3
|
import { SelectBuilder } from '@contember/database'
|
|
4
|
-
import { Input } from '@contember/schema'
|
|
4
|
+
import { ActionsPayload, Input, Model, Schema } from '@contember/schema'
|
|
5
|
+
import { JoinBuilder } from '@contember/engine-content-api'
|
|
6
|
+
import { getTargetEntity } from '@contember/schema-utils'
|
|
7
|
+
|
|
8
|
+
export type TriggerIndirectChangesFetcherResult = {
|
|
9
|
+
id: Input.PrimaryValue
|
|
10
|
+
nodes?: ActionsPayload.EntityEventPathNode[]
|
|
11
|
+
}[]
|
|
5
12
|
|
|
6
13
|
export class TriggerIndirectChangesFetcher {
|
|
7
14
|
constructor(
|
|
15
|
+
private readonly model: Model.Schema,
|
|
8
16
|
private readonly mapper: Mapper,
|
|
9
17
|
private readonly whereBuilder: WhereBuilder,
|
|
18
|
+
private readonly joinBuilder: JoinBuilder,
|
|
10
19
|
private readonly pathFactory: PathFactory,
|
|
11
20
|
) {
|
|
12
21
|
}
|
|
@@ -14,7 +23,11 @@ export class TriggerIndirectChangesFetcher {
|
|
|
14
23
|
public async fetch(
|
|
15
24
|
listener: IndirectListener | JunctionListener,
|
|
16
25
|
where: Input.Where,
|
|
17
|
-
): Promise<
|
|
26
|
+
): Promise<TriggerIndirectChangesFetcherResult> {
|
|
27
|
+
if (listener.trigger.withNodes) {
|
|
28
|
+
return this.fetchWithNodes(listener, where)
|
|
29
|
+
}
|
|
30
|
+
|
|
18
31
|
for (let i = listener.path.length - 1; i >= 0; i--) {
|
|
19
32
|
where = { [listener.path[i]]: where }
|
|
20
33
|
}
|
|
@@ -24,7 +37,53 @@ export class TriggerIndirectChangesFetcher {
|
|
|
24
37
|
const path = this.pathFactory.create([])
|
|
25
38
|
const qbWithWhere = this.whereBuilder.build(qb, listener.rootEntity, path, where)
|
|
26
39
|
|
|
27
|
-
return (await qbWithWhere.getResult(this.mapper.db))
|
|
40
|
+
return (await qbWithWhere.getResult(this.mapper.db))
|
|
28
41
|
}
|
|
29
42
|
|
|
43
|
+
private async fetchWithNodes(
|
|
44
|
+
listener: IndirectListener | JunctionListener,
|
|
45
|
+
where: Input.Where,
|
|
46
|
+
): Promise<TriggerIndirectChangesFetcherResult> {
|
|
47
|
+
const basePath = this.pathFactory.create([])
|
|
48
|
+
let path = basePath
|
|
49
|
+
let entity = listener.rootEntity
|
|
50
|
+
let qb = SelectBuilder.create()
|
|
51
|
+
.from(entity.tableName, path.alias)
|
|
52
|
+
.select([path.alias, entity.primaryColumn], path.for(entity.primary).alias)
|
|
53
|
+
|
|
54
|
+
for (let i = 0; i < listener.path.length; i++) {
|
|
55
|
+
const relationName = listener.path[i]
|
|
56
|
+
path = path.for(relationName)
|
|
57
|
+
const targetEntity = getTargetEntity(this.model, entity, relationName)
|
|
58
|
+
if (!targetEntity) {
|
|
59
|
+
throw new Error(`Target entity for relation ${entity.name}::${relationName} not found`)
|
|
60
|
+
}
|
|
61
|
+
qb = this.joinBuilder.join(qb, path, entity, relationName)
|
|
62
|
+
|
|
63
|
+
entity = targetEntity
|
|
64
|
+
qb = qb.select([path.alias, targetEntity.primaryColumn], path.for(targetEntity.primary).alias)
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const qbWithWhere = this.whereBuilder.build(qb, entity, path, where)
|
|
68
|
+
|
|
69
|
+
const result = await qbWithWhere.getResult(this.mapper.db)
|
|
70
|
+
|
|
71
|
+
return result.map(row => {
|
|
72
|
+
const nodes: ActionsPayload.EntityEventPathNode[] = []
|
|
73
|
+
let entity = listener.rootEntity
|
|
74
|
+
let path = basePath
|
|
75
|
+
const id = row[path.for(entity.primary).alias]
|
|
76
|
+
for (let i = 0; i < listener.path.length; i++) {
|
|
77
|
+
const relationName = listener.path[i]
|
|
78
|
+
const targetEntity = getTargetEntity(this.model, entity, relationName)
|
|
79
|
+
if (!targetEntity) {
|
|
80
|
+
throw new Error(`Target entity for relation ${entity.name}::${relationName} not found`)
|
|
81
|
+
}
|
|
82
|
+
path = path.for(relationName)
|
|
83
|
+
nodes.push({ relation: relationName, entity: targetEntity.name, id: row[path.for(targetEntity.primary).alias] })
|
|
84
|
+
entity = targetEntity
|
|
85
|
+
}
|
|
86
|
+
return { id, nodes }
|
|
87
|
+
})
|
|
88
|
+
}
|
|
30
89
|
}
|
|
@@ -1,10 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
CreateListener,
|
|
3
|
-
DeleteListener,
|
|
4
|
-
IndirectListener,
|
|
5
|
-
JunctionListener,
|
|
6
|
-
UpdateListener,
|
|
7
|
-
} from './TriggerListenersStore'
|
|
1
|
+
import { CreateListener, DeleteListener, IndirectListener, JunctionListener, UpdateListener } from './TriggerListenersStore'
|
|
8
2
|
|
|
9
3
|
export interface TriggerListeners {
|
|
10
4
|
readonly deleteListeners: Map<string, DeleteListener[]>
|
|
@@ -13,4 +7,3 @@ export interface TriggerListeners {
|
|
|
13
7
|
readonly indirectListeners: Map<string, IndirectListener[]>
|
|
14
8
|
readonly junctionListeners: Map<string, Map<string, JunctionListener[]>>
|
|
15
9
|
}
|
|
16
|
-
|
|
@@ -6,7 +6,6 @@ import { mapGetOrPut } from '../utils/map'
|
|
|
6
6
|
import { ImplementationException } from '../ImplementationException'
|
|
7
7
|
|
|
8
8
|
export class TriggerListenerBuilder {
|
|
9
|
-
|
|
10
9
|
private readonly data: TriggerListeners = {
|
|
11
10
|
createListeners: new Map(),
|
|
12
11
|
updateListeners: new Map(),
|
|
@@ -26,7 +25,7 @@ export class TriggerListenerBuilder {
|
|
|
26
25
|
} else if (trigger.type === 'watch') {
|
|
27
26
|
this.processIndirectListeners(trigger)
|
|
28
27
|
} else {
|
|
29
|
-
((_: never) => {
|
|
28
|
+
;((_: never) => {
|
|
30
29
|
throw new ImplementationException(`Unhandled trigger ${(trigger as any).type}`)
|
|
31
30
|
})(trigger)
|
|
32
31
|
}
|
|
@@ -169,12 +168,10 @@ export class TriggerListenerBuilder {
|
|
|
169
168
|
return new TriggerListenersStore(this.data)
|
|
170
169
|
}
|
|
171
170
|
|
|
172
|
-
|
|
173
171
|
private addListener<
|
|
174
172
|
K extends Exclude<keyof TriggerListeners, 'junctionListeners'>,
|
|
175
|
-
V extends TriggerListeners[K] extends Map<string, infer V extends any[]> ? V[number] : never
|
|
176
|
-
>
|
|
177
|
-
(
|
|
173
|
+
V extends TriggerListeners[K] extends Map<string, infer V extends any[]> ? V[number] : never,
|
|
174
|
+
>(
|
|
178
175
|
type: K,
|
|
179
176
|
entityName: string,
|
|
180
177
|
value: V,
|
|
@@ -3,7 +3,7 @@ import { TriggerListeners } from './TriggerListeners'
|
|
|
3
3
|
|
|
4
4
|
export interface IndirectListener {
|
|
5
5
|
type: 'indirect'
|
|
6
|
-
trigger: Actions.
|
|
6
|
+
trigger: Actions.WatchTrigger
|
|
7
7
|
rootEntity: Model.Entity
|
|
8
8
|
fields: Set<string>
|
|
9
9
|
relations: Set<string>
|
|
@@ -12,7 +12,7 @@ export interface IndirectListener {
|
|
|
12
12
|
|
|
13
13
|
export interface JunctionListener {
|
|
14
14
|
type: 'junction'
|
|
15
|
-
trigger: Actions.
|
|
15
|
+
trigger: Actions.WatchTrigger
|
|
16
16
|
rootEntity: Model.Entity
|
|
17
17
|
path: string[]
|
|
18
18
|
context: {
|
|
@@ -23,7 +23,10 @@ export class TriggerPayloadBuilder {
|
|
|
23
23
|
const selections = await this.fetchSelection(filteredEvents)
|
|
24
24
|
const triggerType = filteredEvents[0].listener.trigger.type
|
|
25
25
|
if (triggerType === 'basic') {
|
|
26
|
-
return filteredEvents.map(it => ({
|
|
26
|
+
return filteredEvents.map(it => ({
|
|
27
|
+
trigger: it.listener.trigger.name,
|
|
28
|
+
...this.buildBaseEventPayloads(it, it.selection ?? selections[it.primary]),
|
|
29
|
+
}))
|
|
27
30
|
}
|
|
28
31
|
if (triggerType === 'watch') {
|
|
29
32
|
return this.buildWatchEventPayloads(filteredEvents, selections)
|
|
@@ -35,9 +38,13 @@ export class TriggerPayloadBuilder {
|
|
|
35
38
|
if (event.listener.type === 'delete' && event.listener.trigger.selection) {
|
|
36
39
|
const input = this.convertSelectionNode(event.listener.trigger.selection)
|
|
37
40
|
|
|
38
|
-
const selection = await this.mapper.selectUnique(
|
|
39
|
-
|
|
40
|
-
|
|
41
|
+
const selection = await this.mapper.selectUnique(
|
|
42
|
+
event.entity,
|
|
43
|
+
input.withArg('by', {
|
|
44
|
+
[event.entity.primary]: event.primary,
|
|
45
|
+
}),
|
|
46
|
+
[],
|
|
47
|
+
)
|
|
41
48
|
return { ...event, selection }
|
|
42
49
|
}
|
|
43
50
|
return event
|
|
@@ -51,6 +58,19 @@ export class TriggerPayloadBuilder {
|
|
|
51
58
|
}
|
|
52
59
|
const payloads: ActionsPayload.WatchEventPayload[] = []
|
|
53
60
|
for (const eventsByPrimary of Object.values(byPrimary)) {
|
|
61
|
+
const baseEvents: ActionsPayload.BaseEventPayload[] = []
|
|
62
|
+
|
|
63
|
+
const existingEvents = new Set<string>()
|
|
64
|
+
for (const event of eventsByPrimary.events) {
|
|
65
|
+
const baseEvent = this.buildBaseEventPayloads(event)
|
|
66
|
+
const stringRepresentation = JSON.stringify(baseEvent)
|
|
67
|
+
if (existingEvents.has(stringRepresentation)) {
|
|
68
|
+
continue
|
|
69
|
+
}
|
|
70
|
+
existingEvents.add(stringRepresentation)
|
|
71
|
+
baseEvents.push(baseEvent)
|
|
72
|
+
}
|
|
73
|
+
|
|
54
74
|
payloads.push({
|
|
55
75
|
operation: 'watch',
|
|
56
76
|
trigger: events[0].listener.trigger.name,
|
|
@@ -58,7 +78,7 @@ export class TriggerPayloadBuilder {
|
|
|
58
78
|
id: eventsByPrimary.primary,
|
|
59
79
|
selection: eventsByPrimary.events.find(it => it.selection)?.selection
|
|
60
80
|
?? selections[eventsByPrimary.primary],
|
|
61
|
-
events:
|
|
81
|
+
events: baseEvents,
|
|
62
82
|
})
|
|
63
83
|
}
|
|
64
84
|
return payloads
|
|
@@ -74,6 +94,7 @@ export class TriggerPayloadBuilder {
|
|
|
74
94
|
selection,
|
|
75
95
|
values: Object.fromEntries(event.cause.data.map(it => [it.fieldName, it.value])),
|
|
76
96
|
path: 'path' in event.listener ? event.listener.path : undefined,
|
|
97
|
+
nodes: event.nodes,
|
|
77
98
|
}
|
|
78
99
|
case 'AfterUpdateEvent':
|
|
79
100
|
case 'BeforeUpdateEvent':
|
|
@@ -89,6 +110,7 @@ export class TriggerPayloadBuilder {
|
|
|
89
110
|
values: Object.fromEntries(event.cause.data.map(it => [it.fieldName, it.value])),
|
|
90
111
|
path: 'path' in event.listener ? event.listener.path : undefined,
|
|
91
112
|
old: Object.fromEntries(afterEvent.data.map(it => [it.fieldName, it.old])),
|
|
113
|
+
nodes: event.nodes,
|
|
92
114
|
}
|
|
93
115
|
case 'BeforeDeleteEvent':
|
|
94
116
|
return {
|
|
@@ -97,6 +119,7 @@ export class TriggerPayloadBuilder {
|
|
|
97
119
|
id: event.cause.id,
|
|
98
120
|
selection,
|
|
99
121
|
path: 'path' in event.listener ? event.listener.path : undefined,
|
|
122
|
+
nodes: event.nodes,
|
|
100
123
|
}
|
|
101
124
|
case 'AfterJunctionUpdateEvent':
|
|
102
125
|
if (event.listener.type !== 'junction') {
|
|
@@ -112,6 +135,7 @@ export class TriggerPayloadBuilder {
|
|
|
112
135
|
id,
|
|
113
136
|
inverseId,
|
|
114
137
|
path: 'path' in event.listener ? event.listener.path : undefined,
|
|
138
|
+
nodes: event.nodes,
|
|
115
139
|
}
|
|
116
140
|
default:
|
|
117
141
|
assertNever(event.cause, it => it.type)
|
|
@@ -135,14 +159,20 @@ export class TriggerPayloadBuilder {
|
|
|
135
159
|
return await this.mapper.selectAssoc(entity, input, [], entity.primary)
|
|
136
160
|
}
|
|
137
161
|
|
|
138
|
-
|
|
139
162
|
private convertSelectionNode(node: Actions.SelectionNode, nodeName = 'root', path: string[] = []): ObjectNode<Input.ListQueryInput> {
|
|
140
|
-
return new ObjectNode(
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
163
|
+
return new ObjectNode(
|
|
164
|
+
nodeName,
|
|
165
|
+
nodeName,
|
|
166
|
+
node.map(it => {
|
|
167
|
+
const [field, args, selection] = Array.isArray(it) ? it : [it, undefined, undefined]
|
|
168
|
+
if (selection === undefined || selection.length === 0) {
|
|
169
|
+
return new FieldNode(field, field, {})
|
|
170
|
+
}
|
|
171
|
+
return this.convertSelectionNode(selection, field, [...path, nodeName]).withArgs(args)
|
|
172
|
+
}),
|
|
173
|
+
{},
|
|
174
|
+
{},
|
|
175
|
+
path,
|
|
176
|
+
)
|
|
147
177
|
}
|
|
148
178
|
}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { Actions, Input, Model } from '@contember/schema'
|
|
1
|
+
import { Actions, ActionsPayload, Input, Model } from '@contember/schema'
|
|
2
2
|
import { AnyListener } from './TriggerListenersStore'
|
|
3
3
|
import { EventCause } from './TriggerHandler'
|
|
4
4
|
import { TriggerPayloadBuilder } from './TriggerPayloadBuilder'
|
|
5
5
|
import { TriggerPayloadPersister } from './TriggerPayloadPersister'
|
|
6
6
|
|
|
7
|
-
|
|
8
7
|
export interface FiredEvent {
|
|
9
8
|
listener: AnyListener
|
|
10
9
|
cause: EventCause
|
|
11
10
|
entity: Model.Entity
|
|
12
11
|
primary: Input.PrimaryValue
|
|
13
12
|
selection?: any
|
|
13
|
+
nodes?: ActionsPayload.EntityEventPathNode[]
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
export class TriggerPayloadManager {
|
|
@@ -28,7 +28,6 @@ export class TriggerPayloadManager {
|
|
|
28
28
|
this.eventsByTrigger[firedEvent.listener.trigger.name].push(event)
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
|
|
32
31
|
public async persist(): Promise<void> {
|
|
33
32
|
for (const events of Object.values(this.eventsByTrigger)) {
|
|
34
33
|
const payloads = await this.triggerPayloadBuilder.build(events)
|
|
@@ -37,4 +36,3 @@ export class TriggerPayloadManager {
|
|
|
37
36
|
}
|
|
38
37
|
}
|
|
39
38
|
}
|
|
40
|
-
|