@contember/engine-actions 2.1.0-alpha.24 → 2.1.0-alpha.26

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.
Files changed (137) hide show
  1. package/dist/development/src/ActionsExecutionContainerHookFactory.cjs +3 -3
  2. package/dist/development/src/ActionsExecutionContainerHookFactory.cjs.map +1 -1
  3. package/dist/development/src/ActionsExecutionContainerHookFactory.js +3 -3
  4. package/dist/development/src/ActionsExecutionContainerHookFactory.js.map +1 -1
  5. package/dist/development/src/dispatch/WebhookTargetHandler.cjs +3 -0
  6. package/dist/development/src/dispatch/WebhookTargetHandler.cjs.map +1 -1
  7. package/dist/development/src/dispatch/WebhookTargetHandler.js +3 -0
  8. package/dist/development/src/dispatch/WebhookTargetHandler.js.map +1 -1
  9. package/dist/development/src/graphql/resolvers/query/EventsQueryResolver.cjs +4 -1
  10. package/dist/development/src/graphql/resolvers/query/EventsQueryResolver.cjs.map +1 -1
  11. package/dist/development/src/graphql/resolvers/query/EventsQueryResolver.js +4 -1
  12. package/dist/development/src/graphql/resolvers/query/EventsQueryResolver.js.map +1 -1
  13. package/dist/development/src/graphql/schema/actions.graphql.cjs +9 -6
  14. package/dist/development/src/graphql/schema/actions.graphql.cjs.map +1 -1
  15. package/dist/development/src/graphql/schema/actions.graphql.js +9 -6
  16. package/dist/development/src/graphql/schema/actions.graphql.js.map +1 -1
  17. package/dist/development/src/migrations/2025-05-28-160000-action-event-user.cjs +16 -0
  18. package/dist/development/src/migrations/2025-05-28-160000-action-event-user.cjs.map +1 -0
  19. package/dist/development/src/migrations/2025-05-28-160000-action-event-user.js +17 -0
  20. package/dist/development/src/migrations/2025-05-28-160000-action-event-user.js.map +1 -0
  21. package/dist/development/src/migrations/index.cjs +3 -1
  22. package/dist/development/src/migrations/index.cjs.map +1 -1
  23. package/dist/development/src/migrations/index.js +3 -1
  24. package/dist/development/src/migrations/index.js.map +1 -1
  25. package/dist/development/src/migrations/snapshot.cjs +5 -2
  26. package/dist/development/src/migrations/snapshot.cjs.map +1 -1
  27. package/dist/development/src/migrations/snapshot.js +5 -2
  28. package/dist/development/src/migrations/snapshot.js.map +1 -1
  29. package/dist/development/src/triggers/TriggerHandler.cjs +12 -11
  30. package/dist/development/src/triggers/TriggerHandler.cjs.map +1 -1
  31. package/dist/development/src/triggers/TriggerHandler.js +12 -11
  32. package/dist/development/src/triggers/TriggerHandler.js.map +1 -1
  33. package/dist/development/src/triggers/TriggerIndirectChangesFetcher.cjs +44 -2
  34. package/dist/development/src/triggers/TriggerIndirectChangesFetcher.cjs.map +1 -1
  35. package/dist/development/src/triggers/TriggerIndirectChangesFetcher.js +44 -2
  36. package/dist/development/src/triggers/TriggerIndirectChangesFetcher.js.map +1 -1
  37. package/dist/development/src/triggers/TriggerListenersStore.cjs.map +1 -1
  38. package/dist/development/src/triggers/TriggerListenersStore.js.map +1 -1
  39. package/dist/development/src/triggers/TriggerPayloadBuilder.cjs +20 -5
  40. package/dist/development/src/triggers/TriggerPayloadBuilder.cjs.map +1 -1
  41. package/dist/development/src/triggers/TriggerPayloadBuilder.js +20 -5
  42. package/dist/development/src/triggers/TriggerPayloadBuilder.js.map +1 -1
  43. package/dist/development/src/triggers/TriggerPayloadManager.cjs.map +1 -1
  44. package/dist/development/src/triggers/TriggerPayloadManager.js.map +1 -1
  45. package/dist/development/src/triggers/TriggerPayloadPersister.cjs +7 -2
  46. package/dist/development/src/triggers/TriggerPayloadPersister.cjs.map +1 -1
  47. package/dist/development/src/triggers/TriggerPayloadPersister.js +7 -2
  48. package/dist/development/src/triggers/TriggerPayloadPersister.js.map +1 -1
  49. package/dist/production/src/ActionsExecutionContainerHookFactory.cjs +3 -3
  50. package/dist/production/src/ActionsExecutionContainerHookFactory.cjs.map +1 -1
  51. package/dist/production/src/ActionsExecutionContainerHookFactory.js +3 -3
  52. package/dist/production/src/ActionsExecutionContainerHookFactory.js.map +1 -1
  53. package/dist/production/src/dispatch/WebhookTargetHandler.cjs +3 -0
  54. package/dist/production/src/dispatch/WebhookTargetHandler.cjs.map +1 -1
  55. package/dist/production/src/dispatch/WebhookTargetHandler.js +3 -0
  56. package/dist/production/src/dispatch/WebhookTargetHandler.js.map +1 -1
  57. package/dist/production/src/graphql/resolvers/query/EventsQueryResolver.cjs +4 -1
  58. package/dist/production/src/graphql/resolvers/query/EventsQueryResolver.cjs.map +1 -1
  59. package/dist/production/src/graphql/resolvers/query/EventsQueryResolver.js +4 -1
  60. package/dist/production/src/graphql/resolvers/query/EventsQueryResolver.js.map +1 -1
  61. package/dist/production/src/graphql/schema/actions.graphql.cjs +9 -6
  62. package/dist/production/src/graphql/schema/actions.graphql.cjs.map +1 -1
  63. package/dist/production/src/graphql/schema/actions.graphql.js +9 -6
  64. package/dist/production/src/graphql/schema/actions.graphql.js.map +1 -1
  65. package/dist/production/src/migrations/2025-05-28-160000-action-event-user.cjs +16 -0
  66. package/dist/production/src/migrations/2025-05-28-160000-action-event-user.cjs.map +1 -0
  67. package/dist/production/src/migrations/2025-05-28-160000-action-event-user.js +17 -0
  68. package/dist/production/src/migrations/2025-05-28-160000-action-event-user.js.map +1 -0
  69. package/dist/production/src/migrations/index.cjs +3 -1
  70. package/dist/production/src/migrations/index.cjs.map +1 -1
  71. package/dist/production/src/migrations/index.js +3 -1
  72. package/dist/production/src/migrations/index.js.map +1 -1
  73. package/dist/production/src/migrations/snapshot.cjs +5 -2
  74. package/dist/production/src/migrations/snapshot.cjs.map +1 -1
  75. package/dist/production/src/migrations/snapshot.js +5 -2
  76. package/dist/production/src/migrations/snapshot.js.map +1 -1
  77. package/dist/production/src/triggers/TriggerHandler.cjs +12 -11
  78. package/dist/production/src/triggers/TriggerHandler.cjs.map +1 -1
  79. package/dist/production/src/triggers/TriggerHandler.js +12 -11
  80. package/dist/production/src/triggers/TriggerHandler.js.map +1 -1
  81. package/dist/production/src/triggers/TriggerIndirectChangesFetcher.cjs +44 -2
  82. package/dist/production/src/triggers/TriggerIndirectChangesFetcher.cjs.map +1 -1
  83. package/dist/production/src/triggers/TriggerIndirectChangesFetcher.js +44 -2
  84. package/dist/production/src/triggers/TriggerIndirectChangesFetcher.js.map +1 -1
  85. package/dist/production/src/triggers/TriggerListenersStore.cjs.map +1 -1
  86. package/dist/production/src/triggers/TriggerListenersStore.js.map +1 -1
  87. package/dist/production/src/triggers/TriggerPayloadBuilder.cjs +20 -5
  88. package/dist/production/src/triggers/TriggerPayloadBuilder.cjs.map +1 -1
  89. package/dist/production/src/triggers/TriggerPayloadBuilder.js +20 -5
  90. package/dist/production/src/triggers/TriggerPayloadBuilder.js.map +1 -1
  91. package/dist/production/src/triggers/TriggerPayloadManager.cjs.map +1 -1
  92. package/dist/production/src/triggers/TriggerPayloadManager.js.map +1 -1
  93. package/dist/production/src/triggers/TriggerPayloadPersister.cjs +7 -2
  94. package/dist/production/src/triggers/TriggerPayloadPersister.cjs.map +1 -1
  95. package/dist/production/src/triggers/TriggerPayloadPersister.js +7 -2
  96. package/dist/production/src/triggers/TriggerPayloadPersister.js.map +1 -1
  97. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  98. package/dist/types/dispatch/WebhookTargetHandler.d.ts.map +1 -1
  99. package/dist/types/graphql/resolvers/query/EventsQueryResolver.d.ts.map +1 -1
  100. package/dist/types/graphql/schema/actions.graphql.d.ts.map +1 -1
  101. package/dist/types/graphql/schema/index.d.ts +6 -0
  102. package/dist/types/graphql/schema/index.d.ts.map +1 -1
  103. package/dist/types/migrations/2025-05-28-160000-action-event-user.d.ts +3 -0
  104. package/dist/types/migrations/2025-05-28-160000-action-event-user.d.ts.map +1 -0
  105. package/dist/types/migrations/index.d.ts.map +1 -1
  106. package/dist/types/migrations/snapshot.d.ts.map +1 -1
  107. package/dist/types/model/types.d.ts +3 -0
  108. package/dist/types/model/types.d.ts.map +1 -1
  109. package/dist/types/triggers/TriggerHandler.d.ts.map +1 -1
  110. package/dist/types/triggers/TriggerIndirectChangesFetcher.d.ts +11 -3
  111. package/dist/types/triggers/TriggerIndirectChangesFetcher.d.ts.map +1 -1
  112. package/dist/types/triggers/TriggerListenersStore.d.ts +2 -2
  113. package/dist/types/triggers/TriggerListenersStore.d.ts.map +1 -1
  114. package/dist/types/triggers/TriggerPayloadBuilder.d.ts.map +1 -1
  115. package/dist/types/triggers/TriggerPayloadManager.d.ts +2 -1
  116. package/dist/types/triggers/TriggerPayloadManager.d.ts.map +1 -1
  117. package/dist/types/triggers/TriggerPayloadPersister.d.ts +7 -2
  118. package/dist/types/triggers/TriggerPayloadPersister.d.ts.map +1 -1
  119. package/dist/types/tsconfig.tsbuildinfo +1 -1
  120. package/package.json +15 -15
  121. package/src/ActionsExecutionContainerHookFactory.ts +3 -3
  122. package/src/dispatch/WebhookTargetHandler.ts +3 -0
  123. package/src/graphql/resolvers/query/EventsQueryResolver.ts +3 -0
  124. package/src/graphql/schema/actions.graphql.ts +9 -6
  125. package/src/graphql/schema/index.ts +6 -0
  126. package/src/migrations/2025-05-28-160000-action-event-user.ts +16 -0
  127. package/src/migrations/index.ts +2 -0
  128. package/src/migrations/snapshot.ts +5 -2
  129. package/src/model/types.ts +3 -0
  130. package/src/triggers/TriggerHandler.ts +12 -11
  131. package/src/triggers/TriggerIndirectChangesFetcher.ts +62 -3
  132. package/src/triggers/TriggerListenersStore.ts +2 -2
  133. package/src/triggers/TriggerPayloadBuilder.ts +18 -1
  134. package/src/triggers/TriggerPayloadManager.ts +2 -1
  135. package/src/triggers/TriggerPayloadPersister.ts +6 -1
  136. package/tests/cases/unit/generator.test.ts +1 -1
  137. package/tests/cases/unit/webhookHandler.test.ts +9 -0
@@ -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":";;;;;AAIa,MAAA,kBAAkB,IAAIA,mBAAA,eAAe,UAAU;AAAA,EAC3D,uCAAuCC;AACxC,CAAC;;"}
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":";;;AAIa,MAAA,kBAAkB,IAAI,eAAe,UAAU;AAAA,EAC3D,uCAAuC;AACxC,CAAC;"}
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\t\t\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,EA0CX;AACF;;"}
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\t\t\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,EA0CX;AACF;"}
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;"}
@@ -49,27 +49,27 @@ class TriggerHandler {
49
49
  }
50
50
  async directUpdateHandler(event) {
51
51
  const updateListeners = this.listenersStore.getUpdateListeners(event.entity.name);
52
- updateListeners.map((listener) => {
52
+ await Promise.all(updateListeners.map((listener) => {
53
53
  if (event.data.some((it) => listener.fields.has(it.fieldName) && it.value !== it.old)) {
54
- this.payloadManager.add({
54
+ return this.payloadManager.add({
55
55
  listener,
56
56
  entity: event.entity,
57
57
  primary: event.id,
58
58
  cause: event
59
59
  });
60
60
  }
61
- });
61
+ }));
62
62
  }
63
63
  async directCreateHandler(event) {
64
64
  const createListeners = this.listenersStore.getCreateListener(event.entity.name);
65
- createListeners.map((listener) => {
66
- this.payloadManager.add({
65
+ await Promise.all(createListeners.map((listener) => {
66
+ return this.payloadManager.add({
67
67
  listener,
68
68
  entity: event.entity,
69
69
  primary: event.id,
70
70
  cause: event
71
71
  });
72
- });
72
+ }));
73
73
  }
74
74
  /**
75
75
  * Collect affected triggers after entity was created or before it was deleted.
@@ -112,14 +112,15 @@ class TriggerHandler {
112
112
  }
113
113
  async collectDeepChanges(cause, listener, where) {
114
114
  const result = await this.changesFetcher.fetch(listener, where);
115
- for (const row of result) {
116
- this.payloadManager.add({
115
+ await Promise.all(result.map((row) => {
116
+ return this.payloadManager.add({
117
117
  listener,
118
118
  entity: listener.rootEntity,
119
- primary: row,
120
- cause
119
+ primary: row.id,
120
+ cause,
121
+ nodes: row.nodes
121
122
  });
122
- }
123
+ }));
123
124
  }
124
125
  }
125
126
  exports.TriggerHandler = TriggerHandler;
@@ -1 +1 @@
1
- {"version":3,"file":"TriggerHandler.cjs","sources":["../../../../../packages/engine-actions/src/triggers/TriggerHandler.ts"],"sourcesContent":["import {\n\tAfterInsertEvent,\n\tAfterJunctionUpdateEvent,\n\tAfterUpdateEvent,\n\tBeforeDeleteEvent,\n\tBeforeUpdateEvent,\n\tEventManager,\n} from '@contember/engine-content-api'\nimport { Input } from '@contember/schema'\nimport { IndirectListener, JunctionListener, TriggerListenersStore } from './TriggerListenersStore'\nimport { TriggerPayloadManager } from './TriggerPayloadManager'\nimport { TriggerIndirectChangesFetcher } from './TriggerIndirectChangesFetcher'\n\nexport type EventCause =\n\t| BeforeUpdateEvent\n\t| AfterUpdateEvent\n\t| BeforeDeleteEvent\n\t| AfterInsertEvent\n\t| AfterJunctionUpdateEvent\n\nexport class TriggerHandler {\n\tconstructor(\n\t\tprivate readonly payloadManager: TriggerPayloadManager,\n\t\tprivate readonly listenersStore: TriggerListenersStore,\n\t\tprivate readonly changesFetcher: TriggerIndirectChangesFetcher,\n\t) {\n\t}\n\n\tattach(evm: EventManager) {\n\t\tevm.listen('BeforeDeleteEvent', async event => {\n\t\t\tawait this.directDeleteHandler(event)\n\t\t\tawait this.indirectChangesEntityHandler(event)\n\t\t})\n\t\tevm.listen('AfterInsertEvent', async event => {\n\t\t\tawait this.indirectChangesEntityHandler(event)\n\t\t\tawait this.directCreateHandler(event)\n\t\t})\n\t\tevm.listen('BeforeUpdateEvent', async event => {\n\t\t\tawait this.indirectChangesRelationHandler(event)\n\t\t})\n\t\tevm.listen('AfterUpdateEvent', async event => {\n\t\t\tif (event.hasChanges) {\n\t\t\t\tawait this.indirectChangesUpdatesHandler(event)\n\t\t\t\tawait this.directUpdateHandler(event)\n\t\t\t}\n\t\t})\n\t\tevm.listen('AfterJunctionUpdateEvent', async event => {\n\t\t\tif (event.hasChanges) {\n\t\t\t\tawait this.junctionHandler(event)\n\t\t\t}\n\t\t})\n\t\tevm.listen('BeforeCommitEvent', async event => {\n\t\t\tawait this.payloadManager.persist()\n\t\t})\n\t}\n\n\tprivate async directDeleteHandler(event: BeforeDeleteEvent) {\n\t\tconst deleteListeners = this.listenersStore.getDeleteListener(event.entity.name)\n\t\tif (!deleteListeners) {\n\t\t\treturn\n\t\t}\n\t\tawait Promise.all(deleteListeners.map(listener => {\n\t\t\treturn this.payloadManager.add({\n\t\t\t\tlistener,\n\t\t\t\tentity: event.entity,\n\t\t\t\tprimary: event.id,\n\t\t\t\tcause: event,\n\t\t\t})\n\t\t}))\n\t}\n\n\tprivate async directUpdateHandler(event: AfterUpdateEvent) {\n\t\tconst updateListeners = this.listenersStore.getUpdateListeners(event.entity.name)\n\t\tupdateListeners.map(listener => {\n\t\t\tif (event.data.some(it => listener.fields.has(it.fieldName) && it.value !== it.old)) {\n\t\t\t\tthis.payloadManager.add({\n\t\t\t\t\tlistener,\n\t\t\t\t\tentity: event.entity,\n\t\t\t\t\tprimary: event.id,\n\t\t\t\t\tcause: event,\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t}\n\n\tprivate async directCreateHandler(event: AfterInsertEvent) {\n\t\tconst createListeners = this.listenersStore.getCreateListener(event.entity.name)\n\t\tcreateListeners.map(listener => {\n\t\t\tthis.payloadManager.add({\n\t\t\t\tlistener,\n\t\t\t\tentity: event.entity,\n\t\t\t\tprimary: event.id,\n\t\t\t\tcause: event,\n\t\t\t})\n\t\t})\n\t}\n\n\n\t/**\n\t * Collect affected triggers after entity was created or before it was deleted.\n\t * todo: after insert, it should probably check only owning relations, because other relations are connected later, so it would be always empty\n\t */\n\tprivate async indirectChangesEntityHandler(event: BeforeDeleteEvent | AfterInsertEvent) {\n\t\t//\n\t\tconst indirectEntityListeners = this.listenersStore.getIndirectListeners(event.entity.name)\n\t\tconst promises = indirectEntityListeners.map(listener => this.collectDeepChanges(event, listener, {\n\t\t\t[event.entity.primary]: { eq: event.id },\n\t\t}))\n\t\tawait Promise.all(promises)\n\t}\n\n\tprivate async indirectChangesRelationHandler(event: BeforeUpdateEvent) {\n\t\tawait this.indirectChangesUpdatesHandlerInner(event, 'relations')\n\t}\n\n\tprivate async indirectChangesUpdatesHandler(event: AfterUpdateEvent) {\n\t\tawait this.indirectChangesUpdatesHandlerInner(event, 'fields')\n\t}\n\tprivate async indirectChangesUpdatesHandlerInner(event: AfterUpdateEvent | BeforeUpdateEvent, type: 'fields' | 'relations') {\n\t\tconst indirectEntityListeners = this.listenersStore.getIndirectListeners(event.entity.name)\n\t\tconst promises = indirectEntityListeners.map(listener => {\n\t\t\tif (event.data.some(val => listener[type].has(val.fieldName) && (!('old' in val) || val.value !== val.old))) {\n\t\t\t\treturn this.collectDeepChanges(event, listener, {\n\t\t\t\t\t[event.entity.primary]: { eq: event.id },\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t\tawait Promise.all(promises)\n\t}\n\n\tprivate async junctionHandler(event: AfterJunctionUpdateEvent) {\n\t\tconst listeners = this.listenersStore.getJunctionListeners(event.owningEntity.name, event.owningRelation.name)\n\t\tconst promises = listeners.map(listener => {\n\t\t\tconst primary = listener.context.type === 'owning'\n\t\t\t\t? event.owningId\n\t\t\t\t: event.inverseId\n\t\t\tconst entity = listener.context.entity\n\t\t\treturn this.collectDeepChanges(event, listener, {\n\t\t\t\t[entity.primary]: { eq: primary },\n\t\t\t})\n\t\t})\n\t\tawait Promise.all(promises)\n\t}\n\n\n\tprivate async collectDeepChanges(\n\t\tcause: EventCause,\n\t\tlistener: IndirectListener | JunctionListener,\n\t\twhere: Input.Where,\n\t) {\n\t\tconst result = await this.changesFetcher.fetch(listener, where)\n\t\tfor (const row of result) {\n\t\t\tthis.payloadManager.add({\n\t\t\t\tlistener,\n\t\t\t\tentity: listener.rootEntity,\n\t\t\t\tprimary: row,\n\t\t\t\tcause,\n\t\t\t})\n\t\t}\n\t}\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TriggerHandler.cjs","sources":["../../../../../packages/engine-actions/src/triggers/TriggerHandler.ts"],"sourcesContent":["import {\n\tAfterInsertEvent,\n\tAfterJunctionUpdateEvent,\n\tAfterUpdateEvent,\n\tBeforeDeleteEvent,\n\tBeforeUpdateEvent,\n\tEventManager,\n} from '@contember/engine-content-api'\nimport { Input } from '@contember/schema'\nimport { IndirectListener, JunctionListener, TriggerListenersStore } from './TriggerListenersStore'\nimport { TriggerPayloadManager } from './TriggerPayloadManager'\nimport { TriggerIndirectChangesFetcher } from './TriggerIndirectChangesFetcher'\n\nexport type EventCause =\n\t| BeforeUpdateEvent\n\t| AfterUpdateEvent\n\t| BeforeDeleteEvent\n\t| AfterInsertEvent\n\t| AfterJunctionUpdateEvent\n\nexport class TriggerHandler {\n\tconstructor(\n\t\tprivate readonly payloadManager: TriggerPayloadManager,\n\t\tprivate readonly listenersStore: TriggerListenersStore,\n\t\tprivate readonly changesFetcher: TriggerIndirectChangesFetcher,\n\t) {\n\t}\n\n\tattach(evm: EventManager) {\n\t\tevm.listen('BeforeDeleteEvent', async event => {\n\t\t\tawait this.directDeleteHandler(event)\n\t\t\tawait this.indirectChangesEntityHandler(event)\n\t\t})\n\t\tevm.listen('AfterInsertEvent', async event => {\n\t\t\tawait this.indirectChangesEntityHandler(event)\n\t\t\tawait this.directCreateHandler(event)\n\t\t})\n\t\tevm.listen('BeforeUpdateEvent', async event => {\n\t\t\tawait this.indirectChangesRelationHandler(event)\n\t\t})\n\t\tevm.listen('AfterUpdateEvent', async event => {\n\t\t\tif (event.hasChanges) {\n\t\t\t\tawait this.indirectChangesUpdatesHandler(event)\n\t\t\t\tawait this.directUpdateHandler(event)\n\t\t\t}\n\t\t})\n\t\tevm.listen('AfterJunctionUpdateEvent', async event => {\n\t\t\tif (event.hasChanges) {\n\t\t\t\tawait this.junctionHandler(event)\n\t\t\t}\n\t\t})\n\t\tevm.listen('BeforeCommitEvent', async event => {\n\t\t\tawait this.payloadManager.persist()\n\t\t})\n\t}\n\n\tprivate async directDeleteHandler(event: BeforeDeleteEvent) {\n\t\tconst deleteListeners = this.listenersStore.getDeleteListener(event.entity.name)\n\t\tif (!deleteListeners) {\n\t\t\treturn\n\t\t}\n\t\tawait Promise.all(deleteListeners.map(listener => {\n\t\t\treturn this.payloadManager.add({\n\t\t\t\tlistener,\n\t\t\t\tentity: event.entity,\n\t\t\t\tprimary: event.id,\n\t\t\t\tcause: event,\n\t\t\t})\n\t\t}))\n\t}\n\n\tprivate async directUpdateHandler(event: AfterUpdateEvent) {\n\t\tconst updateListeners = this.listenersStore.getUpdateListeners(event.entity.name)\n\t\tawait Promise.all(updateListeners.map(listener => {\n\t\t\tif (event.data.some(it => listener.fields.has(it.fieldName) && it.value !== it.old)) {\n\t\t\t\treturn this.payloadManager.add({\n\t\t\t\t\tlistener,\n\t\t\t\t\tentity: event.entity,\n\t\t\t\t\tprimary: event.id,\n\t\t\t\t\tcause: event,\n\t\t\t\t})\n\t\t\t}\n\t\t}))\n\t}\n\n\tprivate async directCreateHandler(event: AfterInsertEvent) {\n\t\tconst createListeners = this.listenersStore.getCreateListener(event.entity.name)\n\t\tawait Promise.all(createListeners.map(listener => {\n\t\t\treturn this.payloadManager.add({\n\t\t\t\tlistener,\n\t\t\t\tentity: event.entity,\n\t\t\t\tprimary: event.id,\n\t\t\t\tcause: event,\n\t\t\t})\n\t\t}))\n\t}\n\n\n\t/**\n\t * Collect affected triggers after entity was created or before it was deleted.\n\t * todo: after insert, it should probably check only owning relations, because other relations are connected later, so it would be always empty\n\t */\n\tprivate async indirectChangesEntityHandler(event: BeforeDeleteEvent | AfterInsertEvent) {\n\t\t//\n\t\tconst indirectEntityListeners = this.listenersStore.getIndirectListeners(event.entity.name)\n\t\tconst promises = indirectEntityListeners.map(listener => this.collectDeepChanges(event, listener, {\n\t\t\t[event.entity.primary]: { eq: event.id },\n\t\t}))\n\t\tawait Promise.all(promises)\n\t}\n\n\tprivate async indirectChangesRelationHandler(event: BeforeUpdateEvent) {\n\t\tawait this.indirectChangesUpdatesHandlerInner(event, 'relations')\n\t}\n\n\tprivate async indirectChangesUpdatesHandler(event: AfterUpdateEvent) {\n\t\tawait this.indirectChangesUpdatesHandlerInner(event, 'fields')\n\t}\n\tprivate async indirectChangesUpdatesHandlerInner(event: AfterUpdateEvent | BeforeUpdateEvent, type: 'fields' | 'relations') {\n\t\tconst indirectEntityListeners = this.listenersStore.getIndirectListeners(event.entity.name)\n\t\tconst promises = indirectEntityListeners.map(listener => {\n\t\t\tif (event.data.some(val => listener[type].has(val.fieldName) && (!('old' in val) || val.value !== val.old))) {\n\t\t\t\treturn this.collectDeepChanges(event, listener, {\n\t\t\t\t\t[event.entity.primary]: { eq: event.id },\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t\tawait Promise.all(promises)\n\t}\n\n\tprivate async junctionHandler(event: AfterJunctionUpdateEvent) {\n\t\tconst listeners = this.listenersStore.getJunctionListeners(event.owningEntity.name, event.owningRelation.name)\n\t\tconst promises = listeners.map(listener => {\n\t\t\tconst primary = listener.context.type === 'owning'\n\t\t\t\t? event.owningId\n\t\t\t\t: event.inverseId\n\t\t\tconst entity = listener.context.entity\n\t\t\treturn this.collectDeepChanges(event, listener, {\n\t\t\t\t[entity.primary]: { eq: primary },\n\t\t\t})\n\t\t})\n\t\tawait Promise.all(promises)\n\t}\n\n\n\tprivate async collectDeepChanges(\n\t\tcause: EventCause,\n\t\tlistener: IndirectListener | JunctionListener,\n\t\twhere: Input.Where,\n\t) {\n\t\tconst result = await this.changesFetcher.fetch(listener, where)\n\t\tawait Promise.all(result.map(row => {\n\t\t\treturn this.payloadManager.add({\n\t\t\t\tlistener,\n\t\t\t\tentity: listener.rootEntity,\n\t\t\t\tprimary: row.id,\n\t\t\t\tcause,\n\t\t\t\tnodes: row.nodes,\n\t\t\t})\n\t\t}))\n\t}\n}\n"],"names":[],"mappings":"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"}
@@ -47,27 +47,27 @@ class TriggerHandler {
47
47
  }
48
48
  async directUpdateHandler(event) {
49
49
  const updateListeners = this.listenersStore.getUpdateListeners(event.entity.name);
50
- updateListeners.map((listener) => {
50
+ await Promise.all(updateListeners.map((listener) => {
51
51
  if (event.data.some((it) => listener.fields.has(it.fieldName) && it.value !== it.old)) {
52
- this.payloadManager.add({
52
+ return this.payloadManager.add({
53
53
  listener,
54
54
  entity: event.entity,
55
55
  primary: event.id,
56
56
  cause: event
57
57
  });
58
58
  }
59
- });
59
+ }));
60
60
  }
61
61
  async directCreateHandler(event) {
62
62
  const createListeners = this.listenersStore.getCreateListener(event.entity.name);
63
- createListeners.map((listener) => {
64
- this.payloadManager.add({
63
+ await Promise.all(createListeners.map((listener) => {
64
+ return this.payloadManager.add({
65
65
  listener,
66
66
  entity: event.entity,
67
67
  primary: event.id,
68
68
  cause: event
69
69
  });
70
- });
70
+ }));
71
71
  }
72
72
  /**
73
73
  * Collect affected triggers after entity was created or before it was deleted.
@@ -110,14 +110,15 @@ class TriggerHandler {
110
110
  }
111
111
  async collectDeepChanges(cause, listener, where) {
112
112
  const result = await this.changesFetcher.fetch(listener, where);
113
- for (const row of result) {
114
- this.payloadManager.add({
113
+ await Promise.all(result.map((row) => {
114
+ return this.payloadManager.add({
115
115
  listener,
116
116
  entity: listener.rootEntity,
117
- primary: row,
118
- cause
117
+ primary: row.id,
118
+ cause,
119
+ nodes: row.nodes
119
120
  });
120
- }
121
+ }));
121
122
  }
122
123
  }
123
124
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"TriggerHandler.js","sources":["../../../../../packages/engine-actions/src/triggers/TriggerHandler.ts"],"sourcesContent":["import {\n\tAfterInsertEvent,\n\tAfterJunctionUpdateEvent,\n\tAfterUpdateEvent,\n\tBeforeDeleteEvent,\n\tBeforeUpdateEvent,\n\tEventManager,\n} from '@contember/engine-content-api'\nimport { Input } from '@contember/schema'\nimport { IndirectListener, JunctionListener, TriggerListenersStore } from './TriggerListenersStore'\nimport { TriggerPayloadManager } from './TriggerPayloadManager'\nimport { TriggerIndirectChangesFetcher } from './TriggerIndirectChangesFetcher'\n\nexport type EventCause =\n\t| BeforeUpdateEvent\n\t| AfterUpdateEvent\n\t| BeforeDeleteEvent\n\t| AfterInsertEvent\n\t| AfterJunctionUpdateEvent\n\nexport class TriggerHandler {\n\tconstructor(\n\t\tprivate readonly payloadManager: TriggerPayloadManager,\n\t\tprivate readonly listenersStore: TriggerListenersStore,\n\t\tprivate readonly changesFetcher: TriggerIndirectChangesFetcher,\n\t) {\n\t}\n\n\tattach(evm: EventManager) {\n\t\tevm.listen('BeforeDeleteEvent', async event => {\n\t\t\tawait this.directDeleteHandler(event)\n\t\t\tawait this.indirectChangesEntityHandler(event)\n\t\t})\n\t\tevm.listen('AfterInsertEvent', async event => {\n\t\t\tawait this.indirectChangesEntityHandler(event)\n\t\t\tawait this.directCreateHandler(event)\n\t\t})\n\t\tevm.listen('BeforeUpdateEvent', async event => {\n\t\t\tawait this.indirectChangesRelationHandler(event)\n\t\t})\n\t\tevm.listen('AfterUpdateEvent', async event => {\n\t\t\tif (event.hasChanges) {\n\t\t\t\tawait this.indirectChangesUpdatesHandler(event)\n\t\t\t\tawait this.directUpdateHandler(event)\n\t\t\t}\n\t\t})\n\t\tevm.listen('AfterJunctionUpdateEvent', async event => {\n\t\t\tif (event.hasChanges) {\n\t\t\t\tawait this.junctionHandler(event)\n\t\t\t}\n\t\t})\n\t\tevm.listen('BeforeCommitEvent', async event => {\n\t\t\tawait this.payloadManager.persist()\n\t\t})\n\t}\n\n\tprivate async directDeleteHandler(event: BeforeDeleteEvent) {\n\t\tconst deleteListeners = this.listenersStore.getDeleteListener(event.entity.name)\n\t\tif (!deleteListeners) {\n\t\t\treturn\n\t\t}\n\t\tawait Promise.all(deleteListeners.map(listener => {\n\t\t\treturn this.payloadManager.add({\n\t\t\t\tlistener,\n\t\t\t\tentity: event.entity,\n\t\t\t\tprimary: event.id,\n\t\t\t\tcause: event,\n\t\t\t})\n\t\t}))\n\t}\n\n\tprivate async directUpdateHandler(event: AfterUpdateEvent) {\n\t\tconst updateListeners = this.listenersStore.getUpdateListeners(event.entity.name)\n\t\tupdateListeners.map(listener => {\n\t\t\tif (event.data.some(it => listener.fields.has(it.fieldName) && it.value !== it.old)) {\n\t\t\t\tthis.payloadManager.add({\n\t\t\t\t\tlistener,\n\t\t\t\t\tentity: event.entity,\n\t\t\t\t\tprimary: event.id,\n\t\t\t\t\tcause: event,\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t}\n\n\tprivate async directCreateHandler(event: AfterInsertEvent) {\n\t\tconst createListeners = this.listenersStore.getCreateListener(event.entity.name)\n\t\tcreateListeners.map(listener => {\n\t\t\tthis.payloadManager.add({\n\t\t\t\tlistener,\n\t\t\t\tentity: event.entity,\n\t\t\t\tprimary: event.id,\n\t\t\t\tcause: event,\n\t\t\t})\n\t\t})\n\t}\n\n\n\t/**\n\t * Collect affected triggers after entity was created or before it was deleted.\n\t * todo: after insert, it should probably check only owning relations, because other relations are connected later, so it would be always empty\n\t */\n\tprivate async indirectChangesEntityHandler(event: BeforeDeleteEvent | AfterInsertEvent) {\n\t\t//\n\t\tconst indirectEntityListeners = this.listenersStore.getIndirectListeners(event.entity.name)\n\t\tconst promises = indirectEntityListeners.map(listener => this.collectDeepChanges(event, listener, {\n\t\t\t[event.entity.primary]: { eq: event.id },\n\t\t}))\n\t\tawait Promise.all(promises)\n\t}\n\n\tprivate async indirectChangesRelationHandler(event: BeforeUpdateEvent) {\n\t\tawait this.indirectChangesUpdatesHandlerInner(event, 'relations')\n\t}\n\n\tprivate async indirectChangesUpdatesHandler(event: AfterUpdateEvent) {\n\t\tawait this.indirectChangesUpdatesHandlerInner(event, 'fields')\n\t}\n\tprivate async indirectChangesUpdatesHandlerInner(event: AfterUpdateEvent | BeforeUpdateEvent, type: 'fields' | 'relations') {\n\t\tconst indirectEntityListeners = this.listenersStore.getIndirectListeners(event.entity.name)\n\t\tconst promises = indirectEntityListeners.map(listener => {\n\t\t\tif (event.data.some(val => listener[type].has(val.fieldName) && (!('old' in val) || val.value !== val.old))) {\n\t\t\t\treturn this.collectDeepChanges(event, listener, {\n\t\t\t\t\t[event.entity.primary]: { eq: event.id },\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t\tawait Promise.all(promises)\n\t}\n\n\tprivate async junctionHandler(event: AfterJunctionUpdateEvent) {\n\t\tconst listeners = this.listenersStore.getJunctionListeners(event.owningEntity.name, event.owningRelation.name)\n\t\tconst promises = listeners.map(listener => {\n\t\t\tconst primary = listener.context.type === 'owning'\n\t\t\t\t? event.owningId\n\t\t\t\t: event.inverseId\n\t\t\tconst entity = listener.context.entity\n\t\t\treturn this.collectDeepChanges(event, listener, {\n\t\t\t\t[entity.primary]: { eq: primary },\n\t\t\t})\n\t\t})\n\t\tawait Promise.all(promises)\n\t}\n\n\n\tprivate async collectDeepChanges(\n\t\tcause: EventCause,\n\t\tlistener: IndirectListener | JunctionListener,\n\t\twhere: Input.Where,\n\t) {\n\t\tconst result = await this.changesFetcher.fetch(listener, where)\n\t\tfor (const row of result) {\n\t\t\tthis.payloadManager.add({\n\t\t\t\tlistener,\n\t\t\t\tentity: listener.rootEntity,\n\t\t\t\tprimary: row,\n\t\t\t\tcause,\n\t\t\t})\n\t\t}\n\t}\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TriggerHandler.js","sources":["../../../../../packages/engine-actions/src/triggers/TriggerHandler.ts"],"sourcesContent":["import {\n\tAfterInsertEvent,\n\tAfterJunctionUpdateEvent,\n\tAfterUpdateEvent,\n\tBeforeDeleteEvent,\n\tBeforeUpdateEvent,\n\tEventManager,\n} from '@contember/engine-content-api'\nimport { Input } from '@contember/schema'\nimport { IndirectListener, JunctionListener, TriggerListenersStore } from './TriggerListenersStore'\nimport { TriggerPayloadManager } from './TriggerPayloadManager'\nimport { TriggerIndirectChangesFetcher } from './TriggerIndirectChangesFetcher'\n\nexport type EventCause =\n\t| BeforeUpdateEvent\n\t| AfterUpdateEvent\n\t| BeforeDeleteEvent\n\t| AfterInsertEvent\n\t| AfterJunctionUpdateEvent\n\nexport class TriggerHandler {\n\tconstructor(\n\t\tprivate readonly payloadManager: TriggerPayloadManager,\n\t\tprivate readonly listenersStore: TriggerListenersStore,\n\t\tprivate readonly changesFetcher: TriggerIndirectChangesFetcher,\n\t) {\n\t}\n\n\tattach(evm: EventManager) {\n\t\tevm.listen('BeforeDeleteEvent', async event => {\n\t\t\tawait this.directDeleteHandler(event)\n\t\t\tawait this.indirectChangesEntityHandler(event)\n\t\t})\n\t\tevm.listen('AfterInsertEvent', async event => {\n\t\t\tawait this.indirectChangesEntityHandler(event)\n\t\t\tawait this.directCreateHandler(event)\n\t\t})\n\t\tevm.listen('BeforeUpdateEvent', async event => {\n\t\t\tawait this.indirectChangesRelationHandler(event)\n\t\t})\n\t\tevm.listen('AfterUpdateEvent', async event => {\n\t\t\tif (event.hasChanges) {\n\t\t\t\tawait this.indirectChangesUpdatesHandler(event)\n\t\t\t\tawait this.directUpdateHandler(event)\n\t\t\t}\n\t\t})\n\t\tevm.listen('AfterJunctionUpdateEvent', async event => {\n\t\t\tif (event.hasChanges) {\n\t\t\t\tawait this.junctionHandler(event)\n\t\t\t}\n\t\t})\n\t\tevm.listen('BeforeCommitEvent', async event => {\n\t\t\tawait this.payloadManager.persist()\n\t\t})\n\t}\n\n\tprivate async directDeleteHandler(event: BeforeDeleteEvent) {\n\t\tconst deleteListeners = this.listenersStore.getDeleteListener(event.entity.name)\n\t\tif (!deleteListeners) {\n\t\t\treturn\n\t\t}\n\t\tawait Promise.all(deleteListeners.map(listener => {\n\t\t\treturn this.payloadManager.add({\n\t\t\t\tlistener,\n\t\t\t\tentity: event.entity,\n\t\t\t\tprimary: event.id,\n\t\t\t\tcause: event,\n\t\t\t})\n\t\t}))\n\t}\n\n\tprivate async directUpdateHandler(event: AfterUpdateEvent) {\n\t\tconst updateListeners = this.listenersStore.getUpdateListeners(event.entity.name)\n\t\tawait Promise.all(updateListeners.map(listener => {\n\t\t\tif (event.data.some(it => listener.fields.has(it.fieldName) && it.value !== it.old)) {\n\t\t\t\treturn this.payloadManager.add({\n\t\t\t\t\tlistener,\n\t\t\t\t\tentity: event.entity,\n\t\t\t\t\tprimary: event.id,\n\t\t\t\t\tcause: event,\n\t\t\t\t})\n\t\t\t}\n\t\t}))\n\t}\n\n\tprivate async directCreateHandler(event: AfterInsertEvent) {\n\t\tconst createListeners = this.listenersStore.getCreateListener(event.entity.name)\n\t\tawait Promise.all(createListeners.map(listener => {\n\t\t\treturn this.payloadManager.add({\n\t\t\t\tlistener,\n\t\t\t\tentity: event.entity,\n\t\t\t\tprimary: event.id,\n\t\t\t\tcause: event,\n\t\t\t})\n\t\t}))\n\t}\n\n\n\t/**\n\t * Collect affected triggers after entity was created or before it was deleted.\n\t * todo: after insert, it should probably check only owning relations, because other relations are connected later, so it would be always empty\n\t */\n\tprivate async indirectChangesEntityHandler(event: BeforeDeleteEvent | AfterInsertEvent) {\n\t\t//\n\t\tconst indirectEntityListeners = this.listenersStore.getIndirectListeners(event.entity.name)\n\t\tconst promises = indirectEntityListeners.map(listener => this.collectDeepChanges(event, listener, {\n\t\t\t[event.entity.primary]: { eq: event.id },\n\t\t}))\n\t\tawait Promise.all(promises)\n\t}\n\n\tprivate async indirectChangesRelationHandler(event: BeforeUpdateEvent) {\n\t\tawait this.indirectChangesUpdatesHandlerInner(event, 'relations')\n\t}\n\n\tprivate async indirectChangesUpdatesHandler(event: AfterUpdateEvent) {\n\t\tawait this.indirectChangesUpdatesHandlerInner(event, 'fields')\n\t}\n\tprivate async indirectChangesUpdatesHandlerInner(event: AfterUpdateEvent | BeforeUpdateEvent, type: 'fields' | 'relations') {\n\t\tconst indirectEntityListeners = this.listenersStore.getIndirectListeners(event.entity.name)\n\t\tconst promises = indirectEntityListeners.map(listener => {\n\t\t\tif (event.data.some(val => listener[type].has(val.fieldName) && (!('old' in val) || val.value !== val.old))) {\n\t\t\t\treturn this.collectDeepChanges(event, listener, {\n\t\t\t\t\t[event.entity.primary]: { eq: event.id },\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t\tawait Promise.all(promises)\n\t}\n\n\tprivate async junctionHandler(event: AfterJunctionUpdateEvent) {\n\t\tconst listeners = this.listenersStore.getJunctionListeners(event.owningEntity.name, event.owningRelation.name)\n\t\tconst promises = listeners.map(listener => {\n\t\t\tconst primary = listener.context.type === 'owning'\n\t\t\t\t? event.owningId\n\t\t\t\t: event.inverseId\n\t\t\tconst entity = listener.context.entity\n\t\t\treturn this.collectDeepChanges(event, listener, {\n\t\t\t\t[entity.primary]: { eq: primary },\n\t\t\t})\n\t\t})\n\t\tawait Promise.all(promises)\n\t}\n\n\n\tprivate async collectDeepChanges(\n\t\tcause: EventCause,\n\t\tlistener: IndirectListener | JunctionListener,\n\t\twhere: Input.Where,\n\t) {\n\t\tconst result = await this.changesFetcher.fetch(listener, where)\n\t\tawait Promise.all(result.map(row => {\n\t\t\treturn this.payloadManager.add({\n\t\t\t\tlistener,\n\t\t\t\tentity: listener.rootEntity,\n\t\t\t\tprimary: row.id,\n\t\t\t\tcause,\n\t\t\t\tnodes: row.nodes,\n\t\t\t})\n\t\t}))\n\t}\n}\n"],"names":[],"mappings":"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"}
@@ -1,20 +1,62 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const Database = require("@contember/database");
4
+ const schemaUtils = require("@contember/schema-utils");
4
5
  class TriggerIndirectChangesFetcher {
5
- constructor(mapper, whereBuilder, pathFactory) {
6
+ constructor(model, mapper, whereBuilder, joinBuilder, pathFactory) {
7
+ this.model = model;
6
8
  this.mapper = mapper;
7
9
  this.whereBuilder = whereBuilder;
10
+ this.joinBuilder = joinBuilder;
8
11
  this.pathFactory = pathFactory;
9
12
  }
10
13
  async fetch(listener, where) {
14
+ if (listener.trigger.withNodes) {
15
+ return this.fetchWithNodes(listener, where);
16
+ }
11
17
  for (let i = listener.path.length - 1; i >= 0; i--) {
12
18
  where = { [listener.path[i]]: where };
13
19
  }
14
20
  const qb = Database.SelectBuilder.create().from(listener.rootEntity.tableName, "root_").select(["root_", listener.rootEntity.primaryColumn], "id");
15
21
  const path = this.pathFactory.create([]);
16
22
  const qbWithWhere = this.whereBuilder.build(qb, listener.rootEntity, path, where);
17
- return (await qbWithWhere.getResult(this.mapper.db)).map((it) => it.id);
23
+ return await qbWithWhere.getResult(this.mapper.db);
24
+ }
25
+ async fetchWithNodes(listener, where) {
26
+ const basePath = this.pathFactory.create([]);
27
+ let path = basePath;
28
+ let entity = listener.rootEntity;
29
+ let qb = Database.SelectBuilder.create().from(entity.tableName, path.alias).select([path.alias, entity.primaryColumn], path.for(entity.primary).alias);
30
+ for (let i = 0; i < listener.path.length; i++) {
31
+ const relationName = listener.path[i];
32
+ path = path.for(relationName);
33
+ const targetEntity = schemaUtils.getTargetEntity(this.model, entity, relationName);
34
+ if (!targetEntity) {
35
+ throw new Error(`Target entity for relation ${entity.name}::${relationName} not found`);
36
+ }
37
+ qb = this.joinBuilder.join(qb, path, entity, relationName);
38
+ entity = targetEntity;
39
+ qb = qb.select([path.alias, targetEntity.primaryColumn], path.for(targetEntity.primary).alias);
40
+ }
41
+ const qbWithWhere = this.whereBuilder.build(qb, entity, path, where);
42
+ const result = await qbWithWhere.getResult(this.mapper.db);
43
+ return result.map((row) => {
44
+ const nodes = [];
45
+ let entity2 = listener.rootEntity;
46
+ let path2 = basePath;
47
+ const id = row[path2.for(entity2.primary).alias];
48
+ for (let i = 0; i < listener.path.length; i++) {
49
+ const relationName = listener.path[i];
50
+ const targetEntity = schemaUtils.getTargetEntity(this.model, entity2, relationName);
51
+ if (!targetEntity) {
52
+ throw new Error(`Target entity for relation ${entity2.name}::${relationName} not found`);
53
+ }
54
+ path2 = path2.for(relationName);
55
+ nodes.push({ relation: relationName, entity: targetEntity.name, id: row[path2.for(targetEntity.primary).alias] });
56
+ entity2 = targetEntity;
57
+ }
58
+ return { id, nodes };
59
+ });
18
60
  }
19
61
  }
20
62
  exports.TriggerIndirectChangesFetcher = TriggerIndirectChangesFetcher;
@@ -1 +1 @@
1
- {"version":3,"file":"TriggerIndirectChangesFetcher.cjs","sources":["../../../../../packages/engine-actions/src/triggers/TriggerIndirectChangesFetcher.ts"],"sourcesContent":["import { Mapper, PathFactory, WhereBuilder } from '@contember/engine-content-api'\nimport { IndirectListener, JunctionListener } from './TriggerListenersStore'\nimport { SelectBuilder } from '@contember/database'\nimport { Input } from '@contember/schema'\n\nexport class TriggerIndirectChangesFetcher {\n\tconstructor(\n\t\tprivate readonly mapper: Mapper,\n\t\tprivate readonly whereBuilder: WhereBuilder,\n\t\tprivate readonly pathFactory: PathFactory,\n\t) {\n\t}\n\n\tpublic async fetch(\n\t\tlistener: IndirectListener | JunctionListener,\n\t\twhere: Input.Where,\n\t): Promise<Input.PrimaryValue[]> {\n\t\tfor (let i = listener.path.length - 1; i >= 0; i--) {\n\t\t\twhere = { [listener.path[i]]: where }\n\t\t}\n\t\tconst qb = SelectBuilder.create<{ id: Input.PrimaryValue }>()\n\t\t\t.from(listener.rootEntity.tableName, 'root_')\n\t\t\t.select(['root_', listener.rootEntity.primaryColumn], 'id')\n\t\tconst path = this.pathFactory.create([])\n\t\tconst qbWithWhere = this.whereBuilder.build(qb, listener.rootEntity, path, where)\n\n\t\treturn (await qbWithWhere.getResult(this.mapper.db)).map(it => it.id)\n\t}\n\n}\n"],"names":["SelectBuilder"],"mappings":";;;AAKO,MAAM,8BAA8B;AAAA,EAC1C,YACkB,QACA,cACA,aAChB;AAHgB,SAAA,SAAA;AACA,SAAA,eAAA;AACA,SAAA,cAAA;AAAA,EAAA;AAAA,EAIlB,MAAa,MACZ,UACA,OACgC;AAChC,aAAS,IAAI,SAAS,KAAK,SAAS,GAAG,KAAK,GAAG,KAAK;AACnD,cAAQ,EAAE,CAAC,SAAS,KAAK,CAAC,CAAC,GAAG,MAAM;AAAA,IAAA;AAErC,UAAM,KAAKA,SAAAA,cAAc,OAAA,EACvB,KAAK,SAAS,WAAW,WAAW,OAAO,EAC3C,OAAO,CAAC,SAAS,SAAS,WAAW,aAAa,GAAG,IAAI;AAC3D,UAAM,OAAO,KAAK,YAAY,OAAO,CAAA,CAAE;AACjC,UAAA,cAAc,KAAK,aAAa,MAAM,IAAI,SAAS,YAAY,MAAM,KAAK;AAExE,YAAA,MAAM,YAAY,UAAU,KAAK,OAAO,EAAE,GAAG,IAAI,CAAM,OAAA,GAAG,EAAE;AAAA,EAAA;AAGtE;;"}
1
+ {"version":3,"file":"TriggerIndirectChangesFetcher.cjs","sources":["../../../../../packages/engine-actions/src/triggers/TriggerIndirectChangesFetcher.ts"],"sourcesContent":["import { Mapper, PathFactory, WhereBuilder } from '@contember/engine-content-api'\nimport { IndirectListener, JunctionListener } from './TriggerListenersStore'\nimport { SelectBuilder } from '@contember/database'\nimport { ActionsPayload, Input, Model, Schema } from '@contember/schema'\nimport { JoinBuilder } from '@contember/engine-content-api'\nimport { getTargetEntity } from '@contember/schema-utils'\n\nexport type TriggerIndirectChangesFetcherResult = {\n\tid: Input.PrimaryValue\n\tnodes?: ActionsPayload.EntityEventPathNode[]\n}[]\n\nexport class TriggerIndirectChangesFetcher {\n\tconstructor(\n\t\tprivate readonly model: Model.Schema,\n\t\tprivate readonly mapper: Mapper,\n\t\tprivate readonly whereBuilder: WhereBuilder,\n\t\tprivate readonly joinBuilder: JoinBuilder,\n\t\tprivate readonly pathFactory: PathFactory,\n\t) {\n\t}\n\n\tpublic async fetch(\n\t\tlistener: IndirectListener | JunctionListener,\n\t\twhere: Input.Where,\n\t): Promise<TriggerIndirectChangesFetcherResult> {\n\t\tif (listener.trigger.withNodes) {\n\t\t\treturn this.fetchWithNodes(listener, where)\n\t\t}\n\n\t\tfor (let i = listener.path.length - 1; i >= 0; i--) {\n\t\t\twhere = { [listener.path[i]]: where }\n\t\t}\n\t\tconst qb = SelectBuilder.create<{ id: Input.PrimaryValue }>()\n\t\t\t.from(listener.rootEntity.tableName, 'root_')\n\t\t\t.select(['root_', listener.rootEntity.primaryColumn], 'id')\n\t\tconst path = this.pathFactory.create([])\n\t\tconst qbWithWhere = this.whereBuilder.build(qb, listener.rootEntity, path, where)\n\n\t\treturn (await qbWithWhere.getResult(this.mapper.db))\n\t}\n\n\tprivate async fetchWithNodes(\n\t\tlistener: IndirectListener | JunctionListener,\n\t\twhere: Input.Where,\n\t): Promise<TriggerIndirectChangesFetcherResult> {\n\t\tconst basePath = this.pathFactory.create([])\n\t\tlet path = basePath\n\t\tlet entity = listener.rootEntity\n\t\tlet qb = SelectBuilder.create()\n\t\t\t.from(entity.tableName, path.alias)\n\t\t\t.select([path.alias, entity.primaryColumn], path.for(entity.primary).alias)\n\n\t\tfor (let i = 0; i < listener.path.length; i++) {\n\t\t\tconst relationName = listener.path[i]\n\t\t\tpath = path.for(relationName)\n\t\t\tconst targetEntity = getTargetEntity(this.model, entity, relationName)\n\t\t\tif (!targetEntity) {\n\t\t\t\tthrow new Error(`Target entity for relation ${entity.name}::${relationName} not found`)\n\t\t\t}\n\t\t\tqb = this.joinBuilder.join(qb, path, entity, relationName)\n\n\t\t\tentity = targetEntity\n\t\t\tqb = qb.select([path.alias, targetEntity.primaryColumn], path.for(targetEntity.primary).alias)\n\t\t}\n\n\t\tconst qbWithWhere = this.whereBuilder.build(qb, entity, path, where)\n\n\t\tconst result = await qbWithWhere.getResult(this.mapper.db)\n\n\t\treturn result.map(row => {\n\t\t\tconst nodes: ActionsPayload.EntityEventPathNode[] = []\n\t\t\tlet entity = listener.rootEntity\n\t\t\tlet path = basePath\n\t\t\tconst id = row[path.for(entity.primary).alias]\n\t\t\tfor (let i = 0; i < listener.path.length; i++) {\n\t\t\t\tconst relationName = listener.path[i]\n\t\t\t\tconst targetEntity = getTargetEntity(this.model, entity, relationName)\n\t\t\t\tif (!targetEntity) {\n\t\t\t\t\tthrow new Error(`Target entity for relation ${entity.name}::${relationName} not found`)\n\t\t\t\t}\n\t\t\t\tpath = path.for(relationName)\n\t\t\t\tnodes.push({ relation: relationName, entity: targetEntity.name, id: row[path.for(targetEntity.primary).alias] })\n\t\t\t\tentity = targetEntity\n\t\t\t}\n\t\t\treturn { id, nodes }\n\t\t})\n\t}\n}\n"],"names":["SelectBuilder","getTargetEntity","entity","path"],"mappings":";;;;AAYO,MAAM,8BAA8B;AAAA,EAC1C,YACkB,OACA,QACA,cACA,aACA,aAChB;AALgB,SAAA,QAAA;AACA,SAAA,SAAA;AACA,SAAA,eAAA;AACA,SAAA,cAAA;AACA,SAAA,cAAA;AAAA,EAAA;AAAA,EAIlB,MAAa,MACZ,UACA,OAC+C;AAC3C,QAAA,SAAS,QAAQ,WAAW;AACxB,aAAA,KAAK,eAAe,UAAU,KAAK;AAAA,IAAA;AAG3C,aAAS,IAAI,SAAS,KAAK,SAAS,GAAG,KAAK,GAAG,KAAK;AACnD,cAAQ,EAAE,CAAC,SAAS,KAAK,CAAC,CAAC,GAAG,MAAM;AAAA,IAAA;AAErC,UAAM,KAAKA,SAAAA,cAAc,OAAA,EACvB,KAAK,SAAS,WAAW,WAAW,OAAO,EAC3C,OAAO,CAAC,SAAS,SAAS,WAAW,aAAa,GAAG,IAAI;AAC3D,UAAM,OAAO,KAAK,YAAY,OAAO,CAAA,CAAE;AACjC,UAAA,cAAc,KAAK,aAAa,MAAM,IAAI,SAAS,YAAY,MAAM,KAAK;AAEhF,WAAQ,MAAM,YAAY,UAAU,KAAK,OAAO,EAAE;AAAA,EAAA;AAAA,EAGnD,MAAc,eACb,UACA,OAC+C;AAC/C,UAAM,WAAW,KAAK,YAAY,OAAO,CAAA,CAAE;AAC3C,QAAI,OAAO;AACX,QAAI,SAAS,SAAS;AAClB,QAAA,KAAKA,uBAAc,SACrB,KAAK,OAAO,WAAW,KAAK,KAAK,EACjC,OAAO,CAAC,KAAK,OAAO,OAAO,aAAa,GAAG,KAAK,IAAI,OAAO,OAAO,EAAE,KAAK;AAE3E,aAAS,IAAI,GAAG,IAAI,SAAS,KAAK,QAAQ,KAAK;AACxC,YAAA,eAAe,SAAS,KAAK,CAAC;AAC7B,aAAA,KAAK,IAAI,YAAY;AAC5B,YAAM,eAAeC,YAAAA,gBAAgB,KAAK,OAAO,QAAQ,YAAY;AACrE,UAAI,CAAC,cAAc;AAClB,cAAM,IAAI,MAAM,8BAA8B,OAAO,IAAI,KAAK,YAAY,YAAY;AAAA,MAAA;AAEvF,WAAK,KAAK,YAAY,KAAK,IAAI,MAAM,QAAQ,YAAY;AAEhD,eAAA;AACT,WAAK,GAAG,OAAO,CAAC,KAAK,OAAO,aAAa,aAAa,GAAG,KAAK,IAAI,aAAa,OAAO,EAAE,KAAK;AAAA,IAAA;AAG9F,UAAM,cAAc,KAAK,aAAa,MAAM,IAAI,QAAQ,MAAM,KAAK;AAEnE,UAAM,SAAS,MAAM,YAAY,UAAU,KAAK,OAAO,EAAE;AAElD,WAAA,OAAO,IAAI,CAAO,QAAA;AACxB,YAAM,QAA8C,CAAC;AACrD,UAAIC,UAAS,SAAS;AACtB,UAAIC,QAAO;AACX,YAAM,KAAK,IAAIA,MAAK,IAAID,QAAO,OAAO,EAAE,KAAK;AAC7C,eAAS,IAAI,GAAG,IAAI,SAAS,KAAK,QAAQ,KAAK;AACxC,cAAA,eAAe,SAAS,KAAK,CAAC;AACpC,cAAM,eAAeD,YAAAA,gBAAgB,KAAK,OAAOC,SAAQ,YAAY;AACrE,YAAI,CAAC,cAAc;AAClB,gBAAM,IAAI,MAAM,8BAA8BA,QAAO,IAAI,KAAK,YAAY,YAAY;AAAA,QAAA;AAEvFC,gBAAOA,MAAK,IAAI,YAAY;AAC5B,cAAM,KAAK,EAAE,UAAU,cAAc,QAAQ,aAAa,MAAM,IAAI,IAAIA,MAAK,IAAI,aAAa,OAAO,EAAE,KAAK,GAAG;AAC/GD,kBAAS;AAAA,MAAA;AAEH,aAAA,EAAE,IAAI,MAAM;AAAA,IAAA,CACnB;AAAA,EAAA;AAEH;;"}
@@ -1,18 +1,60 @@
1
1
  import { SelectBuilder } from "@contember/database";
2
+ import { getTargetEntity } from "@contember/schema-utils";
2
3
  class TriggerIndirectChangesFetcher {
3
- constructor(mapper, whereBuilder, pathFactory) {
4
+ constructor(model, mapper, whereBuilder, joinBuilder, pathFactory) {
5
+ this.model = model;
4
6
  this.mapper = mapper;
5
7
  this.whereBuilder = whereBuilder;
8
+ this.joinBuilder = joinBuilder;
6
9
  this.pathFactory = pathFactory;
7
10
  }
8
11
  async fetch(listener, where) {
12
+ if (listener.trigger.withNodes) {
13
+ return this.fetchWithNodes(listener, where);
14
+ }
9
15
  for (let i = listener.path.length - 1; i >= 0; i--) {
10
16
  where = { [listener.path[i]]: where };
11
17
  }
12
18
  const qb = SelectBuilder.create().from(listener.rootEntity.tableName, "root_").select(["root_", listener.rootEntity.primaryColumn], "id");
13
19
  const path = this.pathFactory.create([]);
14
20
  const qbWithWhere = this.whereBuilder.build(qb, listener.rootEntity, path, where);
15
- return (await qbWithWhere.getResult(this.mapper.db)).map((it) => it.id);
21
+ return await qbWithWhere.getResult(this.mapper.db);
22
+ }
23
+ async fetchWithNodes(listener, where) {
24
+ const basePath = this.pathFactory.create([]);
25
+ let path = basePath;
26
+ let entity = listener.rootEntity;
27
+ let qb = SelectBuilder.create().from(entity.tableName, path.alias).select([path.alias, entity.primaryColumn], path.for(entity.primary).alias);
28
+ for (let i = 0; i < listener.path.length; i++) {
29
+ const relationName = listener.path[i];
30
+ path = path.for(relationName);
31
+ const targetEntity = getTargetEntity(this.model, entity, relationName);
32
+ if (!targetEntity) {
33
+ throw new Error(`Target entity for relation ${entity.name}::${relationName} not found`);
34
+ }
35
+ qb = this.joinBuilder.join(qb, path, entity, relationName);
36
+ entity = targetEntity;
37
+ qb = qb.select([path.alias, targetEntity.primaryColumn], path.for(targetEntity.primary).alias);
38
+ }
39
+ const qbWithWhere = this.whereBuilder.build(qb, entity, path, where);
40
+ const result = await qbWithWhere.getResult(this.mapper.db);
41
+ return result.map((row) => {
42
+ const nodes = [];
43
+ let entity2 = listener.rootEntity;
44
+ let path2 = basePath;
45
+ const id = row[path2.for(entity2.primary).alias];
46
+ for (let i = 0; i < listener.path.length; i++) {
47
+ const relationName = listener.path[i];
48
+ const targetEntity = getTargetEntity(this.model, entity2, relationName);
49
+ if (!targetEntity) {
50
+ throw new Error(`Target entity for relation ${entity2.name}::${relationName} not found`);
51
+ }
52
+ path2 = path2.for(relationName);
53
+ nodes.push({ relation: relationName, entity: targetEntity.name, id: row[path2.for(targetEntity.primary).alias] });
54
+ entity2 = targetEntity;
55
+ }
56
+ return { id, nodes };
57
+ });
16
58
  }
17
59
  }
18
60
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"TriggerIndirectChangesFetcher.js","sources":["../../../../../packages/engine-actions/src/triggers/TriggerIndirectChangesFetcher.ts"],"sourcesContent":["import { Mapper, PathFactory, WhereBuilder } from '@contember/engine-content-api'\nimport { IndirectListener, JunctionListener } from './TriggerListenersStore'\nimport { SelectBuilder } from '@contember/database'\nimport { Input } from '@contember/schema'\n\nexport class TriggerIndirectChangesFetcher {\n\tconstructor(\n\t\tprivate readonly mapper: Mapper,\n\t\tprivate readonly whereBuilder: WhereBuilder,\n\t\tprivate readonly pathFactory: PathFactory,\n\t) {\n\t}\n\n\tpublic async fetch(\n\t\tlistener: IndirectListener | JunctionListener,\n\t\twhere: Input.Where,\n\t): Promise<Input.PrimaryValue[]> {\n\t\tfor (let i = listener.path.length - 1; i >= 0; i--) {\n\t\t\twhere = { [listener.path[i]]: where }\n\t\t}\n\t\tconst qb = SelectBuilder.create<{ id: Input.PrimaryValue }>()\n\t\t\t.from(listener.rootEntity.tableName, 'root_')\n\t\t\t.select(['root_', listener.rootEntity.primaryColumn], 'id')\n\t\tconst path = this.pathFactory.create([])\n\t\tconst qbWithWhere = this.whereBuilder.build(qb, listener.rootEntity, path, where)\n\n\t\treturn (await qbWithWhere.getResult(this.mapper.db)).map(it => it.id)\n\t}\n\n}\n"],"names":[],"mappings":";AAKO,MAAM,8BAA8B;AAAA,EAC1C,YACkB,QACA,cACA,aAChB;AAHgB,SAAA,SAAA;AACA,SAAA,eAAA;AACA,SAAA,cAAA;AAAA,EAAA;AAAA,EAIlB,MAAa,MACZ,UACA,OACgC;AAChC,aAAS,IAAI,SAAS,KAAK,SAAS,GAAG,KAAK,GAAG,KAAK;AACnD,cAAQ,EAAE,CAAC,SAAS,KAAK,CAAC,CAAC,GAAG,MAAM;AAAA,IAAA;AAErC,UAAM,KAAK,cAAc,OAAA,EACvB,KAAK,SAAS,WAAW,WAAW,OAAO,EAC3C,OAAO,CAAC,SAAS,SAAS,WAAW,aAAa,GAAG,IAAI;AAC3D,UAAM,OAAO,KAAK,YAAY,OAAO,CAAA,CAAE;AACjC,UAAA,cAAc,KAAK,aAAa,MAAM,IAAI,SAAS,YAAY,MAAM,KAAK;AAExE,YAAA,MAAM,YAAY,UAAU,KAAK,OAAO,EAAE,GAAG,IAAI,CAAM,OAAA,GAAG,EAAE;AAAA,EAAA;AAGtE;"}
1
+ {"version":3,"file":"TriggerIndirectChangesFetcher.js","sources":["../../../../../packages/engine-actions/src/triggers/TriggerIndirectChangesFetcher.ts"],"sourcesContent":["import { Mapper, PathFactory, WhereBuilder } from '@contember/engine-content-api'\nimport { IndirectListener, JunctionListener } from './TriggerListenersStore'\nimport { SelectBuilder } from '@contember/database'\nimport { ActionsPayload, Input, Model, Schema } from '@contember/schema'\nimport { JoinBuilder } from '@contember/engine-content-api'\nimport { getTargetEntity } from '@contember/schema-utils'\n\nexport type TriggerIndirectChangesFetcherResult = {\n\tid: Input.PrimaryValue\n\tnodes?: ActionsPayload.EntityEventPathNode[]\n}[]\n\nexport class TriggerIndirectChangesFetcher {\n\tconstructor(\n\t\tprivate readonly model: Model.Schema,\n\t\tprivate readonly mapper: Mapper,\n\t\tprivate readonly whereBuilder: WhereBuilder,\n\t\tprivate readonly joinBuilder: JoinBuilder,\n\t\tprivate readonly pathFactory: PathFactory,\n\t) {\n\t}\n\n\tpublic async fetch(\n\t\tlistener: IndirectListener | JunctionListener,\n\t\twhere: Input.Where,\n\t): Promise<TriggerIndirectChangesFetcherResult> {\n\t\tif (listener.trigger.withNodes) {\n\t\t\treturn this.fetchWithNodes(listener, where)\n\t\t}\n\n\t\tfor (let i = listener.path.length - 1; i >= 0; i--) {\n\t\t\twhere = { [listener.path[i]]: where }\n\t\t}\n\t\tconst qb = SelectBuilder.create<{ id: Input.PrimaryValue }>()\n\t\t\t.from(listener.rootEntity.tableName, 'root_')\n\t\t\t.select(['root_', listener.rootEntity.primaryColumn], 'id')\n\t\tconst path = this.pathFactory.create([])\n\t\tconst qbWithWhere = this.whereBuilder.build(qb, listener.rootEntity, path, where)\n\n\t\treturn (await qbWithWhere.getResult(this.mapper.db))\n\t}\n\n\tprivate async fetchWithNodes(\n\t\tlistener: IndirectListener | JunctionListener,\n\t\twhere: Input.Where,\n\t): Promise<TriggerIndirectChangesFetcherResult> {\n\t\tconst basePath = this.pathFactory.create([])\n\t\tlet path = basePath\n\t\tlet entity = listener.rootEntity\n\t\tlet qb = SelectBuilder.create()\n\t\t\t.from(entity.tableName, path.alias)\n\t\t\t.select([path.alias, entity.primaryColumn], path.for(entity.primary).alias)\n\n\t\tfor (let i = 0; i < listener.path.length; i++) {\n\t\t\tconst relationName = listener.path[i]\n\t\t\tpath = path.for(relationName)\n\t\t\tconst targetEntity = getTargetEntity(this.model, entity, relationName)\n\t\t\tif (!targetEntity) {\n\t\t\t\tthrow new Error(`Target entity for relation ${entity.name}::${relationName} not found`)\n\t\t\t}\n\t\t\tqb = this.joinBuilder.join(qb, path, entity, relationName)\n\n\t\t\tentity = targetEntity\n\t\t\tqb = qb.select([path.alias, targetEntity.primaryColumn], path.for(targetEntity.primary).alias)\n\t\t}\n\n\t\tconst qbWithWhere = this.whereBuilder.build(qb, entity, path, where)\n\n\t\tconst result = await qbWithWhere.getResult(this.mapper.db)\n\n\t\treturn result.map(row => {\n\t\t\tconst nodes: ActionsPayload.EntityEventPathNode[] = []\n\t\t\tlet entity = listener.rootEntity\n\t\t\tlet path = basePath\n\t\t\tconst id = row[path.for(entity.primary).alias]\n\t\t\tfor (let i = 0; i < listener.path.length; i++) {\n\t\t\t\tconst relationName = listener.path[i]\n\t\t\t\tconst targetEntity = getTargetEntity(this.model, entity, relationName)\n\t\t\t\tif (!targetEntity) {\n\t\t\t\t\tthrow new Error(`Target entity for relation ${entity.name}::${relationName} not found`)\n\t\t\t\t}\n\t\t\t\tpath = path.for(relationName)\n\t\t\t\tnodes.push({ relation: relationName, entity: targetEntity.name, id: row[path.for(targetEntity.primary).alias] })\n\t\t\t\tentity = targetEntity\n\t\t\t}\n\t\t\treturn { id, nodes }\n\t\t})\n\t}\n}\n"],"names":["entity","path"],"mappings":";;AAYO,MAAM,8BAA8B;AAAA,EAC1C,YACkB,OACA,QACA,cACA,aACA,aAChB;AALgB,SAAA,QAAA;AACA,SAAA,SAAA;AACA,SAAA,eAAA;AACA,SAAA,cAAA;AACA,SAAA,cAAA;AAAA,EAAA;AAAA,EAIlB,MAAa,MACZ,UACA,OAC+C;AAC3C,QAAA,SAAS,QAAQ,WAAW;AACxB,aAAA,KAAK,eAAe,UAAU,KAAK;AAAA,IAAA;AAG3C,aAAS,IAAI,SAAS,KAAK,SAAS,GAAG,KAAK,GAAG,KAAK;AACnD,cAAQ,EAAE,CAAC,SAAS,KAAK,CAAC,CAAC,GAAG,MAAM;AAAA,IAAA;AAErC,UAAM,KAAK,cAAc,OAAA,EACvB,KAAK,SAAS,WAAW,WAAW,OAAO,EAC3C,OAAO,CAAC,SAAS,SAAS,WAAW,aAAa,GAAG,IAAI;AAC3D,UAAM,OAAO,KAAK,YAAY,OAAO,CAAA,CAAE;AACjC,UAAA,cAAc,KAAK,aAAa,MAAM,IAAI,SAAS,YAAY,MAAM,KAAK;AAEhF,WAAQ,MAAM,YAAY,UAAU,KAAK,OAAO,EAAE;AAAA,EAAA;AAAA,EAGnD,MAAc,eACb,UACA,OAC+C;AAC/C,UAAM,WAAW,KAAK,YAAY,OAAO,CAAA,CAAE;AAC3C,QAAI,OAAO;AACX,QAAI,SAAS,SAAS;AAClB,QAAA,KAAK,cAAc,SACrB,KAAK,OAAO,WAAW,KAAK,KAAK,EACjC,OAAO,CAAC,KAAK,OAAO,OAAO,aAAa,GAAG,KAAK,IAAI,OAAO,OAAO,EAAE,KAAK;AAE3E,aAAS,IAAI,GAAG,IAAI,SAAS,KAAK,QAAQ,KAAK;AACxC,YAAA,eAAe,SAAS,KAAK,CAAC;AAC7B,aAAA,KAAK,IAAI,YAAY;AAC5B,YAAM,eAAe,gBAAgB,KAAK,OAAO,QAAQ,YAAY;AACrE,UAAI,CAAC,cAAc;AAClB,cAAM,IAAI,MAAM,8BAA8B,OAAO,IAAI,KAAK,YAAY,YAAY;AAAA,MAAA;AAEvF,WAAK,KAAK,YAAY,KAAK,IAAI,MAAM,QAAQ,YAAY;AAEhD,eAAA;AACT,WAAK,GAAG,OAAO,CAAC,KAAK,OAAO,aAAa,aAAa,GAAG,KAAK,IAAI,aAAa,OAAO,EAAE,KAAK;AAAA,IAAA;AAG9F,UAAM,cAAc,KAAK,aAAa,MAAM,IAAI,QAAQ,MAAM,KAAK;AAEnE,UAAM,SAAS,MAAM,YAAY,UAAU,KAAK,OAAO,EAAE;AAElD,WAAA,OAAO,IAAI,CAAO,QAAA;AACxB,YAAM,QAA8C,CAAC;AACrD,UAAIA,UAAS,SAAS;AACtB,UAAIC,QAAO;AACX,YAAM,KAAK,IAAIA,MAAK,IAAID,QAAO,OAAO,EAAE,KAAK;AAC7C,eAAS,IAAI,GAAG,IAAI,SAAS,KAAK,QAAQ,KAAK;AACxC,cAAA,eAAe,SAAS,KAAK,CAAC;AACpC,cAAM,eAAe,gBAAgB,KAAK,OAAOA,SAAQ,YAAY;AACrE,YAAI,CAAC,cAAc;AAClB,gBAAM,IAAI,MAAM,8BAA8BA,QAAO,IAAI,KAAK,YAAY,YAAY;AAAA,QAAA;AAEvFC,gBAAOA,MAAK,IAAI,YAAY;AAC5B,cAAM,KAAK,EAAE,UAAU,cAAc,QAAQ,aAAa,MAAM,IAAI,IAAIA,MAAK,IAAI,aAAa,OAAO,EAAE,KAAK,GAAG;AAC/GD,kBAAS;AAAA,MAAA;AAEH,aAAA,EAAE,IAAI,MAAM;AAAA,IAAA,CACnB;AAAA,EAAA;AAEH;"}
@@ -1 +1 @@
1
- {"version":3,"file":"TriggerListenersStore.cjs","sources":["../../../../../packages/engine-actions/src/triggers/TriggerListenersStore.ts"],"sourcesContent":["import { Actions, Model } from '@contember/schema'\nimport { TriggerListeners } from './TriggerListeners'\n\nexport interface IndirectListener {\n\ttype: 'indirect'\n\ttrigger: Actions.AnyTrigger\n\trootEntity: Model.Entity\n\tfields: Set<string>\n\trelations: Set<string>\n\tpath: string[]\n}\n\nexport interface JunctionListener {\n\ttype: 'junction'\n\ttrigger: Actions.AnyTrigger\n\trootEntity: Model.Entity\n\tpath: string[]\n\tcontext: {\n\t\tentity: Model.Entity\n\t\trelation: Model.ManyHasManyOwningRelation | Model.ManyHasManyInverseRelation\n\t\ttype: 'owning' | 'inverse'\n\t}\n}\n\nexport interface DeleteListener {\n\ttype: 'delete'\n\ttrigger: Actions.AnyTrigger\n\tentity: Model.Entity\n}\n\nexport interface CreateListener {\n\ttype: 'create'\n\ttrigger: Actions.AnyTrigger\n\tentity: Model.Entity\n}\n\nexport interface UpdateListener {\n\ttype: 'update'\n\ttrigger: Actions.AnyTrigger\n\tentity: Model.Entity\n\tfields: Set<string>\n}\n\nexport type AnyListener =\n\t| JunctionListener\n\t| UpdateListener\n\t| CreateListener\n\t| DeleteListener\n\t| IndirectListener\n\nexport class TriggerListenersStore {\n\tconstructor(\n\t\tprivate readonly listeners: TriggerListeners,\n\t) {\n\t}\n\n\tpublic getUpdateListeners(entityName: string): UpdateListener[] {\n\t\treturn this.listeners.updateListeners.get(entityName) ?? []\n\t}\n\n\tpublic getDeleteListener(entityName: string): DeleteListener[] {\n\t\treturn this.listeners.deleteListeners.get(entityName) ?? []\n\t}\n\n\tpublic getCreateListener(entityName: string): CreateListener[] {\n\t\treturn this.listeners.createListeners.get(entityName) ?? []\n\t}\n\n\tpublic getIndirectListeners(entityName: string): IndirectListener[] {\n\t\treturn this.listeners.indirectListeners.get(entityName) ?? []\n\t}\n\n\tpublic getJunctionListeners(entityName: string, relationName: string): JunctionListener[] {\n\t\treturn this.listeners.junctionListeners.get(entityName)?.get(relationName) ?? []\n\t}\n}\n"],"names":[],"mappings":";;AAkDO,MAAM,sBAAsB;AAAA,EAClC,YACkB,WAChB;AADgB,SAAA,YAAA;AAAA,EAAA;AAAA,EAIX,mBAAmB,YAAsC;AAC/D,WAAO,KAAK,UAAU,gBAAgB,IAAI,UAAU,KAAK,CAAC;AAAA,EAAA;AAAA,EAGpD,kBAAkB,YAAsC;AAC9D,WAAO,KAAK,UAAU,gBAAgB,IAAI,UAAU,KAAK,CAAC;AAAA,EAAA;AAAA,EAGpD,kBAAkB,YAAsC;AAC9D,WAAO,KAAK,UAAU,gBAAgB,IAAI,UAAU,KAAK,CAAC;AAAA,EAAA;AAAA,EAGpD,qBAAqB,YAAwC;AACnE,WAAO,KAAK,UAAU,kBAAkB,IAAI,UAAU,KAAK,CAAC;AAAA,EAAA;AAAA,EAGtD,qBAAqB,YAAoB,cAA0C;AAClF,WAAA,KAAK,UAAU,kBAAkB,IAAI,UAAU,GAAG,IAAI,YAAY,KAAK,CAAC;AAAA,EAAA;AAEjF;;"}
1
+ {"version":3,"file":"TriggerListenersStore.cjs","sources":["../../../../../packages/engine-actions/src/triggers/TriggerListenersStore.ts"],"sourcesContent":["import { Actions, Model } from '@contember/schema'\nimport { TriggerListeners } from './TriggerListeners'\n\nexport interface IndirectListener {\n\ttype: 'indirect'\n\ttrigger: Actions.WatchTrigger\n\trootEntity: Model.Entity\n\tfields: Set<string>\n\trelations: Set<string>\n\tpath: string[]\n}\n\nexport interface JunctionListener {\n\ttype: 'junction'\n\ttrigger: Actions.WatchTrigger\n\trootEntity: Model.Entity\n\tpath: string[]\n\tcontext: {\n\t\tentity: Model.Entity\n\t\trelation: Model.ManyHasManyOwningRelation | Model.ManyHasManyInverseRelation\n\t\ttype: 'owning' | 'inverse'\n\t}\n}\n\nexport interface DeleteListener {\n\ttype: 'delete'\n\ttrigger: Actions.AnyTrigger\n\tentity: Model.Entity\n}\n\nexport interface CreateListener {\n\ttype: 'create'\n\ttrigger: Actions.AnyTrigger\n\tentity: Model.Entity\n}\n\nexport interface UpdateListener {\n\ttype: 'update'\n\ttrigger: Actions.AnyTrigger\n\tentity: Model.Entity\n\tfields: Set<string>\n}\n\nexport type AnyListener =\n\t| JunctionListener\n\t| UpdateListener\n\t| CreateListener\n\t| DeleteListener\n\t| IndirectListener\n\nexport class TriggerListenersStore {\n\tconstructor(\n\t\tprivate readonly listeners: TriggerListeners,\n\t) {\n\t}\n\n\tpublic getUpdateListeners(entityName: string): UpdateListener[] {\n\t\treturn this.listeners.updateListeners.get(entityName) ?? []\n\t}\n\n\tpublic getDeleteListener(entityName: string): DeleteListener[] {\n\t\treturn this.listeners.deleteListeners.get(entityName) ?? []\n\t}\n\n\tpublic getCreateListener(entityName: string): CreateListener[] {\n\t\treturn this.listeners.createListeners.get(entityName) ?? []\n\t}\n\n\tpublic getIndirectListeners(entityName: string): IndirectListener[] {\n\t\treturn this.listeners.indirectListeners.get(entityName) ?? []\n\t}\n\n\tpublic getJunctionListeners(entityName: string, relationName: string): JunctionListener[] {\n\t\treturn this.listeners.junctionListeners.get(entityName)?.get(relationName) ?? []\n\t}\n}\n"],"names":[],"mappings":";;AAkDO,MAAM,sBAAsB;AAAA,EAClC,YACkB,WAChB;AADgB,SAAA,YAAA;AAAA,EAAA;AAAA,EAIX,mBAAmB,YAAsC;AAC/D,WAAO,KAAK,UAAU,gBAAgB,IAAI,UAAU,KAAK,CAAC;AAAA,EAAA;AAAA,EAGpD,kBAAkB,YAAsC;AAC9D,WAAO,KAAK,UAAU,gBAAgB,IAAI,UAAU,KAAK,CAAC;AAAA,EAAA;AAAA,EAGpD,kBAAkB,YAAsC;AAC9D,WAAO,KAAK,UAAU,gBAAgB,IAAI,UAAU,KAAK,CAAC;AAAA,EAAA;AAAA,EAGpD,qBAAqB,YAAwC;AACnE,WAAO,KAAK,UAAU,kBAAkB,IAAI,UAAU,KAAK,CAAC;AAAA,EAAA;AAAA,EAGtD,qBAAqB,YAAoB,cAA0C;AAClF,WAAA,KAAK,UAAU,kBAAkB,IAAI,UAAU,GAAG,IAAI,YAAY,KAAK,CAAC;AAAA,EAAA;AAEjF;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"TriggerListenersStore.js","sources":["../../../../../packages/engine-actions/src/triggers/TriggerListenersStore.ts"],"sourcesContent":["import { Actions, Model } from '@contember/schema'\nimport { TriggerListeners } from './TriggerListeners'\n\nexport interface IndirectListener {\n\ttype: 'indirect'\n\ttrigger: Actions.AnyTrigger\n\trootEntity: Model.Entity\n\tfields: Set<string>\n\trelations: Set<string>\n\tpath: string[]\n}\n\nexport interface JunctionListener {\n\ttype: 'junction'\n\ttrigger: Actions.AnyTrigger\n\trootEntity: Model.Entity\n\tpath: string[]\n\tcontext: {\n\t\tentity: Model.Entity\n\t\trelation: Model.ManyHasManyOwningRelation | Model.ManyHasManyInverseRelation\n\t\ttype: 'owning' | 'inverse'\n\t}\n}\n\nexport interface DeleteListener {\n\ttype: 'delete'\n\ttrigger: Actions.AnyTrigger\n\tentity: Model.Entity\n}\n\nexport interface CreateListener {\n\ttype: 'create'\n\ttrigger: Actions.AnyTrigger\n\tentity: Model.Entity\n}\n\nexport interface UpdateListener {\n\ttype: 'update'\n\ttrigger: Actions.AnyTrigger\n\tentity: Model.Entity\n\tfields: Set<string>\n}\n\nexport type AnyListener =\n\t| JunctionListener\n\t| UpdateListener\n\t| CreateListener\n\t| DeleteListener\n\t| IndirectListener\n\nexport class TriggerListenersStore {\n\tconstructor(\n\t\tprivate readonly listeners: TriggerListeners,\n\t) {\n\t}\n\n\tpublic getUpdateListeners(entityName: string): UpdateListener[] {\n\t\treturn this.listeners.updateListeners.get(entityName) ?? []\n\t}\n\n\tpublic getDeleteListener(entityName: string): DeleteListener[] {\n\t\treturn this.listeners.deleteListeners.get(entityName) ?? []\n\t}\n\n\tpublic getCreateListener(entityName: string): CreateListener[] {\n\t\treturn this.listeners.createListeners.get(entityName) ?? []\n\t}\n\n\tpublic getIndirectListeners(entityName: string): IndirectListener[] {\n\t\treturn this.listeners.indirectListeners.get(entityName) ?? []\n\t}\n\n\tpublic getJunctionListeners(entityName: string, relationName: string): JunctionListener[] {\n\t\treturn this.listeners.junctionListeners.get(entityName)?.get(relationName) ?? []\n\t}\n}\n"],"names":[],"mappings":"AAkDO,MAAM,sBAAsB;AAAA,EAClC,YACkB,WAChB;AADgB,SAAA,YAAA;AAAA,EAAA;AAAA,EAIX,mBAAmB,YAAsC;AAC/D,WAAO,KAAK,UAAU,gBAAgB,IAAI,UAAU,KAAK,CAAC;AAAA,EAAA;AAAA,EAGpD,kBAAkB,YAAsC;AAC9D,WAAO,KAAK,UAAU,gBAAgB,IAAI,UAAU,KAAK,CAAC;AAAA,EAAA;AAAA,EAGpD,kBAAkB,YAAsC;AAC9D,WAAO,KAAK,UAAU,gBAAgB,IAAI,UAAU,KAAK,CAAC;AAAA,EAAA;AAAA,EAGpD,qBAAqB,YAAwC;AACnE,WAAO,KAAK,UAAU,kBAAkB,IAAI,UAAU,KAAK,CAAC;AAAA,EAAA;AAAA,EAGtD,qBAAqB,YAAoB,cAA0C;AAClF,WAAA,KAAK,UAAU,kBAAkB,IAAI,UAAU,GAAG,IAAI,YAAY,KAAK,CAAC;AAAA,EAAA;AAEjF;"}
1
+ {"version":3,"file":"TriggerListenersStore.js","sources":["../../../../../packages/engine-actions/src/triggers/TriggerListenersStore.ts"],"sourcesContent":["import { Actions, Model } from '@contember/schema'\nimport { TriggerListeners } from './TriggerListeners'\n\nexport interface IndirectListener {\n\ttype: 'indirect'\n\ttrigger: Actions.WatchTrigger\n\trootEntity: Model.Entity\n\tfields: Set<string>\n\trelations: Set<string>\n\tpath: string[]\n}\n\nexport interface JunctionListener {\n\ttype: 'junction'\n\ttrigger: Actions.WatchTrigger\n\trootEntity: Model.Entity\n\tpath: string[]\n\tcontext: {\n\t\tentity: Model.Entity\n\t\trelation: Model.ManyHasManyOwningRelation | Model.ManyHasManyInverseRelation\n\t\ttype: 'owning' | 'inverse'\n\t}\n}\n\nexport interface DeleteListener {\n\ttype: 'delete'\n\ttrigger: Actions.AnyTrigger\n\tentity: Model.Entity\n}\n\nexport interface CreateListener {\n\ttype: 'create'\n\ttrigger: Actions.AnyTrigger\n\tentity: Model.Entity\n}\n\nexport interface UpdateListener {\n\ttype: 'update'\n\ttrigger: Actions.AnyTrigger\n\tentity: Model.Entity\n\tfields: Set<string>\n}\n\nexport type AnyListener =\n\t| JunctionListener\n\t| UpdateListener\n\t| CreateListener\n\t| DeleteListener\n\t| IndirectListener\n\nexport class TriggerListenersStore {\n\tconstructor(\n\t\tprivate readonly listeners: TriggerListeners,\n\t) {\n\t}\n\n\tpublic getUpdateListeners(entityName: string): UpdateListener[] {\n\t\treturn this.listeners.updateListeners.get(entityName) ?? []\n\t}\n\n\tpublic getDeleteListener(entityName: string): DeleteListener[] {\n\t\treturn this.listeners.deleteListeners.get(entityName) ?? []\n\t}\n\n\tpublic getCreateListener(entityName: string): CreateListener[] {\n\t\treturn this.listeners.createListeners.get(entityName) ?? []\n\t}\n\n\tpublic getIndirectListeners(entityName: string): IndirectListener[] {\n\t\treturn this.listeners.indirectListeners.get(entityName) ?? []\n\t}\n\n\tpublic getJunctionListeners(entityName: string, relationName: string): JunctionListener[] {\n\t\treturn this.listeners.junctionListeners.get(entityName)?.get(relationName) ?? []\n\t}\n}\n"],"names":[],"mappings":"AAkDO,MAAM,sBAAsB;AAAA,EAClC,YACkB,WAChB;AADgB,SAAA,YAAA;AAAA,EAAA;AAAA,EAIX,mBAAmB,YAAsC;AAC/D,WAAO,KAAK,UAAU,gBAAgB,IAAI,UAAU,KAAK,CAAC;AAAA,EAAA;AAAA,EAGpD,kBAAkB,YAAsC;AAC9D,WAAO,KAAK,UAAU,gBAAgB,IAAI,UAAU,KAAK,CAAC;AAAA,EAAA;AAAA,EAGpD,kBAAkB,YAAsC;AAC9D,WAAO,KAAK,UAAU,gBAAgB,IAAI,UAAU,KAAK,CAAC;AAAA,EAAA;AAAA,EAGpD,qBAAqB,YAAwC;AACnE,WAAO,KAAK,UAAU,kBAAkB,IAAI,UAAU,KAAK,CAAC;AAAA,EAAA;AAAA,EAGtD,qBAAqB,YAAoB,cAA0C;AAClF,WAAA,KAAK,UAAU,kBAAkB,IAAI,UAAU,GAAG,IAAI,YAAY,KAAK,CAAC;AAAA,EAAA;AAEjF;"}