@contember/engine-actions 2.1.0-alpha.24 → 2.1.0-alpha.25
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/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/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/resolvers/query/EventsQueryResolver.cjs +4 -1
- package/dist/development/src/graphql/resolvers/query/EventsQueryResolver.cjs.map +1 -1
- package/dist/development/src/graphql/resolvers/query/EventsQueryResolver.js +4 -1
- package/dist/development/src/graphql/resolvers/query/EventsQueryResolver.js.map +1 -1
- package/dist/development/src/graphql/schema/actions.graphql.cjs +9 -6
- package/dist/development/src/graphql/schema/actions.graphql.cjs.map +1 -1
- package/dist/development/src/graphql/schema/actions.graphql.js +9 -6
- 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/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 +7 -2
- package/dist/development/src/triggers/TriggerPayloadPersister.cjs.map +1 -1
- package/dist/development/src/triggers/TriggerPayloadPersister.js +7 -2
- package/dist/development/src/triggers/TriggerPayloadPersister.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/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/resolvers/query/EventsQueryResolver.cjs +4 -1
- package/dist/production/src/graphql/resolvers/query/EventsQueryResolver.cjs.map +1 -1
- package/dist/production/src/graphql/resolvers/query/EventsQueryResolver.js +4 -1
- package/dist/production/src/graphql/resolvers/query/EventsQueryResolver.js.map +1 -1
- package/dist/production/src/graphql/schema/actions.graphql.cjs +9 -6
- package/dist/production/src/graphql/schema/actions.graphql.cjs.map +1 -1
- package/dist/production/src/graphql/schema/actions.graphql.js +9 -6
- 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/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 +7 -2
- package/dist/production/src/triggers/TriggerPayloadPersister.cjs.map +1 -1
- package/dist/production/src/triggers/TriggerPayloadPersister.js +7 -2
- package/dist/production/src/triggers/TriggerPayloadPersister.js.map +1 -1
- package/dist/tests/tsconfig.tsbuildinfo +1 -1
- package/dist/types/dispatch/WebhookTargetHandler.d.ts.map +1 -1
- 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 +6 -0
- package/dist/types/graphql/schema/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/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 -2
- package/dist/types/triggers/TriggerPayloadPersister.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +15 -15
- package/src/ActionsExecutionContainerHookFactory.ts +3 -3
- package/src/dispatch/WebhookTargetHandler.ts +3 -0
- package/src/graphql/resolvers/query/EventsQueryResolver.ts +3 -0
- package/src/graphql/schema/actions.graphql.ts +9 -6
- package/src/graphql/schema/index.ts +6 -0
- 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/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 +6 -1
- package/tests/cases/unit/generator.test.ts +1 -1
- package/tests/cases/unit/webhookHandler.test.ts +9 -0
|
@@ -12,12 +12,12 @@ class ActionsExecutionContainerHookFactory {
|
|
|
12
12
|
}
|
|
13
13
|
create() {
|
|
14
14
|
return (builder) => {
|
|
15
|
-
return builder.setupService("mapperFactory", (mapperFactory, { whereBuilder, schema, pathFactory, systemSchema, providers, stage, project, schemaMeta }) => {
|
|
15
|
+
return builder.setupService("mapperFactory", (mapperFactory, { whereBuilder, schema, pathFactory, systemSchema, providers, stage, project, schemaMeta, joinBuilder, userInfo }) => {
|
|
16
16
|
mapperFactory.hooks.push((mapper) => {
|
|
17
|
-
const triggerPayloadPersister = new TriggerPayloadPersister.TriggerPayloadPersister(mapper, mapper.db.forSchema(systemSchema), providers, project.slug, stage.id, schemaMeta.id);
|
|
17
|
+
const triggerPayloadPersister = new TriggerPayloadPersister.TriggerPayloadPersister(mapper, mapper.db.forSchema(systemSchema), providers, project.slug, stage.id, schemaMeta.id, mapper.identityId, userInfo);
|
|
18
18
|
const triggerPayloadBuilder = new TriggerPayloadBuilder.TriggerPayloadBuilder(mapper);
|
|
19
19
|
const payloadManager = new TriggerPayloadManager.TriggerPayloadManager(triggerPayloadBuilder, triggerPayloadPersister);
|
|
20
|
-
const changesFetcher = new TriggerIndirectChangesFetcher.TriggerIndirectChangesFetcher(mapper, whereBuilder, pathFactory);
|
|
20
|
+
const changesFetcher = new TriggerIndirectChangesFetcher.TriggerIndirectChangesFetcher(schema.model, mapper, whereBuilder, joinBuilder, pathFactory);
|
|
21
21
|
const listenersStore = this.listenerStoreProvider.getListenerStore(schema);
|
|
22
22
|
const triggerHandler = new TriggerHandler.TriggerHandler(payloadManager, listenersStore, changesFetcher);
|
|
23
23
|
triggerHandler.attach(mapper.eventManager);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionsExecutionContainerHookFactory.cjs","sources":["../../../../packages/engine-actions/src/ActionsExecutionContainerHookFactory.ts"],"sourcesContent":["import { TriggerHandler, TriggerIndirectChangesFetcher, TriggerPayloadManager } from './triggers'\nimport { ListenerStoreProvider } from './ListenerStoreProvider'\nimport { TriggerPayloadBuilder } from './triggers/TriggerPayloadBuilder'\nimport { TriggerPayloadPersister } from './triggers/TriggerPayloadPersister'\nimport { ExecutionContainerHook } from '@contember/engine-content-api'\n\nexport class ActionsExecutionContainerHookFactory {\n\tconstructor(\n\t\tprivate readonly listenerStoreProvider: ListenerStoreProvider,\n\t) {\n\t}\n\n\tcreate(): ExecutionContainerHook {\n\t\treturn builder => {\n\t\t\treturn builder.setupService('mapperFactory', (mapperFactory, { whereBuilder, schema, pathFactory, systemSchema, providers, stage, project, schemaMeta }) => {\n\t\t\t\tmapperFactory.hooks.push(mapper => {\n\t\t\t\t\tconst triggerPayloadPersister = new TriggerPayloadPersister(mapper, mapper.db.forSchema(systemSchema), providers, project.slug, stage.id, schemaMeta.id)\n\t\t\t\t\tconst triggerPayloadBuilder = new TriggerPayloadBuilder(mapper)\n\t\t\t\t\tconst payloadManager = new TriggerPayloadManager(triggerPayloadBuilder, triggerPayloadPersister)\n\t\t\t\t\tconst changesFetcher = new TriggerIndirectChangesFetcher(mapper, whereBuilder, pathFactory)\n\t\t\t\t\tconst listenersStore = this.listenerStoreProvider.getListenerStore(schema)\n\t\t\t\t\tconst triggerHandler = new TriggerHandler(payloadManager, listenersStore, changesFetcher)\n\t\t\t\t\ttriggerHandler.attach(mapper.eventManager)\n\t\t\t\t})\n\t\t\t})\n\t\t}\n\t}\n}\n"],"names":["TriggerPayloadPersister","TriggerPayloadBuilder","TriggerPayloadManager","TriggerIndirectChangesFetcher","TriggerHandler"],"mappings":";;;;;;;;AAMO,MAAM,qCAAqC;AAAA,EACjD,YACkB,uBAChB;AADgB,SAAA,wBAAA;AAAA,EAAA;AAAA,EAIlB,SAAiC;AAChC,WAAO,CAAW,YAAA;AACjB,aAAO,QAAQ,aAAa,iBAAiB,CAAC,eAAe,EAAE,cAAc,QAAQ,aAAa,cAAc,WAAW,OAAO,SAAS,
|
|
1
|
+
{"version":3,"file":"ActionsExecutionContainerHookFactory.cjs","sources":["../../../../packages/engine-actions/src/ActionsExecutionContainerHookFactory.ts"],"sourcesContent":["import { TriggerHandler, TriggerIndirectChangesFetcher, TriggerPayloadManager } from './triggers'\nimport { ListenerStoreProvider } from './ListenerStoreProvider'\nimport { TriggerPayloadBuilder } from './triggers/TriggerPayloadBuilder'\nimport { TriggerPayloadPersister } from './triggers/TriggerPayloadPersister'\nimport { ExecutionContainerHook } from '@contember/engine-content-api'\n\nexport class ActionsExecutionContainerHookFactory {\n\tconstructor(\n\t\tprivate readonly listenerStoreProvider: ListenerStoreProvider,\n\t) {\n\t}\n\n\tcreate(): ExecutionContainerHook {\n\t\treturn builder => {\n\t\t\treturn builder.setupService('mapperFactory', (mapperFactory, { whereBuilder, schema, pathFactory, systemSchema, providers, stage, project, schemaMeta, joinBuilder, userInfo }) => {\n\t\t\t\tmapperFactory.hooks.push(mapper => {\n\t\t\t\t\tconst triggerPayloadPersister = new TriggerPayloadPersister(mapper, mapper.db.forSchema(systemSchema), providers, project.slug, stage.id, schemaMeta.id, mapper.identityId, userInfo)\n\t\t\t\t\tconst triggerPayloadBuilder = new TriggerPayloadBuilder(mapper)\n\t\t\t\t\tconst payloadManager = new TriggerPayloadManager(triggerPayloadBuilder, triggerPayloadPersister)\n\t\t\t\t\tconst changesFetcher = new TriggerIndirectChangesFetcher(schema.model, mapper, whereBuilder, joinBuilder, pathFactory)\n\t\t\t\t\tconst listenersStore = this.listenerStoreProvider.getListenerStore(schema)\n\t\t\t\t\tconst triggerHandler = new TriggerHandler(payloadManager, listenersStore, changesFetcher)\n\t\t\t\t\ttriggerHandler.attach(mapper.eventManager)\n\t\t\t\t})\n\t\t\t})\n\t\t}\n\t}\n}\n"],"names":["TriggerPayloadPersister","TriggerPayloadBuilder","TriggerPayloadManager","TriggerIndirectChangesFetcher","TriggerHandler"],"mappings":";;;;;;;;AAMO,MAAM,qCAAqC;AAAA,EACjD,YACkB,uBAChB;AADgB,SAAA,wBAAA;AAAA,EAAA;AAAA,EAIlB,SAAiC;AAChC,WAAO,CAAW,YAAA;AACjB,aAAO,QAAQ,aAAa,iBAAiB,CAAC,eAAe,EAAE,cAAc,QAAQ,aAAa,cAAc,WAAW,OAAO,SAAS,YAAY,aAAa,eAAe;AACpK,sBAAA,MAAM,KAAK,CAAU,WAAA;AAClC,gBAAM,0BAA0B,IAAIA,wBAAAA,wBAAwB,QAAQ,OAAO,GAAG,UAAU,YAAY,GAAG,WAAW,QAAQ,MAAM,MAAM,IAAI,WAAW,IAAI,OAAO,YAAY,QAAQ;AAC9K,gBAAA,wBAAwB,IAAIC,sBAAA,sBAAsB,MAAM;AAC9D,gBAAM,iBAAiB,IAAIC,4CAAsB,uBAAuB,uBAAuB;AACzF,gBAAA,iBAAiB,IAAIC,8BAAAA,8BAA8B,OAAO,OAAO,QAAQ,cAAc,aAAa,WAAW;AACrH,gBAAM,iBAAiB,KAAK,sBAAsB,iBAAiB,MAAM;AACzE,gBAAM,iBAAiB,IAAIC,eAAAA,eAAe,gBAAgB,gBAAgB,cAAc;AACzE,yBAAA,OAAO,OAAO,YAAY;AAAA,QAAA,CACzC;AAAA,MAAA,CACD;AAAA,IACF;AAAA,EAAA;AAEF;;"}
|
|
@@ -10,12 +10,12 @@ class ActionsExecutionContainerHookFactory {
|
|
|
10
10
|
}
|
|
11
11
|
create() {
|
|
12
12
|
return (builder) => {
|
|
13
|
-
return builder.setupService("mapperFactory", (mapperFactory, { whereBuilder, schema, pathFactory, systemSchema, providers, stage, project, schemaMeta }) => {
|
|
13
|
+
return builder.setupService("mapperFactory", (mapperFactory, { whereBuilder, schema, pathFactory, systemSchema, providers, stage, project, schemaMeta, joinBuilder, userInfo }) => {
|
|
14
14
|
mapperFactory.hooks.push((mapper) => {
|
|
15
|
-
const triggerPayloadPersister = new TriggerPayloadPersister(mapper, mapper.db.forSchema(systemSchema), providers, project.slug, stage.id, schemaMeta.id);
|
|
15
|
+
const triggerPayloadPersister = new TriggerPayloadPersister(mapper, mapper.db.forSchema(systemSchema), providers, project.slug, stage.id, schemaMeta.id, mapper.identityId, userInfo);
|
|
16
16
|
const triggerPayloadBuilder = new TriggerPayloadBuilder(mapper);
|
|
17
17
|
const payloadManager = new TriggerPayloadManager(triggerPayloadBuilder, triggerPayloadPersister);
|
|
18
|
-
const changesFetcher = new TriggerIndirectChangesFetcher(mapper, whereBuilder, pathFactory);
|
|
18
|
+
const changesFetcher = new TriggerIndirectChangesFetcher(schema.model, mapper, whereBuilder, joinBuilder, pathFactory);
|
|
19
19
|
const listenersStore = this.listenerStoreProvider.getListenerStore(schema);
|
|
20
20
|
const triggerHandler = new TriggerHandler(payloadManager, listenersStore, changesFetcher);
|
|
21
21
|
triggerHandler.attach(mapper.eventManager);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionsExecutionContainerHookFactory.js","sources":["../../../../packages/engine-actions/src/ActionsExecutionContainerHookFactory.ts"],"sourcesContent":["import { TriggerHandler, TriggerIndirectChangesFetcher, TriggerPayloadManager } from './triggers'\nimport { ListenerStoreProvider } from './ListenerStoreProvider'\nimport { TriggerPayloadBuilder } from './triggers/TriggerPayloadBuilder'\nimport { TriggerPayloadPersister } from './triggers/TriggerPayloadPersister'\nimport { ExecutionContainerHook } from '@contember/engine-content-api'\n\nexport class ActionsExecutionContainerHookFactory {\n\tconstructor(\n\t\tprivate readonly listenerStoreProvider: ListenerStoreProvider,\n\t) {\n\t}\n\n\tcreate(): ExecutionContainerHook {\n\t\treturn builder => {\n\t\t\treturn builder.setupService('mapperFactory', (mapperFactory, { whereBuilder, schema, pathFactory, systemSchema, providers, stage, project, schemaMeta }) => {\n\t\t\t\tmapperFactory.hooks.push(mapper => {\n\t\t\t\t\tconst triggerPayloadPersister = new TriggerPayloadPersister(mapper, mapper.db.forSchema(systemSchema), providers, project.slug, stage.id, schemaMeta.id)\n\t\t\t\t\tconst triggerPayloadBuilder = new TriggerPayloadBuilder(mapper)\n\t\t\t\t\tconst payloadManager = new TriggerPayloadManager(triggerPayloadBuilder, triggerPayloadPersister)\n\t\t\t\t\tconst changesFetcher = new TriggerIndirectChangesFetcher(mapper, whereBuilder, pathFactory)\n\t\t\t\t\tconst listenersStore = this.listenerStoreProvider.getListenerStore(schema)\n\t\t\t\t\tconst triggerHandler = new TriggerHandler(payloadManager, listenersStore, changesFetcher)\n\t\t\t\t\ttriggerHandler.attach(mapper.eventManager)\n\t\t\t\t})\n\t\t\t})\n\t\t}\n\t}\n}\n"],"names":[],"mappings":";;;;;;AAMO,MAAM,qCAAqC;AAAA,EACjD,YACkB,uBAChB;AADgB,SAAA,wBAAA;AAAA,EAAA;AAAA,EAIlB,SAAiC;AAChC,WAAO,CAAW,YAAA;AACjB,aAAO,QAAQ,aAAa,iBAAiB,CAAC,eAAe,EAAE,cAAc,QAAQ,aAAa,cAAc,WAAW,OAAO,SAAS,
|
|
1
|
+
{"version":3,"file":"ActionsExecutionContainerHookFactory.js","sources":["../../../../packages/engine-actions/src/ActionsExecutionContainerHookFactory.ts"],"sourcesContent":["import { TriggerHandler, TriggerIndirectChangesFetcher, TriggerPayloadManager } from './triggers'\nimport { ListenerStoreProvider } from './ListenerStoreProvider'\nimport { TriggerPayloadBuilder } from './triggers/TriggerPayloadBuilder'\nimport { TriggerPayloadPersister } from './triggers/TriggerPayloadPersister'\nimport { ExecutionContainerHook } from '@contember/engine-content-api'\n\nexport class ActionsExecutionContainerHookFactory {\n\tconstructor(\n\t\tprivate readonly listenerStoreProvider: ListenerStoreProvider,\n\t) {\n\t}\n\n\tcreate(): ExecutionContainerHook {\n\t\treturn builder => {\n\t\t\treturn builder.setupService('mapperFactory', (mapperFactory, { whereBuilder, schema, pathFactory, systemSchema, providers, stage, project, schemaMeta, joinBuilder, userInfo }) => {\n\t\t\t\tmapperFactory.hooks.push(mapper => {\n\t\t\t\t\tconst triggerPayloadPersister = new TriggerPayloadPersister(mapper, mapper.db.forSchema(systemSchema), providers, project.slug, stage.id, schemaMeta.id, mapper.identityId, userInfo)\n\t\t\t\t\tconst triggerPayloadBuilder = new TriggerPayloadBuilder(mapper)\n\t\t\t\t\tconst payloadManager = new TriggerPayloadManager(triggerPayloadBuilder, triggerPayloadPersister)\n\t\t\t\t\tconst changesFetcher = new TriggerIndirectChangesFetcher(schema.model, mapper, whereBuilder, joinBuilder, pathFactory)\n\t\t\t\t\tconst listenersStore = this.listenerStoreProvider.getListenerStore(schema)\n\t\t\t\t\tconst triggerHandler = new TriggerHandler(payloadManager, listenersStore, changesFetcher)\n\t\t\t\t\ttriggerHandler.attach(mapper.eventManager)\n\t\t\t\t})\n\t\t\t})\n\t\t}\n\t}\n}\n"],"names":[],"mappings":";;;;;;AAMO,MAAM,qCAAqC;AAAA,EACjD,YACkB,uBAChB;AADgB,SAAA,wBAAA;AAAA,EAAA;AAAA,EAIlB,SAAiC;AAChC,WAAO,CAAW,YAAA;AACjB,aAAO,QAAQ,aAAa,iBAAiB,CAAC,eAAe,EAAE,cAAc,QAAQ,aAAa,cAAc,WAAW,OAAO,SAAS,YAAY,aAAa,eAAe;AACpK,sBAAA,MAAM,KAAK,CAAU,WAAA;AAClC,gBAAM,0BAA0B,IAAI,wBAAwB,QAAQ,OAAO,GAAG,UAAU,YAAY,GAAG,WAAW,QAAQ,MAAM,MAAM,IAAI,WAAW,IAAI,OAAO,YAAY,QAAQ;AAC9K,gBAAA,wBAAwB,IAAI,sBAAsB,MAAM;AAC9D,gBAAM,iBAAiB,IAAI,sBAAsB,uBAAuB,uBAAuB;AACzF,gBAAA,iBAAiB,IAAI,8BAA8B,OAAO,OAAO,QAAQ,cAAc,aAAa,WAAW;AACrH,gBAAM,iBAAiB,KAAK,sBAAsB,iBAAiB,MAAM;AACzE,gBAAM,iBAAiB,IAAI,eAAe,gBAAgB,gBAAgB,cAAc;AACzE,yBAAA,OAAO,OAAO,YAAY;AAAA,QAAA,CACzC;AAAA,MAAA,CACD;AAAA,IACF;AAAA,EAAA;AAEF;"}
|
|
@@ -159,6 +159,9 @@ class WebhookTargetHandler {
|
|
|
159
159
|
meta: {
|
|
160
160
|
eventId: it.id,
|
|
161
161
|
transactionId: it.transaction_id,
|
|
162
|
+
identityId: it.identity_id ?? null,
|
|
163
|
+
ipAddress: it.ip_address ?? null,
|
|
164
|
+
userAgent: it.user_agent ?? null,
|
|
162
165
|
createdAt: it.created_at.toISOString(),
|
|
163
166
|
lastStateChange: it.last_state_change.toISOString(),
|
|
164
167
|
numRetries: it.num_retries,
|
|
@@ -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":"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"}
|
|
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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"}
|
|
@@ -50,7 +50,10 @@ class EventsQueryResolver {
|
|
|
50
50
|
stage: stagesMap[row.stage_id],
|
|
51
51
|
state: row.state,
|
|
52
52
|
target: row.target,
|
|
53
|
-
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
|
|
54
57
|
}));
|
|
55
58
|
}
|
|
56
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'\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}))\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,IAAA,
|
|
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;;"}
|
|
@@ -48,7 +48,10 @@ class EventsQueryResolver {
|
|
|
48
48
|
stage: stagesMap[row.stage_id],
|
|
49
49
|
state: row.state,
|
|
50
50
|
target: row.target,
|
|
51
|
-
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
|
|
52
55
|
}));
|
|
53
56
|
}
|
|
54
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'\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}))\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,IAAA,
|
|
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;"}
|
|
@@ -35,6 +35,9 @@ const schema = graphqlTag.gql`
|
|
|
35
35
|
type Event {
|
|
36
36
|
id: Uuid!
|
|
37
37
|
transactionId: Uuid!
|
|
38
|
+
identityId: Uuid
|
|
39
|
+
ipAddress: String
|
|
40
|
+
userAgent: String
|
|
38
41
|
createdAt: DateTime!
|
|
39
42
|
lastStateChange: DateTime!
|
|
40
43
|
resolvedAt: DateTime
|
|
@@ -59,11 +62,11 @@ const schema = graphqlTag.gql`
|
|
|
59
62
|
type ProcessBatchResponse {
|
|
60
63
|
ok: Boolean!
|
|
61
64
|
}
|
|
62
|
-
|
|
65
|
+
|
|
63
66
|
type RetryEventResponse {
|
|
64
67
|
ok: Boolean!
|
|
65
68
|
}
|
|
66
|
-
|
|
69
|
+
|
|
67
70
|
type StopEventResponse {
|
|
68
71
|
ok: Boolean!
|
|
69
72
|
}
|
|
@@ -72,12 +75,12 @@ const schema = graphqlTag.gql`
|
|
|
72
75
|
variables: [VariableInput!]!
|
|
73
76
|
mode: SetVariablesMode
|
|
74
77
|
}
|
|
75
|
-
|
|
78
|
+
|
|
76
79
|
"""
|
|
77
|
-
Defines how it handles original variables.
|
|
80
|
+
Defines how it handles original variables.
|
|
78
81
|
- MERGE merges with new values (default behaviour)
|
|
79
82
|
- SET replaces all variables
|
|
80
|
-
- APPEND_ONLY_MISSING appends values if not already exist
|
|
83
|
+
- APPEND_ONLY_MISSING appends values if not already exist
|
|
81
84
|
"""
|
|
82
85
|
enum SetVariablesMode {
|
|
83
86
|
MERGE
|
|
@@ -89,7 +92,7 @@ const schema = graphqlTag.gql`
|
|
|
89
92
|
name: String!
|
|
90
93
|
value: String!
|
|
91
94
|
}
|
|
92
|
-
|
|
95
|
+
|
|
93
96
|
type SetVariablesResponse {
|
|
94
97
|
ok: Boolean!
|
|
95
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 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 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
|
|
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;;"}
|
|
@@ -33,6 +33,9 @@ const schema = gql`
|
|
|
33
33
|
type Event {
|
|
34
34
|
id: Uuid!
|
|
35
35
|
transactionId: Uuid!
|
|
36
|
+
identityId: Uuid
|
|
37
|
+
ipAddress: String
|
|
38
|
+
userAgent: String
|
|
36
39
|
createdAt: DateTime!
|
|
37
40
|
lastStateChange: DateTime!
|
|
38
41
|
resolvedAt: DateTime
|
|
@@ -57,11 +60,11 @@ const schema = gql`
|
|
|
57
60
|
type ProcessBatchResponse {
|
|
58
61
|
ok: Boolean!
|
|
59
62
|
}
|
|
60
|
-
|
|
63
|
+
|
|
61
64
|
type RetryEventResponse {
|
|
62
65
|
ok: Boolean!
|
|
63
66
|
}
|
|
64
|
-
|
|
67
|
+
|
|
65
68
|
type StopEventResponse {
|
|
66
69
|
ok: Boolean!
|
|
67
70
|
}
|
|
@@ -70,12 +73,12 @@ const schema = gql`
|
|
|
70
73
|
variables: [VariableInput!]!
|
|
71
74
|
mode: SetVariablesMode
|
|
72
75
|
}
|
|
73
|
-
|
|
76
|
+
|
|
74
77
|
"""
|
|
75
|
-
Defines how it handles original variables.
|
|
78
|
+
Defines how it handles original variables.
|
|
76
79
|
- MERGE merges with new values (default behaviour)
|
|
77
80
|
- SET replaces all variables
|
|
78
|
-
- APPEND_ONLY_MISSING appends values if not already exist
|
|
81
|
+
- APPEND_ONLY_MISSING appends values if not already exist
|
|
79
82
|
"""
|
|
80
83
|
enum SetVariablesMode {
|
|
81
84
|
MERGE
|
|
@@ -87,7 +90,7 @@ const schema = gql`
|
|
|
87
90
|
name: String!
|
|
88
91
|
value: String!
|
|
89
92
|
}
|
|
90
|
-
|
|
93
|
+
|
|
91
94
|
type SetVariablesResponse {
|
|
92
95
|
ok: Boolean!
|
|
93
96
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.graphql.js","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 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
|
|
1
|
+
{"version":3,"file":"actions.graphql.js","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":[],"mappings":";AAGO,MAAM,SAAuB;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;"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const sql = `
|
|
3
|
+
ALTER TABLE actions_event
|
|
4
|
+
ADD COLUMN IF NOT EXISTS identity_id UUID DEFAULT NULL;
|
|
5
|
+
|
|
6
|
+
ALTER TABLE actions_event
|
|
7
|
+
ADD COLUMN IF NOT EXISTS ip_address INET DEFAULT NULL;
|
|
8
|
+
|
|
9
|
+
ALTER TABLE actions_event
|
|
10
|
+
ADD COLUMN IF NOT EXISTS user_agent TEXT DEFAULT NULL;
|
|
11
|
+
`;
|
|
12
|
+
async function _20250528160000actioneventuser(builder) {
|
|
13
|
+
builder.sql(sql);
|
|
14
|
+
}
|
|
15
|
+
module.exports = _20250528160000actioneventuser;
|
|
16
|
+
//# sourceMappingURL=2025-05-28-160000-action-event-user.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"2025-05-28-160000-action-event-user.cjs","sources":["../../../../../packages/engine-actions/src/migrations/2025-05-28-160000-action-event-user.ts"],"sourcesContent":["import { MigrationBuilder } from '@contember/database-migrations'\n\nconst sql = `\nALTER TABLE actions_event\nADD COLUMN IF NOT EXISTS identity_id UUID DEFAULT NULL;\n\nALTER TABLE actions_event\nADD COLUMN IF NOT EXISTS ip_address INET DEFAULT NULL;\n\nALTER TABLE actions_event\nADD COLUMN IF NOT EXISTS user_agent TEXT DEFAULT NULL;\n`\n\nexport default async function (builder: MigrationBuilder) {\n\tbuilder.sql(sql)\n}\n"],"names":[],"mappings":";AAEA,MAAM,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWZ,eAAA,+BAA+B,SAA2B;AACzD,UAAQ,IAAI,GAAG;AAChB;;"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
const sql = `
|
|
2
|
+
ALTER TABLE actions_event
|
|
3
|
+
ADD COLUMN IF NOT EXISTS identity_id UUID DEFAULT NULL;
|
|
4
|
+
|
|
5
|
+
ALTER TABLE actions_event
|
|
6
|
+
ADD COLUMN IF NOT EXISTS ip_address INET DEFAULT NULL;
|
|
7
|
+
|
|
8
|
+
ALTER TABLE actions_event
|
|
9
|
+
ADD COLUMN IF NOT EXISTS user_agent TEXT DEFAULT NULL;
|
|
10
|
+
`;
|
|
11
|
+
async function _20250528160000actioneventuser(builder) {
|
|
12
|
+
builder.sql(sql);
|
|
13
|
+
}
|
|
14
|
+
export {
|
|
15
|
+
_20250528160000actioneventuser as default
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=2025-05-28-160000-action-event-user.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"2025-05-28-160000-action-event-user.js","sources":["../../../../../packages/engine-actions/src/migrations/2025-05-28-160000-action-event-user.ts"],"sourcesContent":["import { MigrationBuilder } from '@contember/database-migrations'\n\nconst sql = `\nALTER TABLE actions_event\nADD COLUMN IF NOT EXISTS identity_id UUID DEFAULT NULL;\n\nALTER TABLE actions_event\nADD COLUMN IF NOT EXISTS ip_address INET DEFAULT NULL;\n\nALTER TABLE actions_event\nADD COLUMN IF NOT EXISTS user_agent TEXT DEFAULT NULL;\n`\n\nexport default async function (builder: MigrationBuilder) {\n\tbuilder.sql(sql)\n}\n"],"names":[],"mappings":"AAEA,MAAM,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWZ,eAAA,+BAA+B,SAA2B;AACzD,UAAQ,IAAI,GAAG;AAChB;"}
|
|
@@ -3,8 +3,10 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
3
3
|
const snapshot = require("./snapshot.cjs");
|
|
4
4
|
const databaseMigrations = require("@contember/database-migrations");
|
|
5
5
|
const _20230310145000ActionsVariables = require("./2023-03-10-145000-actions-variables.cjs");
|
|
6
|
+
const _20250528160000ActionEventUser = require("./2025-05-28-160000-action-event-user.cjs");
|
|
6
7
|
const migrationsGroup = new databaseMigrations.MigrationGroup(snapshot, {
|
|
7
|
-
"2023-03-10-145000-actions-variables": _20230310145000ActionsVariables
|
|
8
|
+
"2023-03-10-145000-actions-variables": _20230310145000ActionsVariables,
|
|
9
|
+
"2025-05-28-160000-action-event-user": _20250528160000ActionEventUser
|
|
8
10
|
});
|
|
9
11
|
exports.migrationsGroup = migrationsGroup;
|
|
10
12
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../../packages/engine-actions/src/migrations/index.ts"],"sourcesContent":["import snapshot from './snapshot'\nimport { MigrationGroup } from '@contember/database-migrations'\nimport _20230310145000actionsvariables from './2023-03-10-145000-actions-variables'\n\nexport const migrationsGroup = new MigrationGroup(snapshot, {\n\t'2023-03-10-145000-actions-variables': _20230310145000actionsvariables,\n})\n"],"names":["MigrationGroup","_20230310145000actionsvariables"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../../packages/engine-actions/src/migrations/index.ts"],"sourcesContent":["import snapshot from './snapshot'\nimport { MigrationGroup } from '@contember/database-migrations'\nimport _20230310145000actionsvariables from './2023-03-10-145000-actions-variables'\nimport _20250528160000actioneventuser from './2025-05-28-160000-action-event-user'\n\nexport const migrationsGroup = new MigrationGroup(snapshot, {\n\t'2023-03-10-145000-actions-variables': _20230310145000actionsvariables,\n\t'2025-05-28-160000-action-event-user': _20250528160000actioneventuser,\n})\n"],"names":["MigrationGroup","_20230310145000actionsvariables","_20250528160000actioneventuser"],"mappings":";;;;;;AAKa,MAAA,kBAAkB,IAAIA,mBAAA,eAAe,UAAU;AAAA,EAC3D,uCAAuCC;AAAAA,EACvC,uCAAuCC;AACxC,CAAC;;"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import snapshot from "./snapshot.js";
|
|
2
2
|
import { MigrationGroup } from "@contember/database-migrations";
|
|
3
3
|
import _20230310145000actionsvariables from "./2023-03-10-145000-actions-variables.js";
|
|
4
|
+
import _20250528160000actioneventuser from "./2025-05-28-160000-action-event-user.js";
|
|
4
5
|
const migrationsGroup = new MigrationGroup(snapshot, {
|
|
5
|
-
"2023-03-10-145000-actions-variables": _20230310145000actionsvariables
|
|
6
|
+
"2023-03-10-145000-actions-variables": _20230310145000actionsvariables,
|
|
7
|
+
"2025-05-28-160000-action-event-user": _20250528160000actioneventuser
|
|
6
8
|
});
|
|
7
9
|
export {
|
|
8
10
|
migrationsGroup
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../../packages/engine-actions/src/migrations/index.ts"],"sourcesContent":["import snapshot from './snapshot'\nimport { MigrationGroup } from '@contember/database-migrations'\nimport _20230310145000actionsvariables from './2023-03-10-145000-actions-variables'\n\nexport const migrationsGroup = new MigrationGroup(snapshot, {\n\t'2023-03-10-145000-actions-variables': _20230310145000actionsvariables,\n})\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../packages/engine-actions/src/migrations/index.ts"],"sourcesContent":["import snapshot from './snapshot'\nimport { MigrationGroup } from '@contember/database-migrations'\nimport _20230310145000actionsvariables from './2023-03-10-145000-actions-variables'\nimport _20250528160000actioneventuser from './2025-05-28-160000-action-event-user'\n\nexport const migrationsGroup = new MigrationGroup(snapshot, {\n\t'2023-03-10-145000-actions-variables': _20230310145000actionsvariables,\n\t'2025-05-28-160000-action-event-user': _20250528160000actioneventuser,\n})\n"],"names":[],"mappings":";;;;AAKa,MAAA,kBAAkB,IAAI,eAAe,UAAU;AAAA,EAC3D,uCAAuC;AAAA,EACvC,uCAAuC;AACxC,CAAC;"}
|
|
@@ -29,11 +29,14 @@ async function snapshot(builder) {
|
|
|
29
29
|
trigger TEXT NOT NULL,
|
|
30
30
|
priority INT NOT NULL DEFAULT 0,
|
|
31
31
|
payload JSONB NOT NULL,
|
|
32
|
-
log JSONB NOT NULL DEFAULT '[]'
|
|
32
|
+
log JSONB NOT NULL DEFAULT '[]',
|
|
33
|
+
identity_id UUID DEFAULT NULL,
|
|
34
|
+
ip_address INET DEFAULT NULL,
|
|
35
|
+
user_agent TEXT DEFAULT NULL
|
|
33
36
|
);
|
|
34
37
|
|
|
35
38
|
CREATE INDEX ON actions_event (priority DESC, visible_at) WHERE state IN ('created', 'retrying', 'processing');
|
|
36
|
-
|
|
39
|
+
|
|
37
40
|
CREATE TABLE actions_variable
|
|
38
41
|
(
|
|
39
42
|
id UUID PRIMARY KEY NOT NULL,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot.cjs","sources":["../../../../../packages/engine-actions/src/migrations/snapshot.ts"],"sourcesContent":["import { MigrationBuilder } from '@contember/database-migrations'\n\nexport default async function (builder: MigrationBuilder) {\n\tbuilder.sql(`\n\t\tCREATE TYPE ACTIONS_TRIGGER_STATE AS ENUM (\n\t\t\t'created' ,\n\t\t\t'retrying',\n\t\t\t'processing',\n\t\t\t'succeed',\n\t\t\t'failed',\n\t\t\t'stopped'\n\t\t);\n\n\t\tCREATE TABLE actions_event\n\t\t(\n\t\t\tid UUID PRIMARY KEY NOT NULL,\n\t\t\ttransaction_id UUID NOT NULL,\n\t\t\tcreated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n\t\t\tresolved_at TIMESTAMPTZ,\n\t\t\tvisible_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n\t\t\tnum_retries INT NOT NULL,\n\t\t\tstate ACTIONS_TRIGGER_STATE NOT NULL DEFAULT 'created',\n\t\t\tlast_state_change TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n\t\t\tstage_id UUID NOT NULL\n\t\t\t\tREFERENCES stage\n\t\t\t\t\tON DELETE CASCADE,\n\t\t\tschema_id INTEGER NOT NULL\n\t\t\t\tREFERENCES schema_migration,\n\t\t\ttarget TEXT NOT NULL,\n\t\t\ttrigger TEXT NOT NULL,\n\t\t\tpriority INT NOT NULL DEFAULT 0,\n\t\t\tpayload JSONB NOT NULL,\n\t\t\tlog JSONB NOT NULL DEFAULT '[]'\n\t\t);\n\n\t\tCREATE INDEX ON actions_event (priority DESC, visible_at) WHERE state IN ('created', 'retrying', 'processing');\n\
|
|
1
|
+
{"version":3,"file":"snapshot.cjs","sources":["../../../../../packages/engine-actions/src/migrations/snapshot.ts"],"sourcesContent":["import { MigrationBuilder } from '@contember/database-migrations'\n\nexport default async function (builder: MigrationBuilder) {\n\tbuilder.sql(`\n\t\tCREATE TYPE ACTIONS_TRIGGER_STATE AS ENUM (\n\t\t\t'created' ,\n\t\t\t'retrying',\n\t\t\t'processing',\n\t\t\t'succeed',\n\t\t\t'failed',\n\t\t\t'stopped'\n\t\t);\n\n\t\tCREATE TABLE actions_event\n\t\t(\n\t\t\tid UUID PRIMARY KEY NOT NULL,\n\t\t\ttransaction_id UUID NOT NULL,\n\t\t\tcreated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n\t\t\tresolved_at TIMESTAMPTZ,\n\t\t\tvisible_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n\t\t\tnum_retries INT NOT NULL,\n\t\t\tstate ACTIONS_TRIGGER_STATE NOT NULL DEFAULT 'created',\n\t\t\tlast_state_change TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n\t\t\tstage_id UUID NOT NULL\n\t\t\t\tREFERENCES stage\n\t\t\t\t\tON DELETE CASCADE,\n\t\t\tschema_id INTEGER NOT NULL\n\t\t\t\tREFERENCES schema_migration,\n\t\t\ttarget TEXT NOT NULL,\n\t\t\ttrigger TEXT NOT NULL,\n\t\t\tpriority INT NOT NULL DEFAULT 0,\n\t\t\tpayload JSONB NOT NULL,\n\t\t\tlog JSONB NOT NULL DEFAULT '[]',\n\t\t\tidentity_id UUID DEFAULT NULL,\n\t\t\tip_address INET DEFAULT NULL,\n\t\t\tuser_agent TEXT DEFAULT NULL\n\t\t);\n\n\t\tCREATE INDEX ON actions_event (priority DESC, visible_at) WHERE state IN ('created', 'retrying', 'processing');\n\n\t\tCREATE TABLE actions_variable\n \t(\n \tid UUID PRIMARY KEY NOT NULL,\n \tcreated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n \tupdated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n \tname TEXT NOT NULL UNIQUE,\n \tvalue TEXT NOT NULL\n \t)\n\t`)\n}\n"],"names":[],"mappings":";AAEA,eAAA,SAA+B,SAA2B;AACzD,UAAQ,IAAI;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,EA6CX;AACF;;"}
|
|
@@ -28,11 +28,14 @@ async function snapshot(builder) {
|
|
|
28
28
|
trigger TEXT NOT NULL,
|
|
29
29
|
priority INT NOT NULL DEFAULT 0,
|
|
30
30
|
payload JSONB NOT NULL,
|
|
31
|
-
log JSONB NOT NULL DEFAULT '[]'
|
|
31
|
+
log JSONB NOT NULL DEFAULT '[]',
|
|
32
|
+
identity_id UUID DEFAULT NULL,
|
|
33
|
+
ip_address INET DEFAULT NULL,
|
|
34
|
+
user_agent TEXT DEFAULT NULL
|
|
32
35
|
);
|
|
33
36
|
|
|
34
37
|
CREATE INDEX ON actions_event (priority DESC, visible_at) WHERE state IN ('created', 'retrying', 'processing');
|
|
35
|
-
|
|
38
|
+
|
|
36
39
|
CREATE TABLE actions_variable
|
|
37
40
|
(
|
|
38
41
|
id UUID PRIMARY KEY NOT NULL,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot.js","sources":["../../../../../packages/engine-actions/src/migrations/snapshot.ts"],"sourcesContent":["import { MigrationBuilder } from '@contember/database-migrations'\n\nexport default async function (builder: MigrationBuilder) {\n\tbuilder.sql(`\n\t\tCREATE TYPE ACTIONS_TRIGGER_STATE AS ENUM (\n\t\t\t'created' ,\n\t\t\t'retrying',\n\t\t\t'processing',\n\t\t\t'succeed',\n\t\t\t'failed',\n\t\t\t'stopped'\n\t\t);\n\n\t\tCREATE TABLE actions_event\n\t\t(\n\t\t\tid UUID PRIMARY KEY NOT NULL,\n\t\t\ttransaction_id UUID NOT NULL,\n\t\t\tcreated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n\t\t\tresolved_at TIMESTAMPTZ,\n\t\t\tvisible_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n\t\t\tnum_retries INT NOT NULL,\n\t\t\tstate ACTIONS_TRIGGER_STATE NOT NULL DEFAULT 'created',\n\t\t\tlast_state_change TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n\t\t\tstage_id UUID NOT NULL\n\t\t\t\tREFERENCES stage\n\t\t\t\t\tON DELETE CASCADE,\n\t\t\tschema_id INTEGER NOT NULL\n\t\t\t\tREFERENCES schema_migration,\n\t\t\ttarget TEXT NOT NULL,\n\t\t\ttrigger TEXT NOT NULL,\n\t\t\tpriority INT NOT NULL DEFAULT 0,\n\t\t\tpayload JSONB NOT NULL,\n\t\t\tlog JSONB NOT NULL DEFAULT '[]'\n\t\t);\n\n\t\tCREATE INDEX ON actions_event (priority DESC, visible_at) WHERE state IN ('created', 'retrying', 'processing');\n\
|
|
1
|
+
{"version":3,"file":"snapshot.js","sources":["../../../../../packages/engine-actions/src/migrations/snapshot.ts"],"sourcesContent":["import { MigrationBuilder } from '@contember/database-migrations'\n\nexport default async function (builder: MigrationBuilder) {\n\tbuilder.sql(`\n\t\tCREATE TYPE ACTIONS_TRIGGER_STATE AS ENUM (\n\t\t\t'created' ,\n\t\t\t'retrying',\n\t\t\t'processing',\n\t\t\t'succeed',\n\t\t\t'failed',\n\t\t\t'stopped'\n\t\t);\n\n\t\tCREATE TABLE actions_event\n\t\t(\n\t\t\tid UUID PRIMARY KEY NOT NULL,\n\t\t\ttransaction_id UUID NOT NULL,\n\t\t\tcreated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n\t\t\tresolved_at TIMESTAMPTZ,\n\t\t\tvisible_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n\t\t\tnum_retries INT NOT NULL,\n\t\t\tstate ACTIONS_TRIGGER_STATE NOT NULL DEFAULT 'created',\n\t\t\tlast_state_change TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n\t\t\tstage_id UUID NOT NULL\n\t\t\t\tREFERENCES stage\n\t\t\t\t\tON DELETE CASCADE,\n\t\t\tschema_id INTEGER NOT NULL\n\t\t\t\tREFERENCES schema_migration,\n\t\t\ttarget TEXT NOT NULL,\n\t\t\ttrigger TEXT NOT NULL,\n\t\t\tpriority INT NOT NULL DEFAULT 0,\n\t\t\tpayload JSONB NOT NULL,\n\t\t\tlog JSONB NOT NULL DEFAULT '[]',\n\t\t\tidentity_id UUID DEFAULT NULL,\n\t\t\tip_address INET DEFAULT NULL,\n\t\t\tuser_agent TEXT DEFAULT NULL\n\t\t);\n\n\t\tCREATE INDEX ON actions_event (priority DESC, visible_at) WHERE state IN ('created', 'retrying', 'processing');\n\n\t\tCREATE TABLE actions_variable\n \t(\n \tid UUID PRIMARY KEY NOT NULL,\n \tcreated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n \tupdated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n \tname TEXT NOT NULL UNIQUE,\n \tvalue TEXT NOT NULL\n \t)\n\t`)\n}\n"],"names":[],"mappings":"AAEA,eAAA,SAA+B,SAA2B;AACzD,UAAQ,IAAI;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,EA6CX;AACF;"}
|