@contember/engine-actions 2.1.0-alpha.3 → 2.1.0-alpha.30
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/development/index.cjs +10 -5
- package/dist/development/index.cjs.map +1 -1
- package/dist/development/index.js +10 -5
- package/dist/development/index.js.map +1 -1
- package/dist/development/src/ActionsExecutionContainerHookFactory.cjs +3 -3
- package/dist/development/src/ActionsExecutionContainerHookFactory.cjs.map +1 -1
- package/dist/development/src/ActionsExecutionContainerHookFactory.js +3 -3
- package/dist/development/src/ActionsExecutionContainerHookFactory.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/dispatch/EventsRepository.cjs +17 -4
- package/dist/development/src/dispatch/EventsRepository.cjs.map +1 -1
- package/dist/development/src/dispatch/EventsRepository.js +17 -4
- package/dist/development/src/dispatch/EventsRepository.js.map +1 -1
- package/dist/development/src/dispatch/ProjectDispatcher.cjs +2 -2
- package/dist/development/src/dispatch/ProjectDispatcher.cjs.map +1 -1
- package/dist/development/src/dispatch/ProjectDispatcher.js +1 -1
- package/dist/development/src/dispatch/ProjectDispatcher.js.map +1 -1
- package/dist/development/src/dispatch/WebhookTargetHandler.cjs +3 -0
- package/dist/development/src/dispatch/WebhookTargetHandler.cjs.map +1 -1
- package/dist/development/src/dispatch/WebhookTargetHandler.js +3 -0
- 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/resolvers/ResolversFactory.cjs +7 -2
- package/dist/development/src/graphql/resolvers/ResolversFactory.cjs.map +1 -1
- package/dist/development/src/graphql/resolvers/ResolversFactory.js +7 -2
- package/dist/development/src/graphql/resolvers/ResolversFactory.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/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/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/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/triggers/TriggerHandler.cjs +12 -11
- package/dist/development/src/triggers/TriggerHandler.cjs.map +1 -1
- package/dist/development/src/triggers/TriggerHandler.js +12 -11
- 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/TriggerListenersStore.cjs.map +1 -1
- package/dist/development/src/triggers/TriggerListenersStore.js.map +1 -1
- package/dist/development/src/triggers/TriggerPayloadBuilder.cjs +20 -5
- package/dist/development/src/triggers/TriggerPayloadBuilder.cjs.map +1 -1
- package/dist/development/src/triggers/TriggerPayloadBuilder.js +20 -5
- 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 +9 -5
- package/dist/development/src/triggers/TriggerPayloadPersister.cjs.map +1 -1
- package/dist/development/src/triggers/TriggerPayloadPersister.js +9 -5
- package/dist/development/src/triggers/TriggerPayloadPersister.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 +10 -5
- package/dist/production/index.cjs.map +1 -1
- package/dist/production/index.js +10 -5
- package/dist/production/index.js.map +1 -1
- package/dist/production/src/ActionsExecutionContainerHookFactory.cjs +3 -3
- package/dist/production/src/ActionsExecutionContainerHookFactory.cjs.map +1 -1
- package/dist/production/src/ActionsExecutionContainerHookFactory.js +3 -3
- package/dist/production/src/ActionsExecutionContainerHookFactory.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/dispatch/EventsRepository.cjs +17 -4
- package/dist/production/src/dispatch/EventsRepository.cjs.map +1 -1
- package/dist/production/src/dispatch/EventsRepository.js +17 -4
- package/dist/production/src/dispatch/EventsRepository.js.map +1 -1
- package/dist/production/src/dispatch/ProjectDispatcher.cjs +2 -2
- package/dist/production/src/dispatch/ProjectDispatcher.cjs.map +1 -1
- package/dist/production/src/dispatch/ProjectDispatcher.js +1 -1
- package/dist/production/src/dispatch/ProjectDispatcher.js.map +1 -1
- package/dist/production/src/dispatch/WebhookTargetHandler.cjs +3 -0
- package/dist/production/src/dispatch/WebhookTargetHandler.cjs.map +1 -1
- package/dist/production/src/dispatch/WebhookTargetHandler.js +3 -0
- 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/resolvers/ResolversFactory.cjs +7 -2
- package/dist/production/src/graphql/resolvers/ResolversFactory.cjs.map +1 -1
- package/dist/production/src/graphql/resolvers/ResolversFactory.js +7 -2
- package/dist/production/src/graphql/resolvers/ResolversFactory.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/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/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/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/triggers/TriggerHandler.cjs +12 -11
- package/dist/production/src/triggers/TriggerHandler.cjs.map +1 -1
- package/dist/production/src/triggers/TriggerHandler.js +12 -11
- 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/TriggerListenersStore.cjs.map +1 -1
- package/dist/production/src/triggers/TriggerListenersStore.js.map +1 -1
- package/dist/production/src/triggers/TriggerPayloadBuilder.cjs +20 -5
- package/dist/production/src/triggers/TriggerPayloadBuilder.cjs.map +1 -1
- package/dist/production/src/triggers/TriggerPayloadBuilder.js +20 -5
- 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 +9 -5
- package/dist/production/src/triggers/TriggerPayloadPersister.cjs.map +1 -1
- package/dist/production/src/triggers/TriggerPayloadPersister.js +9 -5
- package/dist/production/src/triggers/TriggerPayloadPersister.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/tsconfig.tsbuildinfo +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/EventsRepository.d.ts +2 -1
- package/dist/types/dispatch/EventsRepository.d.ts.map +1 -1
- package/dist/types/dispatch/WebhookTargetHandler.d.ts.map +1 -1
- package/dist/types/graphql/http/ActionsApiMiddlewareFactory.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/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/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.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/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/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 +7 -3
- 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 +15 -15
- package/src/ActionsExecutionContainerHookFactory.ts +3 -3
- package/src/authorization/ActionsAuthorizationActions.ts +2 -0
- package/src/dispatch/EventsRepository.ts +24 -5
- package/src/dispatch/ProjectDispatcher.ts +1 -1
- package/src/dispatch/WebhookTargetHandler.ts +3 -0
- package/src/graphql/http/ActionsApiMiddlewareFactory.ts +1 -0
- package/src/graphql/resolvers/ActionsContext.ts +1 -0
- package/src/graphql/resolvers/ResolversFactory.ts +6 -1
- package/src/graphql/resolvers/mutation/RetryEventMutationResolver.ts +22 -0
- 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 +14 -0
- package/src/graphql/schema/actions.graphql.ts +18 -4
- package/src/graphql/schema/index.ts +54 -1
- package/src/index.ts +9 -5
- 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 +5 -2
- package/src/model/EventByIdQuery.ts +21 -0
- package/src/model/types.ts +3 -0
- package/src/triggers/TriggerHandler.ts +12 -11
- package/src/triggers/TriggerIndirectChangesFetcher.ts +62 -3
- package/src/triggers/TriggerListenersStore.ts +2 -2
- package/src/triggers/TriggerPayloadBuilder.ts +18 -1
- package/src/triggers/TriggerPayloadManager.ts +2 -1
- package/src/triggers/TriggerPayloadPersister.ts +9 -3
- package/src/utils/notifyChannel.ts +6 -0
- package/tests/cases/unit/generator.test.ts +1 -1
- package/tests/cases/unit/webhookHandler.test.ts +9 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebhookTargetHandler.cjs","sources":["../../../../../packages/engine-actions/src/dispatch/WebhookTargetHandler.ts"],"sourcesContent":["import { Actions, ActionsPayload } from '@contember/schema'\nimport { EventRow, HandledEvent, InvokeHandler, InvokeHandlerArgs } from './types'\nimport { VariablesMap } from '../model/VariablesManager'\nimport * as Typesafe from '@contember/typesafe'\nimport { FetcherResponse, WebhookFetcher } from './WebhookFetcher'\n\nconst DEFAULT_TIMEOUT_MS = 30_000 // 30 seconds\n\nconst ResponseType = Typesafe.noExtraProps(Typesafe.object({\n\tfailures: Typesafe.array(\n\t\tTypesafe.intersection(\n\t\t\tTypesafe.object({\n\t\t\t\teventId: Typesafe.string,\n\t\t\t}),\n\t\t\tTypesafe.partial({\n\t\t\t\terror: Typesafe.string,\n\t\t\t}),\n\t\t),\n\t),\n}))\n\ntype EventResponseFactory = (eventRow: EventRow) => ({ ok: boolean; code?: number; response?: string; errorMessage?: string; durationMs?: number })\n\nexport class WebhookTargetHandler implements InvokeHandler<Actions.WebhookTarget> {\n\tconstructor(\n\t\tprivate readonly fetcher: WebhookFetcher,\n\t) {\n\t}\n\n\tpublic async handle({ target, events, logger, variables }: InvokeHandlerArgs<Actions.WebhookTarget>): Promise<HandledEvent[]> {\n\t\tconst timeoutMs = target.timeoutMs\n\n\t\tconst start = process.hrtime.bigint()\n\t\tconst getDuration = () => Math.floor(Number((process.hrtime.bigint() - start) / BigInt(1_000_000)))\n\n\t\tlet eventResponseFactory: EventResponseFactory\n\t\ttry {\n\n\t\t\tconst response = await this.fetch(timeoutMs ?? DEFAULT_TIMEOUT_MS, target, variables, events)\n\n\t\t\teventResponseFactory = this.createResponseFactory({\n\t\t\t\tresponse: response,\n\t\t\t\tevents,\n\t\t\t})\n\n\t\t} catch (e) {\n\t\t\tlogger.warn(e)\n\t\t\tconst errorMessages = this.extractErrorMessages(e)\n\t\t\tconst result = {\n\t\t\t\tok: false,\n\t\t\t\terrorMessage: errorMessages.length ? errorMessages.join('; ') : undefined,\n\t\t\t\tdurationMs: getDuration(),\n\t\t\t}\n\t\t\teventResponseFactory = () => ({ ok: false, errorMessage: errorMessages.length ? errorMessages.join('; ') : undefined })\n\n\t\t\treturn events.map(it => ({ target, row: it, result }))\n\t\t}\n\t\tconst durationMs = getDuration()\n\n\t\treturn events.map(it => ({ target, row: it, result: { durationMs, ...eventResponseFactory(it) } }))\n\t}\n\n\tprivate createResponseFactory({ response, events }: {\n\t\tresponse: FetcherResponse\n\t\tevents: EventRow[]\n\t}): EventResponseFactory {\n\t\tif (!response.ok) {\n\t\t\treturn () => ({\n\t\t\t\tok: false,\n\t\t\t\tcode: response.status,\n\t\t\t\tresponse: response.responseText,\n\t\t\t\terrorMessage: response.statusText,\n\t\t\t})\n\t\t}\n\n\t\tif (response.responseText.trim() === ''\n\t\t\t|| !response.headers.get('content-type')?.toLowerCase().includes('json')\n\t\t) {\n\t\t\treturn () => ({\n\t\t\t\tok: true,\n\t\t\t\tcode: response.status,\n\t\t\t})\n\t\t}\n\n\t\ttry {\n\t\t\tconst parsedJson = JSON.parse(response.responseText)\n\t\t\tif (parsedJson === null || typeof parsedJson !== 'object' || !('failures' in parsedJson)) {\n\t\t\t\treturn () => ({\n\t\t\t\t\tok: true,\n\t\t\t\t\tcode: response.status,\n\t\t\t\t})\n\t\t\t}\n\t\t\tconst responseData = ResponseType(parsedJson)\n\t\t\tconst eventsInBatch = new Set(events.map(it => it.id))\n\t\t\tconst failedEvents = Object.fromEntries(responseData.failures?.map(it => [it.eventId, it]) ?? [])\n\t\t\tconst missingEvents = Object.keys(failedEvents).filter(it => !eventsInBatch.has(it))\n\n\t\t\tif (missingEvents.length) {\n\t\t\t\treturn () => ({\n\t\t\t\t\tok: false,\n\t\t\t\t\tcode: response.status,\n\t\t\t\t\tresponse: response.responseText,\n\t\t\t\t\terrorMessage: 'Invalid response: undefined events IDs: ' + missingEvents.join('; '),\n\t\t\t\t})\n\t\t\t}\n\n\t\t\treturn it => {\n\t\t\t\tif (!failedEvents[it.id]) {\n\t\t\t\t\treturn { ok: true, code: response.status }\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tok: false,\n\t\t\t\t\tcode: response.status,\n\t\t\t\t\terrorMessage: failedEvents[it.id].error,\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e: any) {\n\t\t\treturn () => ({\n\t\t\t\tok: false,\n\t\t\t\tcode: response.status,\n\t\t\t\tresponse: response.responseText,\n\t\t\t\terrorMessage: 'Invalid response: ' + e.message,\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate extractErrorMessages(e: unknown): string[] {\n\t\tconst errorMessages = []\n\t\tlet err = e\n\t\twhile (typeof err === 'object' && err !== null && 'message' in err && typeof (err as any).message === 'string') {\n\t\t\terrorMessages.push((err as any).message)\n\t\t\terr = (err as any).cause\n\t\t}\n\t\treturn errorMessages\n\t}\n\n\tprivate async fetch(timeoutMs: number, target: Actions.WebhookTarget, variables: VariablesMap, events: EventRow[]): Promise<FetcherResponse> {\n\t\treturn await withTimeout(timeoutMs, async abortController => {\n\t\t\treturn await this.doFetch(target, variables, abortController, events)\n\t\t})\n\t}\n\n\tprivate async doFetch(target: Actions.WebhookTarget, variables: VariablesMap, abortController: AbortController, events: EventRow[]): Promise<FetcherResponse> {\n\t\tconst resolvedUrl = this.resolveVariables(target.url, variables)\n\t\tconst resolvedHeaders = Object.fromEntries(Object.entries(target.headers ?? {})\n\t\t\t.map(([key, value]) => [key, this.resolveVariables(value, variables)]))\n\n\t\treturn await this.fetcher.fetch(resolvedUrl, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t['User-Agent']: 'Contember Actions',\n\t\t\t\t...resolvedHeaders,\n\t\t\t\t['Content-type']: 'application/json',\n\t\t\t},\n\t\t\tsignal: abortController.signal,\n\t\t\tbody: this.formatBody(events, target),\n\t\t})\n\t}\n\n\tprivate formatBody(events: EventRow[], target: Actions.WebhookTarget): string {\n\t\tconst body = target.body ?? {}\n\t\tconst path = target.payloadPath ?? []\n\t\tlet current: any = body\n\t\tfor (let i = 0; i < path.length; i++) {\n\t\t\tcurrent[path[i]] ??= {}\n\t\t\tcurrent = current[path[i]]\n\t\t}\n\t\tcurrent['events'] = events.map(this.formatEventPayload)\n\t\treturn JSON.stringify(body)\n\t}\n\n\tprivate formatEventPayload(it: EventRow): ActionsPayload.WebhookEvent {\n\t\treturn {\n\t\t\tmeta: {\n\t\t\t\teventId: it.id,\n\t\t\t\ttransactionId: it.transaction_id,\n\t\t\t\tcreatedAt: it.created_at.toISOString(),\n\t\t\t\tlastStateChange: it.last_state_change.toISOString(),\n\t\t\t\tnumRetries: it.num_retries,\n\t\t\t\ttrigger: it.trigger,\n\t\t\t\ttarget: it.target,\n\t\t\t\t// todo: add stage and schema version\n\t\t\t},\n\t\t\t...it.payload,\n\t\t}\n\t}\n\n\tprivate resolveVariables(subject: string, variables: VariablesMap) {\n\t\treturn subject.replace(/\\{\\{([\\w_]+)}}/gm, (_, name) => {\n\t\t\tif (!variables[name]) {\n\t\t\t\tthrow new Error(`Undefined variable ${name}`)\n\t\t\t}\n\t\t\treturn variables[name]\n\t\t})\n\t}\n}\n\nconst withTimeout = async <T>(timeoutMs: number, cb: (abortController: AbortController) => Promise<T>): Promise<T> => {\n\tconst abortController = new AbortController()\n\tconst timeoutId = setTimeout(() => {\n\t\tabortController.abort()\n\t}, timeoutMs)\n\ttry {\n\t\treturn await cb(abortController)\n\t} finally {\n\t\tclearTimeout(timeoutId)\n\t}\n}\n"],"names":["Typesafe"],"mappings":";;;;;;;;;;;;;;;;;;;;AAMA,MAAM,qBAAqB;AAE3B,MAAM,eAAeA,oBAAS,aAAaA,oBAAS,OAAO;AAAA,EAC1D,UAAUA,oBAAS;AAAA,IAClBA,oBAAS;AAAA,MACRA,oBAAS,OAAO;AAAA,QACf,SAASA,oBAAS;AAAA,MAAA,CAClB;AAAA,MACDA,oBAAS,QAAQ;AAAA,QAChB,OAAOA,oBAAS;AAAA,MAChB,CAAA;AAAA,IAAA;AAAA,EACF;AAEF,CAAC,CAAC;AAIK,MAAM,qBAAqE;AAAA,EACjF,YACkB,SAChB;AADgB,SAAA,UAAA;AAAA,EAAA;AAAA,EAIlB,MAAa,OAAO,EAAE,QAAQ,QAAQ,QAAQ,aAAgF;AAC7H,UAAM,YAAY,OAAO;AAEnB,UAAA,QAAQ,QAAQ,OAAO,OAAO;AACpC,UAAM,cAAc,MAAM,KAAK,MAAM,QAAQ,QAAQ,OAAO,OAAA,IAAW,SAAS,OAAO,GAAS,CAAC,CAAC;AAE9F,QAAA;AACA,QAAA;AAEG,YAAA,WAAW,MAAM,KAAK,MAAM,aAAa,oBAAoB,QAAQ,WAAW,MAAM;AAE5F,6BAAuB,KAAK,sBAAsB;AAAA,QACjD;AAAA,QACA;AAAA,MAAA,CACA;AAAA,aAEO,GAAG;AACX,aAAO,KAAK,CAAC;AACP,YAAA,gBAAgB,KAAK,qBAAqB,CAAC;AACjD,YAAM,SAAS;AAAA,QACd,IAAI;AAAA,QACJ,cAAc,cAAc,SAAS,cAAc,KAAK,IAAI,IAAI;AAAA,QAChE,YAAY,YAAY;AAAA,MACzB;AACuB,6BAAA,OAAO,EAAE,IAAI,OAAO,cAAc,cAAc,SAAS,cAAc,KAAK,IAAI,IAAI,OAAU;AAE9G,aAAA,OAAO,IAAI,CAAO,QAAA,EAAE,QAAQ,KAAK,IAAI,SAAS;AAAA,IAAA;AAEtD,UAAM,aAAa,YAAY;AAE/B,WAAO,OAAO,IAAI,CAAO,QAAA,EAAE,QAAQ,KAAK,IAAI,QAAQ,EAAE,YAAY,GAAG,qBAAqB,EAAE,EAAA,EAAM,EAAA;AAAA,EAAA;AAAA,EAG3F,sBAAsB,EAAE,UAAU,UAGjB;AACpB,QAAA,CAAC,SAAS,IAAI;AACjB,aAAO,OAAO;AAAA,QACb,IAAI;AAAA,QACJ,MAAM,SAAS;AAAA,QACf,UAAU,SAAS;AAAA,QACnB,cAAc,SAAS;AAAA,MAAA;AAAA,IACxB;AAGD,QAAI,SAAS,aAAa,KAAK,MAAM,MACjC,CAAC,SAAS,QAAQ,IAAI,cAAc,GAAG,YAAc,EAAA,SAAS,MAAM,GACtE;AACD,aAAO,OAAO;AAAA,QACb,IAAI;AAAA,QACJ,MAAM,SAAS;AAAA,MAAA;AAAA,IAChB;AAGG,QAAA;AACH,YAAM,aAAa,KAAK,MAAM,SAAS,YAAY;AACnD,UAAI,eAAe,QAAQ,OAAO,eAAe,YAAY,EAAE,cAAc,aAAa;AACzF,eAAO,OAAO;AAAA,UACb,IAAI;AAAA,UACJ,MAAM,SAAS;AAAA,QAAA;AAAA,MAChB;AAEK,YAAA,eAAe,aAAa,UAAU;AACtC,YAAA,gBAAgB,IAAI,IAAI,OAAO,IAAI,CAAM,OAAA,GAAG,EAAE,CAAC;AACrD,YAAM,eAAe,OAAO,YAAY,aAAa,UAAU,IAAI,CAAA,OAAM,CAAC,GAAG,SAAS,EAAE,CAAC,KAAK,CAAA,CAAE;AAC1F,YAAA,gBAAiB,OAAO,KAAK,YAAY,EAAE,OAAO,CAAA,OAAM,CAAC,cAAc,IAAI,EAAE,CAAC;AAEpF,UAAI,cAAc,QAAQ;AACzB,eAAO,OAAO;AAAA,UACb,IAAI;AAAA,UACJ,MAAM,SAAS;AAAA,UACf,UAAU,SAAS;AAAA,UACnB,cAAc,6CAA6C,cAAc,KAAK,IAAI;AAAA,QAAA;AAAA,MACnF;AAGD,aAAO,CAAM,OAAA;AACZ,YAAI,CAAC,aAAa,GAAG,EAAE,GAAG;AACzB,iBAAO,EAAE,IAAI,MAAM,MAAM,SAAS,OAAO;AAAA,QAAA;AAEnC,eAAA;AAAA,UACN,IAAI;AAAA,UACJ,MAAM,SAAS;AAAA,UACf,cAAc,aAAa,GAAG,EAAE,EAAE;AAAA,QACnC;AAAA,MACD;AAAA,aACQ,GAAQ;AAChB,aAAO,OAAO;AAAA,QACb,IAAI;AAAA,QACJ,MAAM,SAAS;AAAA,QACf,UAAU,SAAS;AAAA,QACnB,cAAc,uBAAuB,EAAE;AAAA,MAAA;AAAA,IACxC;AAAA,EACD;AAAA,EAGO,qBAAqB,GAAsB;AAClD,UAAM,gBAAgB,CAAC;AACvB,QAAI,MAAM;AACH,WAAA,OAAO,QAAQ,YAAY,QAAQ,QAAQ,aAAa,OAAO,OAAQ,IAAY,YAAY,UAAU;AACjG,oBAAA,KAAM,IAAY,OAAO;AACvC,YAAO,IAAY;AAAA,IAAA;AAEb,WAAA;AAAA,EAAA;AAAA,EAGR,MAAc,MAAM,WAAmB,QAA+B,WAAyB,QAA8C;AAC5I,WAAO,MAAM,YAAY,WAAW,OAAM,oBAAmB;AAC5D,aAAO,MAAM,KAAK,QAAQ,QAAQ,WAAW,iBAAiB,MAAM;AAAA,IAAA,CACpE;AAAA,EAAA;AAAA,EAGF,MAAc,QAAQ,QAA+B,WAAyB,iBAAkC,QAA8C;AAC7J,UAAM,cAAc,KAAK,iBAAiB,OAAO,KAAK,SAAS;AACzD,UAAA,kBAAkB,OAAO,YAAY,OAAO,QAAQ,OAAO,WAAW,CAAE,CAAA,EAC5E,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,KAAK,iBAAiB,OAAO,SAAS,CAAC,CAAC,CAAC;AAEvE,WAAO,MAAM,KAAK,QAAQ,MAAM,aAAa;AAAA,MAC5C,QAAQ;AAAA,MACR,SAAS;AAAA,QACR,CAAC,YAAY,GAAG;AAAA,QAChB,GAAG;AAAA,QACH,CAAC,cAAc,GAAG;AAAA,MACnB;AAAA,MACA,QAAQ,gBAAgB;AAAA,MACxB,MAAM,KAAK,WAAW,QAAQ,MAAM;AAAA,IAAA,CACpC;AAAA,EAAA;AAAA,EAGM,WAAW,QAAoB,QAAuC;AA/J/E,QAAA;AAgKQ,UAAA,OAAO,OAAO,QAAQ,CAAC;AACvB,UAAA,OAAO,OAAO,eAAe,CAAC;AACpC,QAAI,UAAe;AACnB,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACrC,cAAA,KAAQ,KAAK,CAAC,CAAd,MAAA,QAAA,EAAA,IAAqB;AACX,gBAAA,QAAQ,KAAK,CAAC,CAAC;AAAA,IAAA;AAE1B,YAAQ,QAAQ,IAAI,OAAO,IAAI,KAAK,kBAAkB;AAC/C,WAAA,KAAK,UAAU,IAAI;AAAA,EAAA;AAAA,EAGnB,mBAAmB,IAA2C;AAC9D,WAAA;AAAA,MACN,MAAM;AAAA,QACL,SAAS,GAAG;AAAA,QACZ,eAAe,GAAG;AAAA,QAClB,WAAW,GAAG,WAAW,YAAY;AAAA,QACrC,iBAAiB,GAAG,kBAAkB,YAAY;AAAA,QAClD,YAAY,GAAG;AAAA,QACf,SAAS,GAAG;AAAA,QACZ,QAAQ,GAAG;AAAA;AAAA,MAEZ;AAAA,MACA,GAAG,GAAG;AAAA,IACP;AAAA,EAAA;AAAA,EAGO,iBAAiB,SAAiB,WAAyB;AAClE,WAAO,QAAQ,QAAQ,oBAAoB,CAAC,GAAG,SAAS;AACnD,UAAA,CAAC,UAAU,IAAI,GAAG;AACrB,cAAM,IAAI,MAAM,sBAAsB,IAAI,EAAE;AAAA,MAAA;AAE7C,aAAO,UAAU,IAAI;AAAA,IAAA,CACrB;AAAA,EAAA;AAEH;AAEA,MAAM,cAAc,OAAU,WAAmB,OAAqE;AAC/G,QAAA,kBAAkB,IAAI,gBAAgB;AACtC,QAAA,YAAY,WAAW,MAAM;AAClC,oBAAgB,MAAM;AAAA,KACpB,SAAS;AACR,MAAA;AACI,WAAA,MAAM,GAAG,eAAe;AAAA,EAAA,UAC9B;AACD,iBAAa,SAAS;AAAA,EAAA;AAExB;;"}
|
|
1
|
+
{"version":3,"file":"WebhookTargetHandler.cjs","sources":["../../../../../packages/engine-actions/src/dispatch/WebhookTargetHandler.ts"],"sourcesContent":["import { Actions, ActionsPayload } from '@contember/schema'\nimport { EventRow, HandledEvent, InvokeHandler, InvokeHandlerArgs } from './types'\nimport { VariablesMap } from '../model/VariablesManager'\nimport * as Typesafe from '@contember/typesafe'\nimport { FetcherResponse, WebhookFetcher } from './WebhookFetcher'\n\nconst DEFAULT_TIMEOUT_MS = 30_000 // 30 seconds\n\nconst ResponseType = Typesafe.noExtraProps(Typesafe.object({\n\tfailures: Typesafe.array(\n\t\tTypesafe.intersection(\n\t\t\tTypesafe.object({\n\t\t\t\teventId: Typesafe.string,\n\t\t\t}),\n\t\t\tTypesafe.partial({\n\t\t\t\terror: Typesafe.string,\n\t\t\t}),\n\t\t),\n\t),\n}))\n\ntype EventResponseFactory = (eventRow: EventRow) => ({ ok: boolean; code?: number; response?: string; errorMessage?: string; durationMs?: number })\n\nexport class WebhookTargetHandler implements InvokeHandler<Actions.WebhookTarget> {\n\tconstructor(\n\t\tprivate readonly fetcher: WebhookFetcher,\n\t) {\n\t}\n\n\tpublic async handle({ target, events, logger, variables }: InvokeHandlerArgs<Actions.WebhookTarget>): Promise<HandledEvent[]> {\n\t\tconst timeoutMs = target.timeoutMs\n\n\t\tconst start = process.hrtime.bigint()\n\t\tconst getDuration = () => Math.floor(Number((process.hrtime.bigint() - start) / BigInt(1_000_000)))\n\n\t\tlet eventResponseFactory: EventResponseFactory\n\t\ttry {\n\n\t\t\tconst response = await this.fetch(timeoutMs ?? DEFAULT_TIMEOUT_MS, target, variables, events)\n\n\t\t\teventResponseFactory = this.createResponseFactory({\n\t\t\t\tresponse: response,\n\t\t\t\tevents,\n\t\t\t})\n\n\t\t} catch (e) {\n\t\t\tlogger.warn(e)\n\t\t\tconst errorMessages = this.extractErrorMessages(e)\n\t\t\tconst result = {\n\t\t\t\tok: false,\n\t\t\t\terrorMessage: errorMessages.length ? errorMessages.join('; ') : undefined,\n\t\t\t\tdurationMs: getDuration(),\n\t\t\t}\n\t\t\teventResponseFactory = () => ({ ok: false, errorMessage: errorMessages.length ? errorMessages.join('; ') : undefined })\n\n\t\t\treturn events.map(it => ({ target, row: it, result }))\n\t\t}\n\t\tconst durationMs = getDuration()\n\n\t\treturn events.map(it => ({ target, row: it, result: { durationMs, ...eventResponseFactory(it) } }))\n\t}\n\n\tprivate createResponseFactory({ response, events }: {\n\t\tresponse: FetcherResponse\n\t\tevents: EventRow[]\n\t}): EventResponseFactory {\n\t\tif (!response.ok) {\n\t\t\treturn () => ({\n\t\t\t\tok: false,\n\t\t\t\tcode: response.status,\n\t\t\t\tresponse: response.responseText,\n\t\t\t\terrorMessage: response.statusText,\n\t\t\t})\n\t\t}\n\n\t\tif (response.responseText.trim() === ''\n\t\t\t|| !response.headers.get('content-type')?.toLowerCase().includes('json')\n\t\t) {\n\t\t\treturn () => ({\n\t\t\t\tok: true,\n\t\t\t\tcode: response.status,\n\t\t\t})\n\t\t}\n\n\t\ttry {\n\t\t\tconst parsedJson = JSON.parse(response.responseText)\n\t\t\tif (parsedJson === null || typeof parsedJson !== 'object' || !('failures' in parsedJson)) {\n\t\t\t\treturn () => ({\n\t\t\t\t\tok: true,\n\t\t\t\t\tcode: response.status,\n\t\t\t\t})\n\t\t\t}\n\t\t\tconst responseData = ResponseType(parsedJson)\n\t\t\tconst eventsInBatch = new Set(events.map(it => it.id))\n\t\t\tconst failedEvents = Object.fromEntries(responseData.failures?.map(it => [it.eventId, it]) ?? [])\n\t\t\tconst missingEvents = Object.keys(failedEvents).filter(it => !eventsInBatch.has(it))\n\n\t\t\tif (missingEvents.length) {\n\t\t\t\treturn () => ({\n\t\t\t\t\tok: false,\n\t\t\t\t\tcode: response.status,\n\t\t\t\t\tresponse: response.responseText,\n\t\t\t\t\terrorMessage: 'Invalid response: undefined events IDs: ' + missingEvents.join('; '),\n\t\t\t\t})\n\t\t\t}\n\n\t\t\treturn it => {\n\t\t\t\tif (!failedEvents[it.id]) {\n\t\t\t\t\treturn { ok: true, code: response.status }\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tok: false,\n\t\t\t\t\tcode: response.status,\n\t\t\t\t\terrorMessage: failedEvents[it.id].error,\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e: any) {\n\t\t\treturn () => ({\n\t\t\t\tok: false,\n\t\t\t\tcode: response.status,\n\t\t\t\tresponse: response.responseText,\n\t\t\t\terrorMessage: 'Invalid response: ' + e.message,\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate extractErrorMessages(e: unknown): string[] {\n\t\tconst errorMessages = []\n\t\tlet err = e\n\t\twhile (typeof err === 'object' && err !== null && 'message' in err && typeof (err as any).message === 'string') {\n\t\t\terrorMessages.push((err as any).message)\n\t\t\terr = (err as any).cause\n\t\t}\n\t\treturn errorMessages\n\t}\n\n\tprivate async fetch(timeoutMs: number, target: Actions.WebhookTarget, variables: VariablesMap, events: EventRow[]): Promise<FetcherResponse> {\n\t\treturn await withTimeout(timeoutMs, async abortController => {\n\t\t\treturn await this.doFetch(target, variables, abortController, events)\n\t\t})\n\t}\n\n\tprivate async doFetch(target: Actions.WebhookTarget, variables: VariablesMap, abortController: AbortController, events: EventRow[]): Promise<FetcherResponse> {\n\t\tconst resolvedUrl = this.resolveVariables(target.url, variables)\n\t\tconst resolvedHeaders = Object.fromEntries(Object.entries(target.headers ?? {})\n\t\t\t.map(([key, value]) => [key, this.resolveVariables(value, variables)]))\n\n\t\treturn await this.fetcher.fetch(resolvedUrl, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t['User-Agent']: 'Contember Actions',\n\t\t\t\t...resolvedHeaders,\n\t\t\t\t['Content-type']: 'application/json',\n\t\t\t},\n\t\t\tsignal: abortController.signal,\n\t\t\tbody: this.formatBody(events, target),\n\t\t})\n\t}\n\n\tprivate formatBody(events: EventRow[], target: Actions.WebhookTarget): string {\n\t\tconst body = target.body ?? {}\n\t\tconst path = target.payloadPath ?? []\n\t\tlet current: any = body\n\t\tfor (let i = 0; i < path.length; i++) {\n\t\t\tcurrent[path[i]] ??= {}\n\t\t\tcurrent = current[path[i]]\n\t\t}\n\t\tcurrent['events'] = events.map(this.formatEventPayload)\n\t\treturn JSON.stringify(body)\n\t}\n\n\tprivate formatEventPayload(it: EventRow): ActionsPayload.WebhookEvent {\n\t\treturn {\n\t\t\tmeta: {\n\t\t\t\teventId: it.id,\n\t\t\t\ttransactionId: it.transaction_id,\n\t\t\t\tidentityId: it.identity_id ?? null,\n\t\t\t\tipAddress: it.ip_address ?? null,\n\t\t\t\tuserAgent: it.user_agent ?? null,\n\t\t\t\tcreatedAt: it.created_at.toISOString(),\n\t\t\t\tlastStateChange: it.last_state_change.toISOString(),\n\t\t\t\tnumRetries: it.num_retries,\n\t\t\t\ttrigger: it.trigger,\n\t\t\t\ttarget: it.target,\n\t\t\t\t// todo: add stage and schema version\n\t\t\t},\n\t\t\t...it.payload,\n\t\t}\n\t}\n\n\tprivate resolveVariables(subject: string, variables: VariablesMap) {\n\t\treturn subject.replace(/\\{\\{([\\w_]+)}}/gm, (_, name) => {\n\t\t\tif (!variables[name]) {\n\t\t\t\tthrow new Error(`Undefined variable ${name}`)\n\t\t\t}\n\t\t\treturn variables[name]\n\t\t})\n\t}\n}\n\nconst withTimeout = async <T>(timeoutMs: number, cb: (abortController: AbortController) => Promise<T>): Promise<T> => {\n\tconst abortController = new AbortController()\n\tconst timeoutId = setTimeout(() => {\n\t\tabortController.abort()\n\t}, timeoutMs)\n\ttry {\n\t\treturn await cb(abortController)\n\t} finally {\n\t\tclearTimeout(timeoutId)\n\t}\n}\n"],"names":["Typesafe"],"mappings":"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"}
|
|
@@ -140,6 +140,9 @@ class WebhookTargetHandler {
|
|
|
140
140
|
meta: {
|
|
141
141
|
eventId: it.id,
|
|
142
142
|
transactionId: it.transaction_id,
|
|
143
|
+
identityId: it.identity_id ?? null,
|
|
144
|
+
ipAddress: it.ip_address ?? null,
|
|
145
|
+
userAgent: it.user_agent ?? null,
|
|
143
146
|
createdAt: it.created_at.toISOString(),
|
|
144
147
|
lastStateChange: it.last_state_change.toISOString(),
|
|
145
148
|
numRetries: it.num_retries,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebhookTargetHandler.js","sources":["../../../../../packages/engine-actions/src/dispatch/WebhookTargetHandler.ts"],"sourcesContent":["import { Actions, ActionsPayload } from '@contember/schema'\nimport { EventRow, HandledEvent, InvokeHandler, InvokeHandlerArgs } from './types'\nimport { VariablesMap } from '../model/VariablesManager'\nimport * as Typesafe from '@contember/typesafe'\nimport { FetcherResponse, WebhookFetcher } from './WebhookFetcher'\n\nconst DEFAULT_TIMEOUT_MS = 30_000 // 30 seconds\n\nconst ResponseType = Typesafe.noExtraProps(Typesafe.object({\n\tfailures: Typesafe.array(\n\t\tTypesafe.intersection(\n\t\t\tTypesafe.object({\n\t\t\t\teventId: Typesafe.string,\n\t\t\t}),\n\t\t\tTypesafe.partial({\n\t\t\t\terror: Typesafe.string,\n\t\t\t}),\n\t\t),\n\t),\n}))\n\ntype EventResponseFactory = (eventRow: EventRow) => ({ ok: boolean; code?: number; response?: string; errorMessage?: string; durationMs?: number })\n\nexport class WebhookTargetHandler implements InvokeHandler<Actions.WebhookTarget> {\n\tconstructor(\n\t\tprivate readonly fetcher: WebhookFetcher,\n\t) {\n\t}\n\n\tpublic async handle({ target, events, logger, variables }: InvokeHandlerArgs<Actions.WebhookTarget>): Promise<HandledEvent[]> {\n\t\tconst timeoutMs = target.timeoutMs\n\n\t\tconst start = process.hrtime.bigint()\n\t\tconst getDuration = () => Math.floor(Number((process.hrtime.bigint() - start) / BigInt(1_000_000)))\n\n\t\tlet eventResponseFactory: EventResponseFactory\n\t\ttry {\n\n\t\t\tconst response = await this.fetch(timeoutMs ?? DEFAULT_TIMEOUT_MS, target, variables, events)\n\n\t\t\teventResponseFactory = this.createResponseFactory({\n\t\t\t\tresponse: response,\n\t\t\t\tevents,\n\t\t\t})\n\n\t\t} catch (e) {\n\t\t\tlogger.warn(e)\n\t\t\tconst errorMessages = this.extractErrorMessages(e)\n\t\t\tconst result = {\n\t\t\t\tok: false,\n\t\t\t\terrorMessage: errorMessages.length ? errorMessages.join('; ') : undefined,\n\t\t\t\tdurationMs: getDuration(),\n\t\t\t}\n\t\t\teventResponseFactory = () => ({ ok: false, errorMessage: errorMessages.length ? errorMessages.join('; ') : undefined })\n\n\t\t\treturn events.map(it => ({ target, row: it, result }))\n\t\t}\n\t\tconst durationMs = getDuration()\n\n\t\treturn events.map(it => ({ target, row: it, result: { durationMs, ...eventResponseFactory(it) } }))\n\t}\n\n\tprivate createResponseFactory({ response, events }: {\n\t\tresponse: FetcherResponse\n\t\tevents: EventRow[]\n\t}): EventResponseFactory {\n\t\tif (!response.ok) {\n\t\t\treturn () => ({\n\t\t\t\tok: false,\n\t\t\t\tcode: response.status,\n\t\t\t\tresponse: response.responseText,\n\t\t\t\terrorMessage: response.statusText,\n\t\t\t})\n\t\t}\n\n\t\tif (response.responseText.trim() === ''\n\t\t\t|| !response.headers.get('content-type')?.toLowerCase().includes('json')\n\t\t) {\n\t\t\treturn () => ({\n\t\t\t\tok: true,\n\t\t\t\tcode: response.status,\n\t\t\t})\n\t\t}\n\n\t\ttry {\n\t\t\tconst parsedJson = JSON.parse(response.responseText)\n\t\t\tif (parsedJson === null || typeof parsedJson !== 'object' || !('failures' in parsedJson)) {\n\t\t\t\treturn () => ({\n\t\t\t\t\tok: true,\n\t\t\t\t\tcode: response.status,\n\t\t\t\t})\n\t\t\t}\n\t\t\tconst responseData = ResponseType(parsedJson)\n\t\t\tconst eventsInBatch = new Set(events.map(it => it.id))\n\t\t\tconst failedEvents = Object.fromEntries(responseData.failures?.map(it => [it.eventId, it]) ?? [])\n\t\t\tconst missingEvents = Object.keys(failedEvents).filter(it => !eventsInBatch.has(it))\n\n\t\t\tif (missingEvents.length) {\n\t\t\t\treturn () => ({\n\t\t\t\t\tok: false,\n\t\t\t\t\tcode: response.status,\n\t\t\t\t\tresponse: response.responseText,\n\t\t\t\t\terrorMessage: 'Invalid response: undefined events IDs: ' + missingEvents.join('; '),\n\t\t\t\t})\n\t\t\t}\n\n\t\t\treturn it => {\n\t\t\t\tif (!failedEvents[it.id]) {\n\t\t\t\t\treturn { ok: true, code: response.status }\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tok: false,\n\t\t\t\t\tcode: response.status,\n\t\t\t\t\terrorMessage: failedEvents[it.id].error,\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e: any) {\n\t\t\treturn () => ({\n\t\t\t\tok: false,\n\t\t\t\tcode: response.status,\n\t\t\t\tresponse: response.responseText,\n\t\t\t\terrorMessage: 'Invalid response: ' + e.message,\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate extractErrorMessages(e: unknown): string[] {\n\t\tconst errorMessages = []\n\t\tlet err = e\n\t\twhile (typeof err === 'object' && err !== null && 'message' in err && typeof (err as any).message === 'string') {\n\t\t\terrorMessages.push((err as any).message)\n\t\t\terr = (err as any).cause\n\t\t}\n\t\treturn errorMessages\n\t}\n\n\tprivate async fetch(timeoutMs: number, target: Actions.WebhookTarget, variables: VariablesMap, events: EventRow[]): Promise<FetcherResponse> {\n\t\treturn await withTimeout(timeoutMs, async abortController => {\n\t\t\treturn await this.doFetch(target, variables, abortController, events)\n\t\t})\n\t}\n\n\tprivate async doFetch(target: Actions.WebhookTarget, variables: VariablesMap, abortController: AbortController, events: EventRow[]): Promise<FetcherResponse> {\n\t\tconst resolvedUrl = this.resolveVariables(target.url, variables)\n\t\tconst resolvedHeaders = Object.fromEntries(Object.entries(target.headers ?? {})\n\t\t\t.map(([key, value]) => [key, this.resolveVariables(value, variables)]))\n\n\t\treturn await this.fetcher.fetch(resolvedUrl, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t['User-Agent']: 'Contember Actions',\n\t\t\t\t...resolvedHeaders,\n\t\t\t\t['Content-type']: 'application/json',\n\t\t\t},\n\t\t\tsignal: abortController.signal,\n\t\t\tbody: this.formatBody(events, target),\n\t\t})\n\t}\n\n\tprivate formatBody(events: EventRow[], target: Actions.WebhookTarget): string {\n\t\tconst body = target.body ?? {}\n\t\tconst path = target.payloadPath ?? []\n\t\tlet current: any = body\n\t\tfor (let i = 0; i < path.length; i++) {\n\t\t\tcurrent[path[i]] ??= {}\n\t\t\tcurrent = current[path[i]]\n\t\t}\n\t\tcurrent['events'] = events.map(this.formatEventPayload)\n\t\treturn JSON.stringify(body)\n\t}\n\n\tprivate formatEventPayload(it: EventRow): ActionsPayload.WebhookEvent {\n\t\treturn {\n\t\t\tmeta: {\n\t\t\t\teventId: it.id,\n\t\t\t\ttransactionId: it.transaction_id,\n\t\t\t\tcreatedAt: it.created_at.toISOString(),\n\t\t\t\tlastStateChange: it.last_state_change.toISOString(),\n\t\t\t\tnumRetries: it.num_retries,\n\t\t\t\ttrigger: it.trigger,\n\t\t\t\ttarget: it.target,\n\t\t\t\t// todo: add stage and schema version\n\t\t\t},\n\t\t\t...it.payload,\n\t\t}\n\t}\n\n\tprivate resolveVariables(subject: string, variables: VariablesMap) {\n\t\treturn subject.replace(/\\{\\{([\\w_]+)}}/gm, (_, name) => {\n\t\t\tif (!variables[name]) {\n\t\t\t\tthrow new Error(`Undefined variable ${name}`)\n\t\t\t}\n\t\t\treturn variables[name]\n\t\t})\n\t}\n}\n\nconst withTimeout = async <T>(timeoutMs: number, cb: (abortController: AbortController) => Promise<T>): Promise<T> => {\n\tconst abortController = new AbortController()\n\tconst timeoutId = setTimeout(() => {\n\t\tabortController.abort()\n\t}, timeoutMs)\n\ttry {\n\t\treturn await cb(abortController)\n\t} finally {\n\t\tclearTimeout(timeoutId)\n\t}\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"WebhookTargetHandler.js","sources":["../../../../../packages/engine-actions/src/dispatch/WebhookTargetHandler.ts"],"sourcesContent":["import { Actions, ActionsPayload } from '@contember/schema'\nimport { EventRow, HandledEvent, InvokeHandler, InvokeHandlerArgs } from './types'\nimport { VariablesMap } from '../model/VariablesManager'\nimport * as Typesafe from '@contember/typesafe'\nimport { FetcherResponse, WebhookFetcher } from './WebhookFetcher'\n\nconst DEFAULT_TIMEOUT_MS = 30_000 // 30 seconds\n\nconst ResponseType = Typesafe.noExtraProps(Typesafe.object({\n\tfailures: Typesafe.array(\n\t\tTypesafe.intersection(\n\t\t\tTypesafe.object({\n\t\t\t\teventId: Typesafe.string,\n\t\t\t}),\n\t\t\tTypesafe.partial({\n\t\t\t\terror: Typesafe.string,\n\t\t\t}),\n\t\t),\n\t),\n}))\n\ntype EventResponseFactory = (eventRow: EventRow) => ({ ok: boolean; code?: number; response?: string; errorMessage?: string; durationMs?: number })\n\nexport class WebhookTargetHandler implements InvokeHandler<Actions.WebhookTarget> {\n\tconstructor(\n\t\tprivate readonly fetcher: WebhookFetcher,\n\t) {\n\t}\n\n\tpublic async handle({ target, events, logger, variables }: InvokeHandlerArgs<Actions.WebhookTarget>): Promise<HandledEvent[]> {\n\t\tconst timeoutMs = target.timeoutMs\n\n\t\tconst start = process.hrtime.bigint()\n\t\tconst getDuration = () => Math.floor(Number((process.hrtime.bigint() - start) / BigInt(1_000_000)))\n\n\t\tlet eventResponseFactory: EventResponseFactory\n\t\ttry {\n\n\t\t\tconst response = await this.fetch(timeoutMs ?? DEFAULT_TIMEOUT_MS, target, variables, events)\n\n\t\t\teventResponseFactory = this.createResponseFactory({\n\t\t\t\tresponse: response,\n\t\t\t\tevents,\n\t\t\t})\n\n\t\t} catch (e) {\n\t\t\tlogger.warn(e)\n\t\t\tconst errorMessages = this.extractErrorMessages(e)\n\t\t\tconst result = {\n\t\t\t\tok: false,\n\t\t\t\terrorMessage: errorMessages.length ? errorMessages.join('; ') : undefined,\n\t\t\t\tdurationMs: getDuration(),\n\t\t\t}\n\t\t\teventResponseFactory = () => ({ ok: false, errorMessage: errorMessages.length ? errorMessages.join('; ') : undefined })\n\n\t\t\treturn events.map(it => ({ target, row: it, result }))\n\t\t}\n\t\tconst durationMs = getDuration()\n\n\t\treturn events.map(it => ({ target, row: it, result: { durationMs, ...eventResponseFactory(it) } }))\n\t}\n\n\tprivate createResponseFactory({ response, events }: {\n\t\tresponse: FetcherResponse\n\t\tevents: EventRow[]\n\t}): EventResponseFactory {\n\t\tif (!response.ok) {\n\t\t\treturn () => ({\n\t\t\t\tok: false,\n\t\t\t\tcode: response.status,\n\t\t\t\tresponse: response.responseText,\n\t\t\t\terrorMessage: response.statusText,\n\t\t\t})\n\t\t}\n\n\t\tif (response.responseText.trim() === ''\n\t\t\t|| !response.headers.get('content-type')?.toLowerCase().includes('json')\n\t\t) {\n\t\t\treturn () => ({\n\t\t\t\tok: true,\n\t\t\t\tcode: response.status,\n\t\t\t})\n\t\t}\n\n\t\ttry {\n\t\t\tconst parsedJson = JSON.parse(response.responseText)\n\t\t\tif (parsedJson === null || typeof parsedJson !== 'object' || !('failures' in parsedJson)) {\n\t\t\t\treturn () => ({\n\t\t\t\t\tok: true,\n\t\t\t\t\tcode: response.status,\n\t\t\t\t})\n\t\t\t}\n\t\t\tconst responseData = ResponseType(parsedJson)\n\t\t\tconst eventsInBatch = new Set(events.map(it => it.id))\n\t\t\tconst failedEvents = Object.fromEntries(responseData.failures?.map(it => [it.eventId, it]) ?? [])\n\t\t\tconst missingEvents = Object.keys(failedEvents).filter(it => !eventsInBatch.has(it))\n\n\t\t\tif (missingEvents.length) {\n\t\t\t\treturn () => ({\n\t\t\t\t\tok: false,\n\t\t\t\t\tcode: response.status,\n\t\t\t\t\tresponse: response.responseText,\n\t\t\t\t\terrorMessage: 'Invalid response: undefined events IDs: ' + missingEvents.join('; '),\n\t\t\t\t})\n\t\t\t}\n\n\t\t\treturn it => {\n\t\t\t\tif (!failedEvents[it.id]) {\n\t\t\t\t\treturn { ok: true, code: response.status }\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tok: false,\n\t\t\t\t\tcode: response.status,\n\t\t\t\t\terrorMessage: failedEvents[it.id].error,\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e: any) {\n\t\t\treturn () => ({\n\t\t\t\tok: false,\n\t\t\t\tcode: response.status,\n\t\t\t\tresponse: response.responseText,\n\t\t\t\terrorMessage: 'Invalid response: ' + e.message,\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate extractErrorMessages(e: unknown): string[] {\n\t\tconst errorMessages = []\n\t\tlet err = e\n\t\twhile (typeof err === 'object' && err !== null && 'message' in err && typeof (err as any).message === 'string') {\n\t\t\terrorMessages.push((err as any).message)\n\t\t\terr = (err as any).cause\n\t\t}\n\t\treturn errorMessages\n\t}\n\n\tprivate async fetch(timeoutMs: number, target: Actions.WebhookTarget, variables: VariablesMap, events: EventRow[]): Promise<FetcherResponse> {\n\t\treturn await withTimeout(timeoutMs, async abortController => {\n\t\t\treturn await this.doFetch(target, variables, abortController, events)\n\t\t})\n\t}\n\n\tprivate async doFetch(target: Actions.WebhookTarget, variables: VariablesMap, abortController: AbortController, events: EventRow[]): Promise<FetcherResponse> {\n\t\tconst resolvedUrl = this.resolveVariables(target.url, variables)\n\t\tconst resolvedHeaders = Object.fromEntries(Object.entries(target.headers ?? {})\n\t\t\t.map(([key, value]) => [key, this.resolveVariables(value, variables)]))\n\n\t\treturn await this.fetcher.fetch(resolvedUrl, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t['User-Agent']: 'Contember Actions',\n\t\t\t\t...resolvedHeaders,\n\t\t\t\t['Content-type']: 'application/json',\n\t\t\t},\n\t\t\tsignal: abortController.signal,\n\t\t\tbody: this.formatBody(events, target),\n\t\t})\n\t}\n\n\tprivate formatBody(events: EventRow[], target: Actions.WebhookTarget): string {\n\t\tconst body = target.body ?? {}\n\t\tconst path = target.payloadPath ?? []\n\t\tlet current: any = body\n\t\tfor (let i = 0; i < path.length; i++) {\n\t\t\tcurrent[path[i]] ??= {}\n\t\t\tcurrent = current[path[i]]\n\t\t}\n\t\tcurrent['events'] = events.map(this.formatEventPayload)\n\t\treturn JSON.stringify(body)\n\t}\n\n\tprivate formatEventPayload(it: EventRow): ActionsPayload.WebhookEvent {\n\t\treturn {\n\t\t\tmeta: {\n\t\t\t\teventId: it.id,\n\t\t\t\ttransactionId: it.transaction_id,\n\t\t\t\tidentityId: it.identity_id ?? null,\n\t\t\t\tipAddress: it.ip_address ?? null,\n\t\t\t\tuserAgent: it.user_agent ?? null,\n\t\t\t\tcreatedAt: it.created_at.toISOString(),\n\t\t\t\tlastStateChange: it.last_state_change.toISOString(),\n\t\t\t\tnumRetries: it.num_retries,\n\t\t\t\ttrigger: it.trigger,\n\t\t\t\ttarget: it.target,\n\t\t\t\t// todo: add stage and schema version\n\t\t\t},\n\t\t\t...it.payload,\n\t\t}\n\t}\n\n\tprivate resolveVariables(subject: string, variables: VariablesMap) {\n\t\treturn subject.replace(/\\{\\{([\\w_]+)}}/gm, (_, name) => {\n\t\t\tif (!variables[name]) {\n\t\t\t\tthrow new Error(`Undefined variable ${name}`)\n\t\t\t}\n\t\t\treturn variables[name]\n\t\t})\n\t}\n}\n\nconst withTimeout = async <T>(timeoutMs: number, cb: (abortController: AbortController) => Promise<T>): Promise<T> => {\n\tconst abortController = new AbortController()\n\tconst timeoutId = setTimeout(() => {\n\t\tabortController.abort()\n\t}, timeoutMs)\n\ttry {\n\t\treturn await cb(abortController)\n\t} finally {\n\t\tclearTimeout(timeoutId)\n\t}\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -17,6 +17,7 @@ class ActionsApiMiddlewareFactory {
|
|
|
17
17
|
const graphqlContext = {
|
|
18
18
|
db: systemDatabase,
|
|
19
19
|
logger,
|
|
20
|
+
project: projectContainer.project,
|
|
20
21
|
contentSchemaResolver: projectContainer.contentSchemaResolver,
|
|
21
22
|
requireAccess: async (action, message) => {
|
|
22
23
|
if (!await this.authorizator.isAllowed(identity, new authorization.AuthorizationScope.Global(), action)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionsApiMiddlewareFactory.cjs","sources":["../../../../../../packages/engine-actions/src/graphql/http/ActionsApiMiddlewareFactory.ts"],"sourcesContent":["import { HttpController } from '@contember/engine-http'\nimport { ActionsGraphQLHandler } from './ActionsGraphQLHandlerFactory'\nimport { ActionsContext } from '../resolvers/ActionsContext'\nimport { ActionsContextResolver } from './ActionsContextResolver'\nimport { AuthorizationScope, Authorizator } from '@contember/authorization'\nimport { Identity } from '../../authorization'\nimport { ForbiddenError } from '@contember/graphql-utils'\n\nexport class ActionsApiMiddlewareFactory {\n\tconstructor(\n\t\tprivate readonly actionsContextResolver: ActionsContextResolver,\n\t\tprivate readonly actionsGraphQLHandler: ActionsGraphQLHandler,\n\t\tprivate readonly authorizator: Authorizator<Identity>,\n\t) {\n\t}\n\n\tcreate(): HttpController {\n\t\treturn async ctx => {\n\t\t\tconst { timer, logger, koa } = ctx\n\t\t\tconst { projectContainer, identity } = await this.actionsContextResolver.resolve(ctx)\n\n\t\t\tconst systemDatabase = projectContainer.systemDatabaseContext\n\n\t\t\tlogger.debug('Actions query processing started')\n\t\t\tconst graphqlContext: ActionsContext = {\n\t\t\t\tdb: systemDatabase,\n\t\t\t\tlogger,\n\t\t\t\tcontentSchemaResolver: projectContainer.contentSchemaResolver,\n\t\t\t\trequireAccess: async (action, message) => {\n\t\t\t\t\tif (!(await this.authorizator.isAllowed(identity, new AuthorizationScope.Global(), action))) {\n\t\t\t\t\t\tthrow new ForbiddenError(message || 'Forbidden')\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t}\n\t\t\tconst handler = this.actionsGraphQLHandler\n\n\t\t\tawait timer('GraphQL', () => handler({\n\t\t\t\trequest: koa.request,\n\t\t\t\tresponse: koa.response,\n\t\t\t\tcreateContext: () => graphqlContext,\n\t\t\t}))\n\t\t\tlogger.debug('Actions query finished')\n\t\t}\n\t}\n}\n"],"names":["AuthorizationScope","ForbiddenError"],"mappings":";;;;AAQO,MAAM,4BAA4B;AAAA,EACxC,YACkB,wBACA,uBACA,cAChB;AAHgB,SAAA,yBAAA;AACA,SAAA,wBAAA;AACA,SAAA,eAAA;AAAA,EAAA;AAAA,EAIlB,SAAyB;AACxB,WAAO,OAAM,QAAO;AACnB,YAAM,EAAE,OAAO,QAAQ,IAAQ,IAAA;AACzB,YAAA,EAAE,kBAAkB,SAAS,IAAI,MAAM,KAAK,uBAAuB,QAAQ,GAAG;AAEpF,YAAM,iBAAiB,iBAAiB;AAExC,aAAO,MAAM,kCAAkC;AAC/C,YAAM,iBAAiC;AAAA,QACtC,IAAI;AAAA,QACJ;AAAA,QACA,uBAAuB,iBAAiB;AAAA,QACxC,eAAe,OAAO,QAAQ,YAAY;AACrC,cAAA,CAAE,MAAM,KAAK,aAAa,UAAU,UAAU,IAAIA,iCAAmB,UAAU,MAAM,GAAI;AACtF,kBAAA,IAAIC,aAAAA,eAAe,WAAW,WAAW;AAAA,UAAA;AAAA,QAChD;AAAA,MAEF;AACA,YAAM,UAAU,KAAK;AAEf,YAAA,MAAM,WAAW,MAAM,QAAQ;AAAA,QACpC,SAAS,IAAI;AAAA,QACb,UAAU,IAAI;AAAA,QACd,eAAe,MAAM;AAAA,MAAA,CACrB,CAAC;AACF,aAAO,MAAM,wBAAwB;AAAA,IACtC;AAAA,EAAA;AAEF;;"}
|
|
1
|
+
{"version":3,"file":"ActionsApiMiddlewareFactory.cjs","sources":["../../../../../../packages/engine-actions/src/graphql/http/ActionsApiMiddlewareFactory.ts"],"sourcesContent":["import { HttpController } from '@contember/engine-http'\nimport { ActionsGraphQLHandler } from './ActionsGraphQLHandlerFactory'\nimport { ActionsContext } from '../resolvers/ActionsContext'\nimport { ActionsContextResolver } from './ActionsContextResolver'\nimport { AuthorizationScope, Authorizator } from '@contember/authorization'\nimport { Identity } from '../../authorization'\nimport { ForbiddenError } from '@contember/graphql-utils'\n\nexport class ActionsApiMiddlewareFactory {\n\tconstructor(\n\t\tprivate readonly actionsContextResolver: ActionsContextResolver,\n\t\tprivate readonly actionsGraphQLHandler: ActionsGraphQLHandler,\n\t\tprivate readonly authorizator: Authorizator<Identity>,\n\t) {\n\t}\n\n\tcreate(): HttpController {\n\t\treturn async ctx => {\n\t\t\tconst { timer, logger, koa } = ctx\n\t\t\tconst { projectContainer, identity } = await this.actionsContextResolver.resolve(ctx)\n\n\t\t\tconst systemDatabase = projectContainer.systemDatabaseContext\n\n\t\t\tlogger.debug('Actions query processing started')\n\t\t\tconst graphqlContext: ActionsContext = {\n\t\t\t\tdb: systemDatabase,\n\t\t\t\tlogger,\n\t\t\t\tproject: projectContainer.project,\n\t\t\t\tcontentSchemaResolver: projectContainer.contentSchemaResolver,\n\t\t\t\trequireAccess: async (action, message) => {\n\t\t\t\t\tif (!(await this.authorizator.isAllowed(identity, new AuthorizationScope.Global(), action))) {\n\t\t\t\t\t\tthrow new ForbiddenError(message || 'Forbidden')\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t}\n\t\t\tconst handler = this.actionsGraphQLHandler\n\n\t\t\tawait timer('GraphQL', () => handler({\n\t\t\t\trequest: koa.request,\n\t\t\t\tresponse: koa.response,\n\t\t\t\tcreateContext: () => graphqlContext,\n\t\t\t}))\n\t\t\tlogger.debug('Actions query finished')\n\t\t}\n\t}\n}\n"],"names":["AuthorizationScope","ForbiddenError"],"mappings":";;;;AAQO,MAAM,4BAA4B;AAAA,EACxC,YACkB,wBACA,uBACA,cAChB;AAHgB,SAAA,yBAAA;AACA,SAAA,wBAAA;AACA,SAAA,eAAA;AAAA,EAAA;AAAA,EAIlB,SAAyB;AACxB,WAAO,OAAM,QAAO;AACnB,YAAM,EAAE,OAAO,QAAQ,IAAQ,IAAA;AACzB,YAAA,EAAE,kBAAkB,SAAS,IAAI,MAAM,KAAK,uBAAuB,QAAQ,GAAG;AAEpF,YAAM,iBAAiB,iBAAiB;AAExC,aAAO,MAAM,kCAAkC;AAC/C,YAAM,iBAAiC;AAAA,QACtC,IAAI;AAAA,QACJ;AAAA,QACA,SAAS,iBAAiB;AAAA,QAC1B,uBAAuB,iBAAiB;AAAA,QACxC,eAAe,OAAO,QAAQ,YAAY;AACrC,cAAA,CAAE,MAAM,KAAK,aAAa,UAAU,UAAU,IAAIA,iCAAmB,UAAU,MAAM,GAAI;AACtF,kBAAA,IAAIC,aAAAA,eAAe,WAAW,WAAW;AAAA,UAAA;AAAA,QAChD;AAAA,MAEF;AACA,YAAM,UAAU,KAAK;AAEf,YAAA,MAAM,WAAW,MAAM,QAAQ;AAAA,QACpC,SAAS,IAAI;AAAA,QACb,UAAU,IAAI;AAAA,QACd,eAAe,MAAM;AAAA,MAAA,CACrB,CAAC;AACF,aAAO,MAAM,wBAAwB;AAAA,IACtC;AAAA,EAAA;AAEF;;"}
|
|
@@ -15,6 +15,7 @@ class ActionsApiMiddlewareFactory {
|
|
|
15
15
|
const graphqlContext = {
|
|
16
16
|
db: systemDatabase,
|
|
17
17
|
logger,
|
|
18
|
+
project: projectContainer.project,
|
|
18
19
|
contentSchemaResolver: projectContainer.contentSchemaResolver,
|
|
19
20
|
requireAccess: async (action, message) => {
|
|
20
21
|
if (!await this.authorizator.isAllowed(identity, new AuthorizationScope.Global(), action)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionsApiMiddlewareFactory.js","sources":["../../../../../../packages/engine-actions/src/graphql/http/ActionsApiMiddlewareFactory.ts"],"sourcesContent":["import { HttpController } from '@contember/engine-http'\nimport { ActionsGraphQLHandler } from './ActionsGraphQLHandlerFactory'\nimport { ActionsContext } from '../resolvers/ActionsContext'\nimport { ActionsContextResolver } from './ActionsContextResolver'\nimport { AuthorizationScope, Authorizator } from '@contember/authorization'\nimport { Identity } from '../../authorization'\nimport { ForbiddenError } from '@contember/graphql-utils'\n\nexport class ActionsApiMiddlewareFactory {\n\tconstructor(\n\t\tprivate readonly actionsContextResolver: ActionsContextResolver,\n\t\tprivate readonly actionsGraphQLHandler: ActionsGraphQLHandler,\n\t\tprivate readonly authorizator: Authorizator<Identity>,\n\t) {\n\t}\n\n\tcreate(): HttpController {\n\t\treturn async ctx => {\n\t\t\tconst { timer, logger, koa } = ctx\n\t\t\tconst { projectContainer, identity } = await this.actionsContextResolver.resolve(ctx)\n\n\t\t\tconst systemDatabase = projectContainer.systemDatabaseContext\n\n\t\t\tlogger.debug('Actions query processing started')\n\t\t\tconst graphqlContext: ActionsContext = {\n\t\t\t\tdb: systemDatabase,\n\t\t\t\tlogger,\n\t\t\t\tcontentSchemaResolver: projectContainer.contentSchemaResolver,\n\t\t\t\trequireAccess: async (action, message) => {\n\t\t\t\t\tif (!(await this.authorizator.isAllowed(identity, new AuthorizationScope.Global(), action))) {\n\t\t\t\t\t\tthrow new ForbiddenError(message || 'Forbidden')\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t}\n\t\t\tconst handler = this.actionsGraphQLHandler\n\n\t\t\tawait timer('GraphQL', () => handler({\n\t\t\t\trequest: koa.request,\n\t\t\t\tresponse: koa.response,\n\t\t\t\tcreateContext: () => graphqlContext,\n\t\t\t}))\n\t\t\tlogger.debug('Actions query finished')\n\t\t}\n\t}\n}\n"],"names":[],"mappings":";;AAQO,MAAM,4BAA4B;AAAA,EACxC,YACkB,wBACA,uBACA,cAChB;AAHgB,SAAA,yBAAA;AACA,SAAA,wBAAA;AACA,SAAA,eAAA;AAAA,EAAA;AAAA,EAIlB,SAAyB;AACxB,WAAO,OAAM,QAAO;AACnB,YAAM,EAAE,OAAO,QAAQ,IAAQ,IAAA;AACzB,YAAA,EAAE,kBAAkB,SAAS,IAAI,MAAM,KAAK,uBAAuB,QAAQ,GAAG;AAEpF,YAAM,iBAAiB,iBAAiB;AAExC,aAAO,MAAM,kCAAkC;AAC/C,YAAM,iBAAiC;AAAA,QACtC,IAAI;AAAA,QACJ;AAAA,QACA,uBAAuB,iBAAiB;AAAA,QACxC,eAAe,OAAO,QAAQ,YAAY;AACrC,cAAA,CAAE,MAAM,KAAK,aAAa,UAAU,UAAU,IAAI,mBAAmB,UAAU,MAAM,GAAI;AACtF,kBAAA,IAAI,eAAe,WAAW,WAAW;AAAA,UAAA;AAAA,QAChD;AAAA,MAEF;AACA,YAAM,UAAU,KAAK;AAEf,YAAA,MAAM,WAAW,MAAM,QAAQ;AAAA,QACpC,SAAS,IAAI;AAAA,QACb,UAAU,IAAI;AAAA,QACd,eAAe,MAAM;AAAA,MAAA,CACrB,CAAC;AACF,aAAO,MAAM,wBAAwB;AAAA,IACtC;AAAA,EAAA;AAEF;"}
|
|
1
|
+
{"version":3,"file":"ActionsApiMiddlewareFactory.js","sources":["../../../../../../packages/engine-actions/src/graphql/http/ActionsApiMiddlewareFactory.ts"],"sourcesContent":["import { HttpController } from '@contember/engine-http'\nimport { ActionsGraphQLHandler } from './ActionsGraphQLHandlerFactory'\nimport { ActionsContext } from '../resolvers/ActionsContext'\nimport { ActionsContextResolver } from './ActionsContextResolver'\nimport { AuthorizationScope, Authorizator } from '@contember/authorization'\nimport { Identity } from '../../authorization'\nimport { ForbiddenError } from '@contember/graphql-utils'\n\nexport class ActionsApiMiddlewareFactory {\n\tconstructor(\n\t\tprivate readonly actionsContextResolver: ActionsContextResolver,\n\t\tprivate readonly actionsGraphQLHandler: ActionsGraphQLHandler,\n\t\tprivate readonly authorizator: Authorizator<Identity>,\n\t) {\n\t}\n\n\tcreate(): HttpController {\n\t\treturn async ctx => {\n\t\t\tconst { timer, logger, koa } = ctx\n\t\t\tconst { projectContainer, identity } = await this.actionsContextResolver.resolve(ctx)\n\n\t\t\tconst systemDatabase = projectContainer.systemDatabaseContext\n\n\t\t\tlogger.debug('Actions query processing started')\n\t\t\tconst graphqlContext: ActionsContext = {\n\t\t\t\tdb: systemDatabase,\n\t\t\t\tlogger,\n\t\t\t\tproject: projectContainer.project,\n\t\t\t\tcontentSchemaResolver: projectContainer.contentSchemaResolver,\n\t\t\t\trequireAccess: async (action, message) => {\n\t\t\t\t\tif (!(await this.authorizator.isAllowed(identity, new AuthorizationScope.Global(), action))) {\n\t\t\t\t\t\tthrow new ForbiddenError(message || 'Forbidden')\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t}\n\t\t\tconst handler = this.actionsGraphQLHandler\n\n\t\t\tawait timer('GraphQL', () => handler({\n\t\t\t\trequest: koa.request,\n\t\t\t\tresponse: koa.response,\n\t\t\t\tcreateContext: () => graphqlContext,\n\t\t\t}))\n\t\t\tlogger.debug('Actions query finished')\n\t\t}\n\t}\n}\n"],"names":[],"mappings":";;AAQO,MAAM,4BAA4B;AAAA,EACxC,YACkB,wBACA,uBACA,cAChB;AAHgB,SAAA,yBAAA;AACA,SAAA,wBAAA;AACA,SAAA,eAAA;AAAA,EAAA;AAAA,EAIlB,SAAyB;AACxB,WAAO,OAAM,QAAO;AACnB,YAAM,EAAE,OAAO,QAAQ,IAAQ,IAAA;AACzB,YAAA,EAAE,kBAAkB,SAAS,IAAI,MAAM,KAAK,uBAAuB,QAAQ,GAAG;AAEpF,YAAM,iBAAiB,iBAAiB;AAExC,aAAO,MAAM,kCAAkC;AAC/C,YAAM,iBAAiC;AAAA,QACtC,IAAI;AAAA,QACJ;AAAA,QACA,SAAS,iBAAiB;AAAA,QAC1B,uBAAuB,iBAAiB;AAAA,QACxC,eAAe,OAAO,QAAQ,YAAY;AACrC,cAAA,CAAE,MAAM,KAAK,aAAa,UAAU,UAAU,IAAI,mBAAmB,UAAU,MAAM,GAAI;AACtF,kBAAA,IAAI,eAAe,WAAW,WAAW;AAAA,UAAA;AAAA,QAChD;AAAA,MAEF;AACA,YAAM,UAAU,KAAK;AAEf,YAAA,MAAM,WAAW,MAAM,QAAQ;AAAA,QACpC,SAAS,IAAI;AAAA,QACb,UAAU,IAAI;AAAA,QACd,eAAe,MAAM;AAAA,MAAA,CACrB,CAAC;AACF,aAAO,MAAM,wBAAwB;AAAA,IACtC;AAAA,EAAA;AAEF;"}
|
|
@@ -2,11 +2,13 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const graphqlUtils = require("@contember/graphql-utils");
|
|
4
4
|
class ResolversFactory {
|
|
5
|
-
constructor(eventsQueryResolver, processBatchMutationResolver, variablesQueryResolver, setVariablesMutationResolver) {
|
|
5
|
+
constructor(eventsQueryResolver, processBatchMutationResolver, variablesQueryResolver, setVariablesMutationResolver, retryEventMutationResolver, stopEventMutationResolver) {
|
|
6
6
|
this.eventsQueryResolver = eventsQueryResolver;
|
|
7
7
|
this.processBatchMutationResolver = processBatchMutationResolver;
|
|
8
8
|
this.variablesQueryResolver = variablesQueryResolver;
|
|
9
9
|
this.setVariablesMutationResolver = setVariablesMutationResolver;
|
|
10
|
+
this.retryEventMutationResolver = retryEventMutationResolver;
|
|
11
|
+
this.stopEventMutationResolver = stopEventMutationResolver;
|
|
10
12
|
}
|
|
11
13
|
create() {
|
|
12
14
|
const resolvers = {
|
|
@@ -15,12 +17,15 @@ class ResolversFactory {
|
|
|
15
17
|
Uuid: graphqlUtils.UuidType,
|
|
16
18
|
Mutation: {
|
|
17
19
|
processBatch: this.processBatchMutationResolver.processBatch.bind(this.processBatchMutationResolver),
|
|
18
|
-
setVariables: this.setVariablesMutationResolver.setVariables.bind(this.setVariablesMutationResolver)
|
|
20
|
+
setVariables: this.setVariablesMutationResolver.setVariables.bind(this.setVariablesMutationResolver),
|
|
21
|
+
retryEvent: this.retryEventMutationResolver.retryEvent.bind(this.retryEventMutationResolver),
|
|
22
|
+
stopEvent: this.stopEventMutationResolver.stopEvent.bind(this.stopEventMutationResolver)
|
|
19
23
|
},
|
|
20
24
|
Query: {
|
|
21
25
|
eventsInProcessing: this.eventsQueryResolver.eventsInProcessing.bind(this.eventsQueryResolver),
|
|
22
26
|
eventsToProcess: this.eventsQueryResolver.eventsToProcess.bind(this.eventsQueryResolver),
|
|
23
27
|
failedEvents: this.eventsQueryResolver.failedEvents.bind(this.eventsQueryResolver),
|
|
28
|
+
event: this.eventsQueryResolver.event.bind(this.eventsQueryResolver),
|
|
24
29
|
variables: this.variablesQueryResolver.variables.bind(this.variablesQueryResolver)
|
|
25
30
|
}
|
|
26
31
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResolversFactory.cjs","sources":["../../../../../../packages/engine-actions/src/graphql/resolvers/ResolversFactory.ts"],"sourcesContent":["import { DateTimeType, JSONType, UuidType } from '@contember/graphql-utils'\nimport { Resolvers } from '../schema'\nimport { EventsQueryResolver } from './query'\nimport { ProcessBatchMutationResolver, SetVariablesMutationResolver } from './mutation'\nimport { ActionsContext } from './ActionsContext'\nimport { VariablesQueryResolver } from './query/VariablesQueryResolver'\n\nexport class ResolversFactory {\n\tconstructor(\n\t\tprivate readonly eventsQueryResolver: EventsQueryResolver,\n\t\tprivate readonly processBatchMutationResolver: ProcessBatchMutationResolver,\n\t\tprivate readonly variablesQueryResolver: VariablesQueryResolver,\n\t\tprivate readonly setVariablesMutationResolver: SetVariablesMutationResolver,\n\t) {\n\t}\n\n\tcreate(): Resolvers {\n\t\tconst resolvers: Resolvers<ActionsContext> & { Mutation: Required<Resolvers<ActionsContext>['Mutation']> } & { Query: Required<Resolvers<ActionsContext>['Query']> } = {\n\t\t\tJson: JSONType,\n\t\t\tDateTime: DateTimeType,\n\t\t\tUuid: UuidType,\n\t\t\tMutation: {\n\t\t\t\tprocessBatch: this.processBatchMutationResolver.processBatch.bind(this.processBatchMutationResolver),\n\t\t\t\tsetVariables: this.setVariablesMutationResolver.setVariables.bind(this.setVariablesMutationResolver),\n\t\t\t},\n\t\t\tQuery: {\n\t\t\t\teventsInProcessing: this.eventsQueryResolver.eventsInProcessing.bind(this.eventsQueryResolver),\n\t\t\t\teventsToProcess: this.eventsQueryResolver.eventsToProcess.bind(this.eventsQueryResolver),\n\t\t\t\tfailedEvents: this.eventsQueryResolver.failedEvents.bind(this.eventsQueryResolver),\n\t\t\t\tvariables: this.variablesQueryResolver.variables.bind(this.variablesQueryResolver),\n\t\t\t},\n\t\t}\n\t\treturn resolvers\n\t}\n}\n"],"names":["JSONType","DateTimeType","UuidType"],"mappings":";;;AAOO,MAAM,iBAAiB;AAAA,EAC7B,YACkB,qBACA,8BACA,wBACA,
|
|
1
|
+
{"version":3,"file":"ResolversFactory.cjs","sources":["../../../../../../packages/engine-actions/src/graphql/resolvers/ResolversFactory.ts"],"sourcesContent":["import { DateTimeType, JSONType, UuidType } from '@contember/graphql-utils'\nimport { Resolvers } from '../schema'\nimport { EventsQueryResolver } from './query'\nimport { ProcessBatchMutationResolver, RetryEventMutationResolver, SetVariablesMutationResolver, StopEventMutationResolver } from './mutation'\nimport { ActionsContext } from './ActionsContext'\nimport { VariablesQueryResolver } from './query/VariablesQueryResolver'\n\nexport class ResolversFactory {\n\tconstructor(\n\t\tprivate readonly eventsQueryResolver: EventsQueryResolver,\n\t\tprivate readonly processBatchMutationResolver: ProcessBatchMutationResolver,\n\t\tprivate readonly variablesQueryResolver: VariablesQueryResolver,\n\t\tprivate readonly setVariablesMutationResolver: SetVariablesMutationResolver,\n\t\tprivate readonly retryEventMutationResolver: RetryEventMutationResolver,\n\t\tprivate readonly stopEventMutationResolver: StopEventMutationResolver,\n\t) {\n\t}\n\n\tcreate(): Resolvers {\n\t\tconst resolvers: Resolvers<ActionsContext> & { Mutation: Required<Resolvers<ActionsContext>['Mutation']> } & { Query: Required<Resolvers<ActionsContext>['Query']> } = {\n\t\t\tJson: JSONType,\n\t\t\tDateTime: DateTimeType,\n\t\t\tUuid: UuidType,\n\t\t\tMutation: {\n\t\t\t\tprocessBatch: this.processBatchMutationResolver.processBatch.bind(this.processBatchMutationResolver),\n\t\t\t\tsetVariables: this.setVariablesMutationResolver.setVariables.bind(this.setVariablesMutationResolver),\n\t\t\t\tretryEvent: this.retryEventMutationResolver.retryEvent.bind(this.retryEventMutationResolver),\n\t\t\t\tstopEvent: this.stopEventMutationResolver.stopEvent.bind(this.stopEventMutationResolver),\n\t\t\t},\n\t\t\tQuery: {\n\t\t\t\teventsInProcessing: this.eventsQueryResolver.eventsInProcessing.bind(this.eventsQueryResolver),\n\t\t\t\teventsToProcess: this.eventsQueryResolver.eventsToProcess.bind(this.eventsQueryResolver),\n\t\t\t\tfailedEvents: this.eventsQueryResolver.failedEvents.bind(this.eventsQueryResolver),\n\t\t\t\tevent: this.eventsQueryResolver.event.bind(this.eventsQueryResolver),\n\t\t\t\tvariables: this.variablesQueryResolver.variables.bind(this.variablesQueryResolver),\n\t\t\t},\n\t\t}\n\t\treturn resolvers\n\t}\n}\n"],"names":["JSONType","DateTimeType","UuidType"],"mappings":";;;AAOO,MAAM,iBAAiB;AAAA,EAC7B,YACkB,qBACA,8BACA,wBACA,8BACA,4BACA,2BAChB;AANgB,SAAA,sBAAA;AACA,SAAA,+BAAA;AACA,SAAA,yBAAA;AACA,SAAA,+BAAA;AACA,SAAA,6BAAA;AACA,SAAA,4BAAA;AAAA,EAAA;AAAA,EAIlB,SAAoB;AACnB,UAAM,YAAiK;AAAA,MACtK,MAAMA,aAAA;AAAA,MACN,UAAUC,aAAA;AAAA,MACV,MAAMC,aAAA;AAAA,MACN,UAAU;AAAA,QACT,cAAc,KAAK,6BAA6B,aAAa,KAAK,KAAK,4BAA4B;AAAA,QACnG,cAAc,KAAK,6BAA6B,aAAa,KAAK,KAAK,4BAA4B;AAAA,QACnG,YAAY,KAAK,2BAA2B,WAAW,KAAK,KAAK,0BAA0B;AAAA,QAC3F,WAAW,KAAK,0BAA0B,UAAU,KAAK,KAAK,yBAAyB;AAAA,MACxF;AAAA,MACA,OAAO;AAAA,QACN,oBAAoB,KAAK,oBAAoB,mBAAmB,KAAK,KAAK,mBAAmB;AAAA,QAC7F,iBAAiB,KAAK,oBAAoB,gBAAgB,KAAK,KAAK,mBAAmB;AAAA,QACvF,cAAc,KAAK,oBAAoB,aAAa,KAAK,KAAK,mBAAmB;AAAA,QACjF,OAAO,KAAK,oBAAoB,MAAM,KAAK,KAAK,mBAAmB;AAAA,QACnE,WAAW,KAAK,uBAAuB,UAAU,KAAK,KAAK,sBAAsB;AAAA,MAAA;AAAA,IAEnF;AACO,WAAA;AAAA,EAAA;AAET;;"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { JSONType, DateTimeType, UuidType } from "@contember/graphql-utils";
|
|
2
2
|
class ResolversFactory {
|
|
3
|
-
constructor(eventsQueryResolver, processBatchMutationResolver, variablesQueryResolver, setVariablesMutationResolver) {
|
|
3
|
+
constructor(eventsQueryResolver, processBatchMutationResolver, variablesQueryResolver, setVariablesMutationResolver, retryEventMutationResolver, stopEventMutationResolver) {
|
|
4
4
|
this.eventsQueryResolver = eventsQueryResolver;
|
|
5
5
|
this.processBatchMutationResolver = processBatchMutationResolver;
|
|
6
6
|
this.variablesQueryResolver = variablesQueryResolver;
|
|
7
7
|
this.setVariablesMutationResolver = setVariablesMutationResolver;
|
|
8
|
+
this.retryEventMutationResolver = retryEventMutationResolver;
|
|
9
|
+
this.stopEventMutationResolver = stopEventMutationResolver;
|
|
8
10
|
}
|
|
9
11
|
create() {
|
|
10
12
|
const resolvers = {
|
|
@@ -13,12 +15,15 @@ class ResolversFactory {
|
|
|
13
15
|
Uuid: UuidType,
|
|
14
16
|
Mutation: {
|
|
15
17
|
processBatch: this.processBatchMutationResolver.processBatch.bind(this.processBatchMutationResolver),
|
|
16
|
-
setVariables: this.setVariablesMutationResolver.setVariables.bind(this.setVariablesMutationResolver)
|
|
18
|
+
setVariables: this.setVariablesMutationResolver.setVariables.bind(this.setVariablesMutationResolver),
|
|
19
|
+
retryEvent: this.retryEventMutationResolver.retryEvent.bind(this.retryEventMutationResolver),
|
|
20
|
+
stopEvent: this.stopEventMutationResolver.stopEvent.bind(this.stopEventMutationResolver)
|
|
17
21
|
},
|
|
18
22
|
Query: {
|
|
19
23
|
eventsInProcessing: this.eventsQueryResolver.eventsInProcessing.bind(this.eventsQueryResolver),
|
|
20
24
|
eventsToProcess: this.eventsQueryResolver.eventsToProcess.bind(this.eventsQueryResolver),
|
|
21
25
|
failedEvents: this.eventsQueryResolver.failedEvents.bind(this.eventsQueryResolver),
|
|
26
|
+
event: this.eventsQueryResolver.event.bind(this.eventsQueryResolver),
|
|
22
27
|
variables: this.variablesQueryResolver.variables.bind(this.variablesQueryResolver)
|
|
23
28
|
}
|
|
24
29
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResolversFactory.js","sources":["../../../../../../packages/engine-actions/src/graphql/resolvers/ResolversFactory.ts"],"sourcesContent":["import { DateTimeType, JSONType, UuidType } from '@contember/graphql-utils'\nimport { Resolvers } from '../schema'\nimport { EventsQueryResolver } from './query'\nimport { ProcessBatchMutationResolver, SetVariablesMutationResolver } from './mutation'\nimport { ActionsContext } from './ActionsContext'\nimport { VariablesQueryResolver } from './query/VariablesQueryResolver'\n\nexport class ResolversFactory {\n\tconstructor(\n\t\tprivate readonly eventsQueryResolver: EventsQueryResolver,\n\t\tprivate readonly processBatchMutationResolver: ProcessBatchMutationResolver,\n\t\tprivate readonly variablesQueryResolver: VariablesQueryResolver,\n\t\tprivate readonly setVariablesMutationResolver: SetVariablesMutationResolver,\n\t) {\n\t}\n\n\tcreate(): Resolvers {\n\t\tconst resolvers: Resolvers<ActionsContext> & { Mutation: Required<Resolvers<ActionsContext>['Mutation']> } & { Query: Required<Resolvers<ActionsContext>['Query']> } = {\n\t\t\tJson: JSONType,\n\t\t\tDateTime: DateTimeType,\n\t\t\tUuid: UuidType,\n\t\t\tMutation: {\n\t\t\t\tprocessBatch: this.processBatchMutationResolver.processBatch.bind(this.processBatchMutationResolver),\n\t\t\t\tsetVariables: this.setVariablesMutationResolver.setVariables.bind(this.setVariablesMutationResolver),\n\t\t\t},\n\t\t\tQuery: {\n\t\t\t\teventsInProcessing: this.eventsQueryResolver.eventsInProcessing.bind(this.eventsQueryResolver),\n\t\t\t\teventsToProcess: this.eventsQueryResolver.eventsToProcess.bind(this.eventsQueryResolver),\n\t\t\t\tfailedEvents: this.eventsQueryResolver.failedEvents.bind(this.eventsQueryResolver),\n\t\t\t\tvariables: this.variablesQueryResolver.variables.bind(this.variablesQueryResolver),\n\t\t\t},\n\t\t}\n\t\treturn resolvers\n\t}\n}\n"],"names":[],"mappings":";AAOO,MAAM,iBAAiB;AAAA,EAC7B,YACkB,qBACA,8BACA,wBACA,
|
|
1
|
+
{"version":3,"file":"ResolversFactory.js","sources":["../../../../../../packages/engine-actions/src/graphql/resolvers/ResolversFactory.ts"],"sourcesContent":["import { DateTimeType, JSONType, UuidType } from '@contember/graphql-utils'\nimport { Resolvers } from '../schema'\nimport { EventsQueryResolver } from './query'\nimport { ProcessBatchMutationResolver, RetryEventMutationResolver, SetVariablesMutationResolver, StopEventMutationResolver } from './mutation'\nimport { ActionsContext } from './ActionsContext'\nimport { VariablesQueryResolver } from './query/VariablesQueryResolver'\n\nexport class ResolversFactory {\n\tconstructor(\n\t\tprivate readonly eventsQueryResolver: EventsQueryResolver,\n\t\tprivate readonly processBatchMutationResolver: ProcessBatchMutationResolver,\n\t\tprivate readonly variablesQueryResolver: VariablesQueryResolver,\n\t\tprivate readonly setVariablesMutationResolver: SetVariablesMutationResolver,\n\t\tprivate readonly retryEventMutationResolver: RetryEventMutationResolver,\n\t\tprivate readonly stopEventMutationResolver: StopEventMutationResolver,\n\t) {\n\t}\n\n\tcreate(): Resolvers {\n\t\tconst resolvers: Resolvers<ActionsContext> & { Mutation: Required<Resolvers<ActionsContext>['Mutation']> } & { Query: Required<Resolvers<ActionsContext>['Query']> } = {\n\t\t\tJson: JSONType,\n\t\t\tDateTime: DateTimeType,\n\t\t\tUuid: UuidType,\n\t\t\tMutation: {\n\t\t\t\tprocessBatch: this.processBatchMutationResolver.processBatch.bind(this.processBatchMutationResolver),\n\t\t\t\tsetVariables: this.setVariablesMutationResolver.setVariables.bind(this.setVariablesMutationResolver),\n\t\t\t\tretryEvent: this.retryEventMutationResolver.retryEvent.bind(this.retryEventMutationResolver),\n\t\t\t\tstopEvent: this.stopEventMutationResolver.stopEvent.bind(this.stopEventMutationResolver),\n\t\t\t},\n\t\t\tQuery: {\n\t\t\t\teventsInProcessing: this.eventsQueryResolver.eventsInProcessing.bind(this.eventsQueryResolver),\n\t\t\t\teventsToProcess: this.eventsQueryResolver.eventsToProcess.bind(this.eventsQueryResolver),\n\t\t\t\tfailedEvents: this.eventsQueryResolver.failedEvents.bind(this.eventsQueryResolver),\n\t\t\t\tevent: this.eventsQueryResolver.event.bind(this.eventsQueryResolver),\n\t\t\t\tvariables: this.variablesQueryResolver.variables.bind(this.variablesQueryResolver),\n\t\t\t},\n\t\t}\n\t\treturn resolvers\n\t}\n}\n"],"names":[],"mappings":";AAOO,MAAM,iBAAiB;AAAA,EAC7B,YACkB,qBACA,8BACA,wBACA,8BACA,4BACA,2BAChB;AANgB,SAAA,sBAAA;AACA,SAAA,+BAAA;AACA,SAAA,yBAAA;AACA,SAAA,+BAAA;AACA,SAAA,6BAAA;AACA,SAAA,4BAAA;AAAA,EAAA;AAAA,EAIlB,SAAoB;AACnB,UAAM,YAAiK;AAAA,MACtK,MAAM;AAAA,MACN,UAAU;AAAA,MACV,MAAM;AAAA,MACN,UAAU;AAAA,QACT,cAAc,KAAK,6BAA6B,aAAa,KAAK,KAAK,4BAA4B;AAAA,QACnG,cAAc,KAAK,6BAA6B,aAAa,KAAK,KAAK,4BAA4B;AAAA,QACnG,YAAY,KAAK,2BAA2B,WAAW,KAAK,KAAK,0BAA0B;AAAA,QAC3F,WAAW,KAAK,0BAA0B,UAAU,KAAK,KAAK,yBAAyB;AAAA,MACxF;AAAA,MACA,OAAO;AAAA,QACN,oBAAoB,KAAK,oBAAoB,mBAAmB,KAAK,KAAK,mBAAmB;AAAA,QAC7F,iBAAiB,KAAK,oBAAoB,gBAAgB,KAAK,KAAK,mBAAmB;AAAA,QACvF,cAAc,KAAK,oBAAoB,aAAa,KAAK,KAAK,mBAAmB;AAAA,QACjF,OAAO,KAAK,oBAAoB,MAAM,KAAK,KAAK,mBAAmB;AAAA,QACnE,WAAW,KAAK,uBAAuB,UAAU,KAAK,KAAK,sBAAsB;AAAA,MAAA;AAAA,IAEnF;AACO,WAAA;AAAA,EAAA;AAET;"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const ActionsAuthorizationActions = require("../../../authorization/ActionsAuthorizationActions.cjs");
|
|
4
|
+
require("@contember/authorization");
|
|
5
|
+
require("@contember/schema");
|
|
6
|
+
const notifyChannel = require("../../../utils/notifyChannel.cjs");
|
|
7
|
+
class RetryEventMutationResolver {
|
|
8
|
+
constructor(eventsRepository) {
|
|
9
|
+
this.eventsRepository = eventsRepository;
|
|
10
|
+
}
|
|
11
|
+
async retryEvent(parent, args, ctx) {
|
|
12
|
+
await ctx.requireAccess(ActionsAuthorizationActions.ActionsAuthorizationActions.EVENTS_RETRY);
|
|
13
|
+
await this.eventsRepository.requeue(ctx.db.client, [args.id]);
|
|
14
|
+
await notifyChannel.notify(ctx.db.client, ctx.project.slug);
|
|
15
|
+
return {
|
|
16
|
+
ok: true
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
exports.RetryEventMutationResolver = RetryEventMutationResolver;
|
|
21
|
+
//# sourceMappingURL=RetryEventMutationResolver.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RetryEventMutationResolver.cjs","sources":["../../../../../../../packages/engine-actions/src/graphql/resolvers/mutation/RetryEventMutationResolver.ts"],"sourcesContent":["import { MutationResolvers, MutationRetryEventArgs } from '../../schema'\nimport { ActionsContext } from '../ActionsContext'\nimport { ActionsAuthorizationActions } from '../../../authorization'\nimport { EventsRepository } from '../../../dispatch/EventsRepository'\nimport { notify } from '../../../utils/notifyChannel'\n\nexport class RetryEventMutationResolver implements MutationResolvers<ActionsContext> {\n\tconstructor(\n\t\tprivate readonly eventsRepository: EventsRepository,\n\t) {\n\t}\n\tasync retryEvent(parent: unknown, args: MutationRetryEventArgs, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.EVENTS_RETRY)\n\n\t\tawait this.eventsRepository.requeue(ctx.db.client, [args.id])\n\t\tawait notify(ctx.db.client, ctx.project.slug)\n\n\t\treturn {\n\t\t\tok: true,\n\t\t}\n\t}\n}\n"],"names":["ActionsAuthorizationActions","notify"],"mappings":";;;;;;AAMO,MAAM,2BAAwE;AAAA,EACpF,YACkB,kBAChB;AADgB,SAAA,mBAAA;AAAA,EAAA;AAAA,EAGlB,MAAM,WAAW,QAAiB,MAA8B,KAAqB;AAC9E,UAAA,IAAI,cAAcA,4BAAA,4BAA4B,YAAY;AAE1D,UAAA,KAAK,iBAAiB,QAAQ,IAAI,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;AAC5D,UAAMC,cAAAA,OAAO,IAAI,GAAG,QAAQ,IAAI,QAAQ,IAAI;AAErC,WAAA;AAAA,MACN,IAAI;AAAA,IACL;AAAA,EAAA;AAEF;;"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ActionsAuthorizationActions } from "../../../authorization/ActionsAuthorizationActions.js";
|
|
2
|
+
import "@contember/authorization";
|
|
3
|
+
import "@contember/schema";
|
|
4
|
+
import { notify } from "../../../utils/notifyChannel.js";
|
|
5
|
+
class RetryEventMutationResolver {
|
|
6
|
+
constructor(eventsRepository) {
|
|
7
|
+
this.eventsRepository = eventsRepository;
|
|
8
|
+
}
|
|
9
|
+
async retryEvent(parent, args, ctx) {
|
|
10
|
+
await ctx.requireAccess(ActionsAuthorizationActions.EVENTS_RETRY);
|
|
11
|
+
await this.eventsRepository.requeue(ctx.db.client, [args.id]);
|
|
12
|
+
await notify(ctx.db.client, ctx.project.slug);
|
|
13
|
+
return {
|
|
14
|
+
ok: true
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export {
|
|
19
|
+
RetryEventMutationResolver
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=RetryEventMutationResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RetryEventMutationResolver.js","sources":["../../../../../../../packages/engine-actions/src/graphql/resolvers/mutation/RetryEventMutationResolver.ts"],"sourcesContent":["import { MutationResolvers, MutationRetryEventArgs } from '../../schema'\nimport { ActionsContext } from '../ActionsContext'\nimport { ActionsAuthorizationActions } from '../../../authorization'\nimport { EventsRepository } from '../../../dispatch/EventsRepository'\nimport { notify } from '../../../utils/notifyChannel'\n\nexport class RetryEventMutationResolver implements MutationResolvers<ActionsContext> {\n\tconstructor(\n\t\tprivate readonly eventsRepository: EventsRepository,\n\t) {\n\t}\n\tasync retryEvent(parent: unknown, args: MutationRetryEventArgs, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.EVENTS_RETRY)\n\n\t\tawait this.eventsRepository.requeue(ctx.db.client, [args.id])\n\t\tawait notify(ctx.db.client, ctx.project.slug)\n\n\t\treturn {\n\t\t\tok: true,\n\t\t}\n\t}\n}\n"],"names":[],"mappings":";;;;AAMO,MAAM,2BAAwE;AAAA,EACpF,YACkB,kBAChB;AADgB,SAAA,mBAAA;AAAA,EAAA;AAAA,EAGlB,MAAM,WAAW,QAAiB,MAA8B,KAAqB;AAC9E,UAAA,IAAI,cAAc,4BAA4B,YAAY;AAE1D,UAAA,KAAK,iBAAiB,QAAQ,IAAI,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;AAC5D,UAAM,OAAO,IAAI,GAAG,QAAQ,IAAI,QAAQ,IAAI;AAErC,WAAA;AAAA,MACN,IAAI;AAAA,IACL;AAAA,EAAA;AAEF;"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const ActionsAuthorizationActions = require("../../../authorization/ActionsAuthorizationActions.cjs");
|
|
4
|
+
require("@contember/authorization");
|
|
5
|
+
require("@contember/schema");
|
|
6
|
+
class StopEventMutationResolver {
|
|
7
|
+
constructor(eventsRepository) {
|
|
8
|
+
this.eventsRepository = eventsRepository;
|
|
9
|
+
}
|
|
10
|
+
async stopEvent(parent, args, ctx) {
|
|
11
|
+
await ctx.requireAccess(ActionsAuthorizationActions.ActionsAuthorizationActions.EVENTS_STOP);
|
|
12
|
+
await this.eventsRepository.markStopped(ctx.db.client, [args.id]);
|
|
13
|
+
return {
|
|
14
|
+
ok: true
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
exports.StopEventMutationResolver = StopEventMutationResolver;
|
|
19
|
+
//# sourceMappingURL=StopEventMutationResolver.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StopEventMutationResolver.cjs","sources":["../../../../../../../packages/engine-actions/src/graphql/resolvers/mutation/StopEventMutationResolver.ts"],"sourcesContent":["import { MutationResolvers, MutationRetryEventArgs } from '../../schema'\nimport { ActionsContext } from '../ActionsContext'\nimport { ActionsAuthorizationActions } from '../../../authorization'\nimport { EventsRepository } from '../../../dispatch/EventsRepository'\n\nexport class StopEventMutationResolver implements MutationResolvers<ActionsContext> {\n\tconstructor(\n\t\tprivate readonly eventsRepository: EventsRepository,\n\t) {\n\t}\n\tasync stopEvent(parent: unknown, args: MutationRetryEventArgs, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.EVENTS_STOP)\n\n\t\tawait this.eventsRepository.markStopped(ctx.db.client, [args.id])\n\t\treturn {\n\t\t\tok: true,\n\t\t}\n\t}\n}\n"],"names":["ActionsAuthorizationActions"],"mappings":";;;;;AAKO,MAAM,0BAAuE;AAAA,EACnF,YACkB,kBAChB;AADgB,SAAA,mBAAA;AAAA,EAAA;AAAA,EAGlB,MAAM,UAAU,QAAiB,MAA8B,KAAqB;AAC7E,UAAA,IAAI,cAAcA,4BAAA,4BAA4B,WAAW;AAEzD,UAAA,KAAK,iBAAiB,YAAY,IAAI,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;AACzD,WAAA;AAAA,MACN,IAAI;AAAA,IACL;AAAA,EAAA;AAEF;;"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ActionsAuthorizationActions } from "../../../authorization/ActionsAuthorizationActions.js";
|
|
2
|
+
import "@contember/authorization";
|
|
3
|
+
import "@contember/schema";
|
|
4
|
+
class StopEventMutationResolver {
|
|
5
|
+
constructor(eventsRepository) {
|
|
6
|
+
this.eventsRepository = eventsRepository;
|
|
7
|
+
}
|
|
8
|
+
async stopEvent(parent, args, ctx) {
|
|
9
|
+
await ctx.requireAccess(ActionsAuthorizationActions.EVENTS_STOP);
|
|
10
|
+
await this.eventsRepository.markStopped(ctx.db.client, [args.id]);
|
|
11
|
+
return {
|
|
12
|
+
ok: true
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export {
|
|
17
|
+
StopEventMutationResolver
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=StopEventMutationResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StopEventMutationResolver.js","sources":["../../../../../../../packages/engine-actions/src/graphql/resolvers/mutation/StopEventMutationResolver.ts"],"sourcesContent":["import { MutationResolvers, MutationRetryEventArgs } from '../../schema'\nimport { ActionsContext } from '../ActionsContext'\nimport { ActionsAuthorizationActions } from '../../../authorization'\nimport { EventsRepository } from '../../../dispatch/EventsRepository'\n\nexport class StopEventMutationResolver implements MutationResolvers<ActionsContext> {\n\tconstructor(\n\t\tprivate readonly eventsRepository: EventsRepository,\n\t) {\n\t}\n\tasync stopEvent(parent: unknown, args: MutationRetryEventArgs, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.EVENTS_STOP)\n\n\t\tawait this.eventsRepository.markStopped(ctx.db.client, [args.id])\n\t\treturn {\n\t\t\tok: true,\n\t\t}\n\t}\n}\n"],"names":[],"mappings":";;;AAKO,MAAM,0BAAuE;AAAA,EACnF,YACkB,kBAChB;AADgB,SAAA,mBAAA;AAAA,EAAA;AAAA,EAGlB,MAAM,UAAU,QAAiB,MAA8B,KAAqB;AAC7E,UAAA,IAAI,cAAc,4BAA4B,WAAW;AAEzD,UAAA,KAAK,iBAAiB,YAAY,IAAI,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;AACzD,WAAA;AAAA,MACN,IAAI;AAAA,IACL;AAAA,EAAA;AAEF;"}
|
|
@@ -7,6 +7,7 @@ const FailedEventsQuery = require("../../../model/FailedEventsQuery.cjs");
|
|
|
7
7
|
const ActionsAuthorizationActions = require("../../../authorization/ActionsAuthorizationActions.cjs");
|
|
8
8
|
require("@contember/authorization");
|
|
9
9
|
require("@contember/schema");
|
|
10
|
+
const EventByIdQuery = require("../../../model/EventByIdQuery.cjs");
|
|
10
11
|
class EventsQueryResolver {
|
|
11
12
|
async eventsInProcessing(parent, { args }, ctx) {
|
|
12
13
|
await ctx.requireAccess(ActionsAuthorizationActions.ActionsAuthorizationActions.EVENTS_VIEW);
|
|
@@ -20,6 +21,15 @@ class EventsQueryResolver {
|
|
|
20
21
|
await ctx.requireAccess(ActionsAuthorizationActions.ActionsAuthorizationActions.EVENTS_VIEW);
|
|
21
22
|
return await this.fetchEvents(ctx.db, new FailedEventsQuery.FailedEventsQuery(args ?? {}));
|
|
22
23
|
}
|
|
24
|
+
async event(parent, { id }, ctx) {
|
|
25
|
+
await ctx.requireAccess(ActionsAuthorizationActions.ActionsAuthorizationActions.EVENTS_VIEW);
|
|
26
|
+
const stages = await this.fetchStagesMap(ctx.db);
|
|
27
|
+
const result = await ctx.db.queryHandler.fetch(new EventByIdQuery.EventByIdQuery(id));
|
|
28
|
+
if (!result) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
return this.mapEventRows([result], stages)[0];
|
|
32
|
+
}
|
|
23
33
|
async fetchEvents(db, query) {
|
|
24
34
|
const stages = await this.fetchStagesMap(db);
|
|
25
35
|
return this.mapEventRows(await db.queryHandler.fetch(query), stages);
|
|
@@ -40,7 +50,10 @@ class EventsQueryResolver {
|
|
|
40
50
|
stage: stagesMap[row.stage_id],
|
|
41
51
|
state: row.state,
|
|
42
52
|
target: row.target,
|
|
43
|
-
transactionId: row.transaction_id
|
|
53
|
+
transactionId: row.transaction_id,
|
|
54
|
+
identityId: row.identity_id ?? void 0,
|
|
55
|
+
ipAddress: row.ip_address ?? void 0,
|
|
56
|
+
userAgent: row.user_agent ?? void 0
|
|
44
57
|
}));
|
|
45
58
|
}
|
|
46
59
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventsQueryResolver.cjs","sources":["../../../../../../../packages/engine-actions/src/graphql/resolvers/query/EventsQueryResolver.ts"],"sourcesContent":["import {\n\tEvent,\n\tQueryEventsInProcessingArgs,\n\tQueryEventsToProcessArgs,\n\tQueryFailedEventsArgs,\n\tQueryResolvers,\n} from '../../schema'\nimport { ActionsContext } from '../ActionsContext'\nimport { EventsToProcessQuery } from '../../../model/EventsToProcessQuery'\nimport { EventRow } from '../../../model/types'\nimport { DatabaseContext, StagesQuery } from '@contember/engine-system-api'\nimport { Client, DatabaseQuery } from '@contember/database'\nimport { EventsInProcessingQuery } from '../../../model/EventsInProcessingQuery'\nimport { FailedEventsQuery } from '../../../model/FailedEventsQuery'\nimport { ActionsAuthorizationActions } from '../../../authorization'\n\nexport class EventsQueryResolver implements QueryResolvers<ActionsContext> {\n\tasync eventsInProcessing(parent: unknown, { args }: QueryEventsInProcessingArgs, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.EVENTS_VIEW)\n\n\t\treturn await this.fetchEvents(ctx.db, new EventsInProcessingQuery(args ?? {}))\n\t}\n\n\tasync eventsToProcess(parent: unknown, { args }: QueryEventsToProcessArgs, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.EVENTS_VIEW)\n\n\t\treturn await this.fetchEvents(ctx.db, new EventsToProcessQuery(args ?? {}))\n\t}\n\n\tasync failedEvents(parent: unknown, { args }: QueryFailedEventsArgs, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.EVENTS_VIEW)\n\n\t\treturn await this.fetchEvents(ctx.db, new FailedEventsQuery(args ?? {}))\n\t}\n\n\tprivate async fetchEvents(db: DatabaseContext, query: DatabaseQuery<EventRow[]>) {\n\t\tconst stages = await this.fetchStagesMap(db)\n\t\treturn this.mapEventRows(await db.queryHandler.fetch(query), stages)\n\t}\n\n\tprivate async fetchStagesMap(db: DatabaseContext): Promise<Record<string, string>> {\n\t\treturn Object.fromEntries((await db.queryHandler.fetch(new StagesQuery())).map(it => [it.id, it.slug]))\n\t}\n\n\tprivate mapEventRows(rows: EventRow[], stagesMap: Record<string, string>): Event[] {\n\n\t\treturn rows.map(row => ({\n\t\t\tid: row.id,\n\t\t\tcreatedAt: row.created_at,\n\t\t\tresolvedAt: row.created_at,\n\t\t\tlastStateChange: row.last_state_change,\n\t\t\tvisibleAt: row.visible_at,\n\t\t\tlog: row.log,\n\t\t\tnumRetries: row.num_retries,\n\t\t\tpayload: row.payload,\n\t\t\tstage: stagesMap[row.stage_id],\n\t\t\tstate: row.state,\n\t\t\ttarget: row.target,\n\t\t\ttransactionId: row.transaction_id,\n\t\t}))\n\t}\n}\n"],"names":["ActionsAuthorizationActions","EventsInProcessingQuery","EventsToProcessQuery","FailedEventsQuery","StagesQuery"],"mappings":"
|
|
1
|
+
{"version":3,"file":"EventsQueryResolver.cjs","sources":["../../../../../../../packages/engine-actions/src/graphql/resolvers/query/EventsQueryResolver.ts"],"sourcesContent":["import {\n\tEvent,\n\tQueryEventsInProcessingArgs,\n\tQueryEventsToProcessArgs,\n\tQueryFailedEventsArgs,\n\tQueryResolvers,\n} from '../../schema'\nimport { ActionsContext } from '../ActionsContext'\nimport { EventsToProcessQuery } from '../../../model/EventsToProcessQuery'\nimport { EventRow } from '../../../model/types'\nimport { DatabaseContext, StagesQuery } from '@contember/engine-system-api'\nimport { Client, DatabaseQuery } from '@contember/database'\nimport { EventsInProcessingQuery } from '../../../model/EventsInProcessingQuery'\nimport { FailedEventsQuery } from '../../../model/FailedEventsQuery'\nimport { ActionsAuthorizationActions } from '../../../authorization'\nimport { EventByIdQuery } from '../../../model/EventByIdQuery'\n\nexport class EventsQueryResolver implements QueryResolvers<ActionsContext> {\n\tasync eventsInProcessing(parent: unknown, { args }: QueryEventsInProcessingArgs, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.EVENTS_VIEW)\n\n\t\treturn await this.fetchEvents(ctx.db, new EventsInProcessingQuery(args ?? {}))\n\t}\n\n\tasync eventsToProcess(parent: unknown, { args }: QueryEventsToProcessArgs, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.EVENTS_VIEW)\n\n\t\treturn await this.fetchEvents(ctx.db, new EventsToProcessQuery(args ?? {}))\n\t}\n\n\tasync failedEvents(parent: unknown, { args }: QueryFailedEventsArgs, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.EVENTS_VIEW)\n\n\t\treturn await this.fetchEvents(ctx.db, new FailedEventsQuery(args ?? {}))\n\t}\n\n\tasync event(parent: unknown, { id }: { id: string }, ctx: ActionsContext): Promise<Event | null> {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.EVENTS_VIEW)\n\t\tconst stages = await this.fetchStagesMap(ctx.db)\n\t\tconst result = await ctx.db.queryHandler.fetch(new EventByIdQuery(id))\n\t\tif (!result) {\n\t\t\treturn null\n\t\t}\n\t\treturn this.mapEventRows([result], stages)[0]\n\t}\n\n\tprivate async fetchEvents(db: DatabaseContext, query: DatabaseQuery<EventRow[]>) {\n\t\tconst stages = await this.fetchStagesMap(db)\n\t\treturn this.mapEventRows(await db.queryHandler.fetch(query), stages)\n\t}\n\n\tprivate async fetchStagesMap(db: DatabaseContext): Promise<Record<string, string>> {\n\t\treturn Object.fromEntries((await db.queryHandler.fetch(new StagesQuery())).map(it => [it.id, it.slug]))\n\t}\n\n\tprivate mapEventRows(rows: EventRow[], stagesMap: Record<string, string>): Event[] {\n\n\t\treturn rows.map(row => ({\n\t\t\tid: row.id,\n\t\t\tcreatedAt: row.created_at,\n\t\t\tresolvedAt: row.created_at,\n\t\t\tlastStateChange: row.last_state_change,\n\t\t\tvisibleAt: row.visible_at,\n\t\t\tlog: row.log,\n\t\t\tnumRetries: row.num_retries,\n\t\t\tpayload: row.payload,\n\t\t\tstage: stagesMap[row.stage_id],\n\t\t\tstate: row.state,\n\t\t\ttarget: row.target,\n\t\t\ttransactionId: row.transaction_id,\n\t\t\tidentityId: row.identity_id ?? undefined,\n\t\t\tipAddress: row.ip_address ?? undefined,\n\t\t\tuserAgent: row.user_agent ?? undefined,\n\t\t}))\n\t}\n}\n"],"names":["ActionsAuthorizationActions","EventsInProcessingQuery","EventsToProcessQuery","FailedEventsQuery","EventByIdQuery","StagesQuery"],"mappings":";;;;;;;;;;AAiBO,MAAM,oBAA8D;AAAA,EAC1E,MAAM,mBAAmB,QAAiB,EAAE,KAAA,GAAqC,KAAqB;AAC/F,UAAA,IAAI,cAAcA,4BAAA,4BAA4B,WAAW;AAExD,WAAA,MAAM,KAAK,YAAY,IAAI,IAAI,IAAIC,wBAAwB,wBAAA,QAAQ,CAAA,CAAE,CAAC;AAAA,EAAA;AAAA,EAG9E,MAAM,gBAAgB,QAAiB,EAAE,KAAA,GAAkC,KAAqB;AACzF,UAAA,IAAI,cAAcD,4BAAA,4BAA4B,WAAW;AAExD,WAAA,MAAM,KAAK,YAAY,IAAI,IAAI,IAAIE,qBAAqB,qBAAA,QAAQ,CAAA,CAAE,CAAC;AAAA,EAAA;AAAA,EAG3E,MAAM,aAAa,QAAiB,EAAE,KAAA,GAA+B,KAAqB;AACnF,UAAA,IAAI,cAAcF,4BAAA,4BAA4B,WAAW;AAExD,WAAA,MAAM,KAAK,YAAY,IAAI,IAAI,IAAIG,kBAAkB,kBAAA,QAAQ,CAAA,CAAE,CAAC;AAAA,EAAA;AAAA,EAGxE,MAAM,MAAM,QAAiB,EAAE,GAAA,GAAsB,KAA4C;AAC1F,UAAA,IAAI,cAAcH,4BAAA,4BAA4B,WAAW;AAC/D,UAAM,SAAS,MAAM,KAAK,eAAe,IAAI,EAAE;AACzC,UAAA,SAAS,MAAM,IAAI,GAAG,aAAa,MAAM,IAAII,8BAAe,EAAE,CAAC;AACrE,QAAI,CAAC,QAAQ;AACL,aAAA;AAAA,IAAA;AAER,WAAO,KAAK,aAAa,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;AAAA,EAAA;AAAA,EAG7C,MAAc,YAAY,IAAqB,OAAkC;AAChF,UAAM,SAAS,MAAM,KAAK,eAAe,EAAE;AACpC,WAAA,KAAK,aAAa,MAAM,GAAG,aAAa,MAAM,KAAK,GAAG,MAAM;AAAA,EAAA;AAAA,EAGpE,MAAc,eAAe,IAAsD;AAClF,WAAO,OAAO,aAAa,MAAM,GAAG,aAAa,MAAM,IAAIC,gBAAY,YAAA,CAAC,GAAG,IAAI,QAAM,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;AAAA,EAAA;AAAA,EAG/F,aAAa,MAAkB,WAA4C;AAE3E,WAAA,KAAK,IAAI,CAAQ,SAAA;AAAA,MACvB,IAAI,IAAI;AAAA,MACR,WAAW,IAAI;AAAA,MACf,YAAY,IAAI;AAAA,MAChB,iBAAiB,IAAI;AAAA,MACrB,WAAW,IAAI;AAAA,MACf,KAAK,IAAI;AAAA,MACT,YAAY,IAAI;AAAA,MAChB,SAAS,IAAI;AAAA,MACb,OAAO,UAAU,IAAI,QAAQ;AAAA,MAC7B,OAAO,IAAI;AAAA,MACX,QAAQ,IAAI;AAAA,MACZ,eAAe,IAAI;AAAA,MACnB,YAAY,IAAI,eAAe;AAAA,MAC/B,WAAW,IAAI,cAAc;AAAA,MAC7B,WAAW,IAAI,cAAc;AAAA,IAAA,EAC5B;AAAA,EAAA;AAEJ;;"}
|
|
@@ -5,6 +5,7 @@ import { FailedEventsQuery } from "../../../model/FailedEventsQuery.js";
|
|
|
5
5
|
import { ActionsAuthorizationActions } from "../../../authorization/ActionsAuthorizationActions.js";
|
|
6
6
|
import "@contember/authorization";
|
|
7
7
|
import "@contember/schema";
|
|
8
|
+
import { EventByIdQuery } from "../../../model/EventByIdQuery.js";
|
|
8
9
|
class EventsQueryResolver {
|
|
9
10
|
async eventsInProcessing(parent, { args }, ctx) {
|
|
10
11
|
await ctx.requireAccess(ActionsAuthorizationActions.EVENTS_VIEW);
|
|
@@ -18,6 +19,15 @@ class EventsQueryResolver {
|
|
|
18
19
|
await ctx.requireAccess(ActionsAuthorizationActions.EVENTS_VIEW);
|
|
19
20
|
return await this.fetchEvents(ctx.db, new FailedEventsQuery(args ?? {}));
|
|
20
21
|
}
|
|
22
|
+
async event(parent, { id }, ctx) {
|
|
23
|
+
await ctx.requireAccess(ActionsAuthorizationActions.EVENTS_VIEW);
|
|
24
|
+
const stages = await this.fetchStagesMap(ctx.db);
|
|
25
|
+
const result = await ctx.db.queryHandler.fetch(new EventByIdQuery(id));
|
|
26
|
+
if (!result) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
return this.mapEventRows([result], stages)[0];
|
|
30
|
+
}
|
|
21
31
|
async fetchEvents(db, query) {
|
|
22
32
|
const stages = await this.fetchStagesMap(db);
|
|
23
33
|
return this.mapEventRows(await db.queryHandler.fetch(query), stages);
|
|
@@ -38,7 +48,10 @@ class EventsQueryResolver {
|
|
|
38
48
|
stage: stagesMap[row.stage_id],
|
|
39
49
|
state: row.state,
|
|
40
50
|
target: row.target,
|
|
41
|
-
transactionId: row.transaction_id
|
|
51
|
+
transactionId: row.transaction_id,
|
|
52
|
+
identityId: row.identity_id ?? void 0,
|
|
53
|
+
ipAddress: row.ip_address ?? void 0,
|
|
54
|
+
userAgent: row.user_agent ?? void 0
|
|
42
55
|
}));
|
|
43
56
|
}
|
|
44
57
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventsQueryResolver.js","sources":["../../../../../../../packages/engine-actions/src/graphql/resolvers/query/EventsQueryResolver.ts"],"sourcesContent":["import {\n\tEvent,\n\tQueryEventsInProcessingArgs,\n\tQueryEventsToProcessArgs,\n\tQueryFailedEventsArgs,\n\tQueryResolvers,\n} from '../../schema'\nimport { ActionsContext } from '../ActionsContext'\nimport { EventsToProcessQuery } from '../../../model/EventsToProcessQuery'\nimport { EventRow } from '../../../model/types'\nimport { DatabaseContext, StagesQuery } from '@contember/engine-system-api'\nimport { Client, DatabaseQuery } from '@contember/database'\nimport { EventsInProcessingQuery } from '../../../model/EventsInProcessingQuery'\nimport { FailedEventsQuery } from '../../../model/FailedEventsQuery'\nimport { ActionsAuthorizationActions } from '../../../authorization'\n\nexport class EventsQueryResolver implements QueryResolvers<ActionsContext> {\n\tasync eventsInProcessing(parent: unknown, { args }: QueryEventsInProcessingArgs, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.EVENTS_VIEW)\n\n\t\treturn await this.fetchEvents(ctx.db, new EventsInProcessingQuery(args ?? {}))\n\t}\n\n\tasync eventsToProcess(parent: unknown, { args }: QueryEventsToProcessArgs, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.EVENTS_VIEW)\n\n\t\treturn await this.fetchEvents(ctx.db, new EventsToProcessQuery(args ?? {}))\n\t}\n\n\tasync failedEvents(parent: unknown, { args }: QueryFailedEventsArgs, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.EVENTS_VIEW)\n\n\t\treturn await this.fetchEvents(ctx.db, new FailedEventsQuery(args ?? {}))\n\t}\n\n\tprivate async fetchEvents(db: DatabaseContext, query: DatabaseQuery<EventRow[]>) {\n\t\tconst stages = await this.fetchStagesMap(db)\n\t\treturn this.mapEventRows(await db.queryHandler.fetch(query), stages)\n\t}\n\n\tprivate async fetchStagesMap(db: DatabaseContext): Promise<Record<string, string>> {\n\t\treturn Object.fromEntries((await db.queryHandler.fetch(new StagesQuery())).map(it => [it.id, it.slug]))\n\t}\n\n\tprivate mapEventRows(rows: EventRow[], stagesMap: Record<string, string>): Event[] {\n\n\t\treturn rows.map(row => ({\n\t\t\tid: row.id,\n\t\t\tcreatedAt: row.created_at,\n\t\t\tresolvedAt: row.created_at,\n\t\t\tlastStateChange: row.last_state_change,\n\t\t\tvisibleAt: row.visible_at,\n\t\t\tlog: row.log,\n\t\t\tnumRetries: row.num_retries,\n\t\t\tpayload: row.payload,\n\t\t\tstage: stagesMap[row.stage_id],\n\t\t\tstate: row.state,\n\t\t\ttarget: row.target,\n\t\t\ttransactionId: row.transaction_id,\n\t\t}))\n\t}\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"EventsQueryResolver.js","sources":["../../../../../../../packages/engine-actions/src/graphql/resolvers/query/EventsQueryResolver.ts"],"sourcesContent":["import {\n\tEvent,\n\tQueryEventsInProcessingArgs,\n\tQueryEventsToProcessArgs,\n\tQueryFailedEventsArgs,\n\tQueryResolvers,\n} from '../../schema'\nimport { ActionsContext } from '../ActionsContext'\nimport { EventsToProcessQuery } from '../../../model/EventsToProcessQuery'\nimport { EventRow } from '../../../model/types'\nimport { DatabaseContext, StagesQuery } from '@contember/engine-system-api'\nimport { Client, DatabaseQuery } from '@contember/database'\nimport { EventsInProcessingQuery } from '../../../model/EventsInProcessingQuery'\nimport { FailedEventsQuery } from '../../../model/FailedEventsQuery'\nimport { ActionsAuthorizationActions } from '../../../authorization'\nimport { EventByIdQuery } from '../../../model/EventByIdQuery'\n\nexport class EventsQueryResolver implements QueryResolvers<ActionsContext> {\n\tasync eventsInProcessing(parent: unknown, { args }: QueryEventsInProcessingArgs, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.EVENTS_VIEW)\n\n\t\treturn await this.fetchEvents(ctx.db, new EventsInProcessingQuery(args ?? {}))\n\t}\n\n\tasync eventsToProcess(parent: unknown, { args }: QueryEventsToProcessArgs, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.EVENTS_VIEW)\n\n\t\treturn await this.fetchEvents(ctx.db, new EventsToProcessQuery(args ?? {}))\n\t}\n\n\tasync failedEvents(parent: unknown, { args }: QueryFailedEventsArgs, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.EVENTS_VIEW)\n\n\t\treturn await this.fetchEvents(ctx.db, new FailedEventsQuery(args ?? {}))\n\t}\n\n\tasync event(parent: unknown, { id }: { id: string }, ctx: ActionsContext): Promise<Event | null> {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.EVENTS_VIEW)\n\t\tconst stages = await this.fetchStagesMap(ctx.db)\n\t\tconst result = await ctx.db.queryHandler.fetch(new EventByIdQuery(id))\n\t\tif (!result) {\n\t\t\treturn null\n\t\t}\n\t\treturn this.mapEventRows([result], stages)[0]\n\t}\n\n\tprivate async fetchEvents(db: DatabaseContext, query: DatabaseQuery<EventRow[]>) {\n\t\tconst stages = await this.fetchStagesMap(db)\n\t\treturn this.mapEventRows(await db.queryHandler.fetch(query), stages)\n\t}\n\n\tprivate async fetchStagesMap(db: DatabaseContext): Promise<Record<string, string>> {\n\t\treturn Object.fromEntries((await db.queryHandler.fetch(new StagesQuery())).map(it => [it.id, it.slug]))\n\t}\n\n\tprivate mapEventRows(rows: EventRow[], stagesMap: Record<string, string>): Event[] {\n\n\t\treturn rows.map(row => ({\n\t\t\tid: row.id,\n\t\t\tcreatedAt: row.created_at,\n\t\t\tresolvedAt: row.created_at,\n\t\t\tlastStateChange: row.last_state_change,\n\t\t\tvisibleAt: row.visible_at,\n\t\t\tlog: row.log,\n\t\t\tnumRetries: row.num_retries,\n\t\t\tpayload: row.payload,\n\t\t\tstage: stagesMap[row.stage_id],\n\t\t\tstate: row.state,\n\t\t\ttarget: row.target,\n\t\t\ttransactionId: row.transaction_id,\n\t\t\tidentityId: row.identity_id ?? undefined,\n\t\t\tipAddress: row.ip_address ?? undefined,\n\t\t\tuserAgent: row.user_agent ?? undefined,\n\t\t}))\n\t}\n}\n"],"names":[],"mappings":";;;;;;;;AAiBO,MAAM,oBAA8D;AAAA,EAC1E,MAAM,mBAAmB,QAAiB,EAAE,KAAA,GAAqC,KAAqB;AAC/F,UAAA,IAAI,cAAc,4BAA4B,WAAW;AAExD,WAAA,MAAM,KAAK,YAAY,IAAI,IAAI,IAAI,wBAAwB,QAAQ,CAAA,CAAE,CAAC;AAAA,EAAA;AAAA,EAG9E,MAAM,gBAAgB,QAAiB,EAAE,KAAA,GAAkC,KAAqB;AACzF,UAAA,IAAI,cAAc,4BAA4B,WAAW;AAExD,WAAA,MAAM,KAAK,YAAY,IAAI,IAAI,IAAI,qBAAqB,QAAQ,CAAA,CAAE,CAAC;AAAA,EAAA;AAAA,EAG3E,MAAM,aAAa,QAAiB,EAAE,KAAA,GAA+B,KAAqB;AACnF,UAAA,IAAI,cAAc,4BAA4B,WAAW;AAExD,WAAA,MAAM,KAAK,YAAY,IAAI,IAAI,IAAI,kBAAkB,QAAQ,CAAA,CAAE,CAAC;AAAA,EAAA;AAAA,EAGxE,MAAM,MAAM,QAAiB,EAAE,GAAA,GAAsB,KAA4C;AAC1F,UAAA,IAAI,cAAc,4BAA4B,WAAW;AAC/D,UAAM,SAAS,MAAM,KAAK,eAAe,IAAI,EAAE;AACzC,UAAA,SAAS,MAAM,IAAI,GAAG,aAAa,MAAM,IAAI,eAAe,EAAE,CAAC;AACrE,QAAI,CAAC,QAAQ;AACL,aAAA;AAAA,IAAA;AAER,WAAO,KAAK,aAAa,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;AAAA,EAAA;AAAA,EAG7C,MAAc,YAAY,IAAqB,OAAkC;AAChF,UAAM,SAAS,MAAM,KAAK,eAAe,EAAE;AACpC,WAAA,KAAK,aAAa,MAAM,GAAG,aAAa,MAAM,KAAK,GAAG,MAAM;AAAA,EAAA;AAAA,EAGpE,MAAc,eAAe,IAAsD;AAClF,WAAO,OAAO,aAAa,MAAM,GAAG,aAAa,MAAM,IAAI,YAAY,CAAC,GAAG,IAAI,QAAM,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;AAAA,EAAA;AAAA,EAG/F,aAAa,MAAkB,WAA4C;AAE3E,WAAA,KAAK,IAAI,CAAQ,SAAA;AAAA,MACvB,IAAI,IAAI;AAAA,MACR,WAAW,IAAI;AAAA,MACf,YAAY,IAAI;AAAA,MAChB,iBAAiB,IAAI;AAAA,MACrB,WAAW,IAAI;AAAA,MACf,KAAK,IAAI;AAAA,MACT,YAAY,IAAI;AAAA,MAChB,SAAS,IAAI;AAAA,MACb,OAAO,UAAU,IAAI,QAAQ;AAAA,MAC7B,OAAO,IAAI;AAAA,MACX,QAAQ,IAAI;AAAA,MACZ,eAAe,IAAI;AAAA,MACnB,YAAY,IAAI,eAAe;AAAA,MAC/B,WAAW,IAAI,cAAc;AAAA,MAC7B,WAAW,IAAI,cAAc;AAAA,IAAA,EAC5B;AAAA,EAAA;AAEJ;"}
|
|
@@ -15,11 +15,14 @@ const schema = graphqlTag.gql`
|
|
|
15
15
|
failedEvents(args: EventArgs): [Event!]!
|
|
16
16
|
eventsToProcess(args: EventArgs): [Event!]!
|
|
17
17
|
eventsInProcessing(args: EventArgs): [Event!]!
|
|
18
|
+
event(id: Uuid!): Event
|
|
18
19
|
variables: [Variable!]!
|
|
19
20
|
}
|
|
20
21
|
|
|
21
22
|
type Mutation {
|
|
22
23
|
processBatch: ProcessBatchResponse!
|
|
24
|
+
retryEvent(id: Uuid!): RetryEventResponse!
|
|
25
|
+
stopEvent(id: Uuid!): StopEventResponse!
|
|
23
26
|
setVariables(args: SetVariablesArgs!): SetVariablesResponse!
|
|
24
27
|
}
|
|
25
28
|
|
|
@@ -32,6 +35,9 @@ const schema = graphqlTag.gql`
|
|
|
32
35
|
type Event {
|
|
33
36
|
id: Uuid!
|
|
34
37
|
transactionId: Uuid!
|
|
38
|
+
identityId: Uuid
|
|
39
|
+
ipAddress: String
|
|
40
|
+
userAgent: String
|
|
35
41
|
createdAt: DateTime!
|
|
36
42
|
lastStateChange: DateTime!
|
|
37
43
|
resolvedAt: DateTime
|
|
@@ -57,16 +63,24 @@ const schema = graphqlTag.gql`
|
|
|
57
63
|
ok: Boolean!
|
|
58
64
|
}
|
|
59
65
|
|
|
66
|
+
type RetryEventResponse {
|
|
67
|
+
ok: Boolean!
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
type StopEventResponse {
|
|
71
|
+
ok: Boolean!
|
|
72
|
+
}
|
|
73
|
+
|
|
60
74
|
input SetVariablesArgs {
|
|
61
75
|
variables: [VariableInput!]!
|
|
62
76
|
mode: SetVariablesMode
|
|
63
77
|
}
|
|
64
|
-
|
|
78
|
+
|
|
65
79
|
"""
|
|
66
|
-
Defines how it handles original variables.
|
|
80
|
+
Defines how it handles original variables.
|
|
67
81
|
- MERGE merges with new values (default behaviour)
|
|
68
82
|
- SET replaces all variables
|
|
69
|
-
- APPEND_ONLY_MISSING appends values if not already exist
|
|
83
|
+
- APPEND_ONLY_MISSING appends values if not already exist
|
|
70
84
|
"""
|
|
71
85
|
enum SetVariablesMode {
|
|
72
86
|
MERGE
|
|
@@ -78,7 +92,7 @@ const schema = graphqlTag.gql`
|
|
|
78
92
|
name: String!
|
|
79
93
|
value: String!
|
|
80
94
|
}
|
|
81
|
-
|
|
95
|
+
|
|
82
96
|
type SetVariablesResponse {
|
|
83
97
|
ok: Boolean!
|
|
84
98
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.graphql.cjs","sources":["../../../../../../packages/engine-actions/src/graphql/schema/actions.graphql.ts"],"sourcesContent":["import { gql } from 'graphql-tag'\nimport { DocumentNode } from 'graphql'\n\nexport const schema: DocumentNode = gql`\n scalar DateTime\n scalar Json\n scalar Uuid\n\n schema {\n query: Query\n mutation: Mutation\n }\n\n type Query {\n failedEvents(args: EventArgs): [Event!]!\n eventsToProcess(args: EventArgs): [Event!]!\n eventsInProcessing(args: EventArgs): [Event!]!\n variables: [Variable!]!\n }\n\n type Mutation {\n processBatch: ProcessBatchResponse!\n setVariables(args: SetVariablesArgs!): SetVariablesResponse!\n }\n\n input EventArgs {\n offset: Int\n \"Max 10000\"\n limit: Int\n }\n\n type Event {\n id: Uuid!\n transactionId: Uuid!\n createdAt: DateTime!\n lastStateChange: DateTime!\n resolvedAt: DateTime\n visibleAt: DateTime\n numRetries: Int!\n state: EventState!\n stage: String!\n target: String!\n payload: Json!\n log: Json!\n }\n\n enum EventState {\n created\n retrying\n processing\n succeed\n failed\n stopped\n }\n\n type ProcessBatchResponse {\n ok: Boolean!\n }\n\n input SetVariablesArgs {\n variables: [VariableInput!]!\n mode: SetVariablesMode\n }\n\
|
|
1
|
+
{"version":3,"file":"actions.graphql.cjs","sources":["../../../../../../packages/engine-actions/src/graphql/schema/actions.graphql.ts"],"sourcesContent":["import { gql } from 'graphql-tag'\nimport { DocumentNode } from 'graphql'\n\nexport const schema: DocumentNode = gql`\n scalar DateTime\n scalar Json\n scalar Uuid\n\n schema {\n query: Query\n mutation: Mutation\n }\n\n type Query {\n failedEvents(args: EventArgs): [Event!]!\n eventsToProcess(args: EventArgs): [Event!]!\n eventsInProcessing(args: EventArgs): [Event!]!\n event(id: Uuid!): Event\n variables: [Variable!]!\n }\n\n type Mutation {\n processBatch: ProcessBatchResponse!\n retryEvent(id: Uuid!): RetryEventResponse!\n stopEvent(id: Uuid!): StopEventResponse!\n setVariables(args: SetVariablesArgs!): SetVariablesResponse!\n }\n\n input EventArgs {\n offset: Int\n \"Max 10000\"\n limit: Int\n }\n\n type Event {\n id: Uuid!\n transactionId: Uuid!\n identityId: Uuid\n ipAddress: String\n userAgent: String\n createdAt: DateTime!\n lastStateChange: DateTime!\n resolvedAt: DateTime\n visibleAt: DateTime\n numRetries: Int!\n state: EventState!\n stage: String!\n target: String!\n payload: Json!\n log: Json!\n }\n\n enum EventState {\n created\n retrying\n processing\n succeed\n failed\n stopped\n }\n\n type ProcessBatchResponse {\n ok: Boolean!\n }\n\n type RetryEventResponse {\n ok: Boolean!\n }\n\n type StopEventResponse {\n ok: Boolean!\n }\n\n input SetVariablesArgs {\n variables: [VariableInput!]!\n mode: SetVariablesMode\n }\n\n\t\"\"\"\n\tDefines how it handles original variables.\n\t- MERGE merges with new values (default behaviour)\n\t- SET replaces all variables\n\t- APPEND_ONLY_MISSING appends values if not already exist\n\t\"\"\"\n\tenum SetVariablesMode {\n\t\tMERGE\n\t\tSET\n\t\tAPPEND_ONLY_MISSING\n\t}\n\n input VariableInput {\n name: String!\n value: String!\n }\n\n\ttype SetVariablesResponse {\n\t\tok: Boolean!\n\t}\n\n type Variable {\n name: String!\n value: String!\n }\n\n`\n"],"names":["gql"],"mappings":";;;AAGO,MAAM,SAAuBA,WAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;"}
|