@contember/engine-actions 2.0.2 → 2.0.3

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.
@@ -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,14 @@ 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
119
  primary: row,
120
120
  cause
121
121
  });
122
- }
122
+ }));
123
123
  }
124
124
  }
125
125
  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,\n\t\t\t\tcause,\n\t\t\t})\n\t\t}))\n\t}\n}\n"],"names":[],"mappings":";;AAoBO,MAAM,eAAe;AAAA,EAC3B,YACkB,gBACA,gBACA,gBAChB;AAHgB,SAAA,iBAAA;AACA,SAAA,iBAAA;AACA,SAAA,iBAAA;AAAA,EAAA;AAAA,EAIlB,OAAO,KAAmB;AACrB,QAAA,OAAO,qBAAqB,OAAM,UAAS;AACxC,YAAA,KAAK,oBAAoB,KAAK;AAC9B,YAAA,KAAK,6BAA6B,KAAK;AAAA,IAAA,CAC7C;AACG,QAAA,OAAO,oBAAoB,OAAM,UAAS;AACvC,YAAA,KAAK,6BAA6B,KAAK;AACvC,YAAA,KAAK,oBAAoB,KAAK;AAAA,IAAA,CACpC;AACG,QAAA,OAAO,qBAAqB,OAAM,UAAS;AACxC,YAAA,KAAK,+BAA+B,KAAK;AAAA,IAAA,CAC/C;AACG,QAAA,OAAO,oBAAoB,OAAM,UAAS;AAC7C,UAAI,MAAM,YAAY;AACf,cAAA,KAAK,8BAA8B,KAAK;AACxC,cAAA,KAAK,oBAAoB,KAAK;AAAA,MAAA;AAAA,IACrC,CACA;AACG,QAAA,OAAO,4BAA4B,OAAM,UAAS;AACrD,UAAI,MAAM,YAAY;AACf,cAAA,KAAK,gBAAgB,KAAK;AAAA,MAAA;AAAA,IACjC,CACA;AACG,QAAA,OAAO,qBAAqB,OAAM,UAAS;AACxC,YAAA,KAAK,eAAe,QAAQ;AAAA,IAAA,CAClC;AAAA,EAAA;AAAA,EAGF,MAAc,oBAAoB,OAA0B;AAC3D,UAAM,kBAAkB,KAAK,eAAe,kBAAkB,MAAM,OAAO,IAAI;AAC/E,QAAI,CAAC,iBAAiB;AACrB;AAAA,IAAA;AAED,UAAM,QAAQ,IAAI,gBAAgB,IAAI,CAAY,aAAA;AAC1C,aAAA,KAAK,eAAe,IAAI;AAAA,QAC9B;AAAA,QACA,QAAQ,MAAM;AAAA,QACd,SAAS,MAAM;AAAA,QACf,OAAO;AAAA,MAAA,CACP;AAAA,IAAA,CACD,CAAC;AAAA,EAAA;AAAA,EAGH,MAAc,oBAAoB,OAAyB;AAC1D,UAAM,kBAAkB,KAAK,eAAe,mBAAmB,MAAM,OAAO,IAAI;AAChF,UAAM,QAAQ,IAAI,gBAAgB,IAAI,CAAY,aAAA;AACjD,UAAI,MAAM,KAAK,KAAK,CAAA,OAAM,SAAS,OAAO,IAAI,GAAG,SAAS,KAAK,GAAG,UAAU,GAAG,GAAG,GAAG;AAC7E,eAAA,KAAK,eAAe,IAAI;AAAA,UAC9B;AAAA,UACA,QAAQ,MAAM;AAAA,UACd,SAAS,MAAM;AAAA,UACf,OAAO;AAAA,QAAA,CACP;AAAA,MAAA;AAAA,IACF,CACA,CAAC;AAAA,EAAA;AAAA,EAGH,MAAc,oBAAoB,OAAyB;AAC1D,UAAM,kBAAkB,KAAK,eAAe,kBAAkB,MAAM,OAAO,IAAI;AAC/E,UAAM,QAAQ,IAAI,gBAAgB,IAAI,CAAY,aAAA;AAC1C,aAAA,KAAK,eAAe,IAAI;AAAA,QAC9B;AAAA,QACA,QAAQ,MAAM;AAAA,QACd,SAAS,MAAM;AAAA,QACf,OAAO;AAAA,MAAA,CACP;AAAA,IAAA,CACD,CAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQH,MAAc,6BAA6B,OAA6C;AAEvF,UAAM,0BAA0B,KAAK,eAAe,qBAAqB,MAAM,OAAO,IAAI;AAC1F,UAAM,WAAW,wBAAwB,IAAI,cAAY,KAAK,mBAAmB,OAAO,UAAU;AAAA,MACjG,CAAC,MAAM,OAAO,OAAO,GAAG,EAAE,IAAI,MAAM,GAAG;AAAA,IAAA,CACvC,CAAC;AACI,UAAA,QAAQ,IAAI,QAAQ;AAAA,EAAA;AAAA,EAG3B,MAAc,+BAA+B,OAA0B;AAChE,UAAA,KAAK,mCAAmC,OAAO,WAAW;AAAA,EAAA;AAAA,EAGjE,MAAc,8BAA8B,OAAyB;AAC9D,UAAA,KAAK,mCAAmC,OAAO,QAAQ;AAAA,EAAA;AAAA,EAE9D,MAAc,mCAAmC,OAA6C,MAA8B;AAC3H,UAAM,0BAA0B,KAAK,eAAe,qBAAqB,MAAM,OAAO,IAAI;AACpF,UAAA,WAAW,wBAAwB,IAAI,CAAY,aAAA;AACxD,UAAI,MAAM,KAAK,KAAK,SAAO,SAAS,IAAI,EAAE,IAAI,IAAI,SAAS,MAAM,EAAE,SAAS,QAAQ,IAAI,UAAU,IAAI,IAAI,GAAG;AACrG,eAAA,KAAK,mBAAmB,OAAO,UAAU;AAAA,UAC/C,CAAC,MAAM,OAAO,OAAO,GAAG,EAAE,IAAI,MAAM,GAAG;AAAA,QAAA,CACvC;AAAA,MAAA;AAAA,IACF,CACA;AACK,UAAA,QAAQ,IAAI,QAAQ;AAAA,EAAA;AAAA,EAG3B,MAAc,gBAAgB,OAAiC;AACxD,UAAA,YAAY,KAAK,eAAe,qBAAqB,MAAM,aAAa,MAAM,MAAM,eAAe,IAAI;AACvG,UAAA,WAAW,UAAU,IAAI,CAAY,aAAA;AAC1C,YAAM,UAAU,SAAS,QAAQ,SAAS,WACvC,MAAM,WACN,MAAM;AACH,YAAA,SAAS,SAAS,QAAQ;AACzB,aAAA,KAAK,mBAAmB,OAAO,UAAU;AAAA,QAC/C,CAAC,OAAO,OAAO,GAAG,EAAE,IAAI,QAAQ;AAAA,MAAA,CAChC;AAAA,IAAA,CACD;AACK,UAAA,QAAQ,IAAI,QAAQ;AAAA,EAAA;AAAA,EAI3B,MAAc,mBACb,OACA,UACA,OACC;AACD,UAAM,SAAS,MAAM,KAAK,eAAe,MAAM,UAAU,KAAK;AAC9D,UAAM,QAAQ,IAAI,OAAO,IAAI,CAAO,QAAA;AAC5B,aAAA,KAAK,eAAe,IAAI;AAAA,QAC9B;AAAA,QACA,QAAQ,SAAS;AAAA,QACjB,SAAS;AAAA,QACT;AAAA,MAAA,CACA;AAAA,IAAA,CACD,CAAC;AAAA,EAAA;AAEJ;;"}
@@ -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,14 @@ 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
117
  primary: row,
118
118
  cause
119
119
  });
120
- }
120
+ }));
121
121
  }
122
122
  }
123
123
  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,\n\t\t\t\tcause,\n\t\t\t})\n\t\t}))\n\t}\n}\n"],"names":[],"mappings":"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"}
@@ -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,14 @@ 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
119
  primary: row,
120
120
  cause
121
121
  });
122
- }
122
+ }));
123
123
  }
124
124
  }
125
125
  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":";;AAoBO,MAAM,eAAe;AAAA,EAC3B,YACkB,gBACA,gBACA,gBAChB;AAHgB,SAAA,iBAAA;AACA,SAAA,iBAAA;AACA,SAAA,iBAAA;AAAA,EAAA;AAAA,EAIlB,OAAO,KAAmB;AACrB,QAAA,OAAO,qBAAqB,OAAM,UAAS;AACxC,YAAA,KAAK,oBAAoB,KAAK;AAC9B,YAAA,KAAK,6BAA6B,KAAK;AAAA,IAAA,CAC7C;AACG,QAAA,OAAO,oBAAoB,OAAM,UAAS;AACvC,YAAA,KAAK,6BAA6B,KAAK;AACvC,YAAA,KAAK,oBAAoB,KAAK;AAAA,IAAA,CACpC;AACG,QAAA,OAAO,qBAAqB,OAAM,UAAS;AACxC,YAAA,KAAK,+BAA+B,KAAK;AAAA,IAAA,CAC/C;AACG,QAAA,OAAO,oBAAoB,OAAM,UAAS;AAC7C,UAAI,MAAM,YAAY;AACf,cAAA,KAAK,8BAA8B,KAAK;AACxC,cAAA,KAAK,oBAAoB,KAAK;AAAA,MAAA;AAAA,IACrC,CACA;AACG,QAAA,OAAO,4BAA4B,OAAM,UAAS;AACrD,UAAI,MAAM,YAAY;AACf,cAAA,KAAK,gBAAgB,KAAK;AAAA,MAAA;AAAA,IACjC,CACA;AACG,QAAA,OAAO,qBAAqB,OAAM,UAAS;AACxC,YAAA,KAAK,eAAe,QAAQ;AAAA,IAAA,CAClC;AAAA,EAAA;AAAA,EAGF,MAAc,oBAAoB,OAA0B;AAC3D,UAAM,kBAAkB,KAAK,eAAe,kBAAkB,MAAM,OAAO,IAAI;AAC/E,QAAI,CAAC,iBAAiB;AACrB;AAAA,IAAA;AAED,UAAM,QAAQ,IAAI,gBAAgB,IAAI,CAAY,aAAA;AAC1C,aAAA,KAAK,eAAe,IAAI;AAAA,QAC9B;AAAA,QACA,QAAQ,MAAM;AAAA,QACd,SAAS,MAAM;AAAA,QACf,OAAO;AAAA,MAAA,CACP;AAAA,IAAA,CACD,CAAC;AAAA,EAAA;AAAA,EAGH,MAAc,oBAAoB,OAAyB;AAC1D,UAAM,kBAAkB,KAAK,eAAe,mBAAmB,MAAM,OAAO,IAAI;AAChF,oBAAgB,IAAI,CAAY,aAAA;AAC/B,UAAI,MAAM,KAAK,KAAK,CAAA,OAAM,SAAS,OAAO,IAAI,GAAG,SAAS,KAAK,GAAG,UAAU,GAAG,GAAG,GAAG;AACpF,aAAK,eAAe,IAAI;AAAA,UACvB;AAAA,UACA,QAAQ,MAAM;AAAA,UACd,SAAS,MAAM;AAAA,UACf,OAAO;AAAA,QAAA,CACP;AAAA,MAAA;AAAA,IACF,CACA;AAAA,EAAA;AAAA,EAGF,MAAc,oBAAoB,OAAyB;AAC1D,UAAM,kBAAkB,KAAK,eAAe,kBAAkB,MAAM,OAAO,IAAI;AAC/E,oBAAgB,IAAI,CAAY,aAAA;AAC/B,WAAK,eAAe,IAAI;AAAA,QACvB;AAAA,QACA,QAAQ,MAAM;AAAA,QACd,SAAS,MAAM;AAAA,QACf,OAAO;AAAA,MAAA,CACP;AAAA,IAAA,CACD;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQF,MAAc,6BAA6B,OAA6C;AAEvF,UAAM,0BAA0B,KAAK,eAAe,qBAAqB,MAAM,OAAO,IAAI;AAC1F,UAAM,WAAY,wBAAwB,IAAI,cAAY,KAAK,mBAAmB,OAAO,UAAU;AAAA,MAClG,CAAC,MAAM,OAAO,OAAO,GAAG,EAAE,IAAI,MAAM,GAAG;AAAA,IAAA,CACvC,CAAC;AACI,UAAA,QAAQ,IAAI,QAAQ;AAAA,EAAA;AAAA,EAG3B,MAAc,+BAA+B,OAA0B;AAChE,UAAA,KAAK,mCAAmC,OAAO,WAAW;AAAA,EAAA;AAAA,EAGjE,MAAc,8BAA8B,OAAyB;AAC9D,UAAA,KAAK,mCAAmC,OAAO,QAAQ;AAAA,EAAA;AAAA,EAE9D,MAAc,mCAAmC,OAA6C,MAA8B;AAC3H,UAAM,0BAA0B,KAAK,eAAe,qBAAqB,MAAM,OAAO,IAAI;AACpF,UAAA,WAAW,wBAAwB,IAAI,CAAY,aAAA;AACxD,UAAI,MAAM,KAAK,KAAK,SAAO,SAAS,IAAI,EAAE,IAAI,IAAI,SAAS,MAAM,EAAE,SAAS,QAAQ,IAAI,UAAU,IAAI,IAAI,GAAG;AACrG,eAAA,KAAK,mBAAmB,OAAO,UAAU;AAAA,UAC/C,CAAC,MAAM,OAAO,OAAO,GAAG,EAAE,IAAI,MAAM,GAAG;AAAA,QAAA,CACvC;AAAA,MAAA;AAAA,IACF,CACA;AACK,UAAA,QAAQ,IAAI,QAAQ;AAAA,EAAA;AAAA,EAG3B,MAAc,gBAAgB,OAAiC;AACxD,UAAA,YAAY,KAAK,eAAe,qBAAqB,MAAM,aAAa,MAAM,MAAM,eAAe,IAAI;AACvG,UAAA,WAAW,UAAU,IAAI,CAAY,aAAA;AAC1C,YAAM,UAAU,SAAS,QAAQ,SAAS,WACvC,MAAM,WACN,MAAM;AACH,YAAA,SAAS,SAAS,QAAQ;AACzB,aAAA,KAAK,mBAAmB,OAAO,UAAU;AAAA,QAC/C,CAAC,OAAO,OAAO,GAAG,EAAE,IAAI,QAAQ;AAAA,MAAA,CAChC;AAAA,IAAA,CACD;AACK,UAAA,QAAQ,IAAI,QAAQ;AAAA,EAAA;AAAA,EAI3B,MAAc,mBACb,OACA,UACA,OACC;AACD,UAAM,SAAS,MAAM,KAAK,eAAe,MAAM,UAAU,KAAK;AAC9D,eAAW,OAAO,QAAQ;AACzB,WAAK,eAAe,IAAI;AAAA,QACvB;AAAA,QACA,QAAQ,SAAS;AAAA,QACjB,SAAS;AAAA,QACT;AAAA,MAAA,CACA;AAAA,IAAA;AAAA,EACF;AAEF;;"}
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,\n\t\t\t\tcause,\n\t\t\t})\n\t\t}))\n\t}\n}\n"],"names":[],"mappings":";;AAoBO,MAAM,eAAe;AAAA,EAC3B,YACkB,gBACA,gBACA,gBAChB;AAHgB,SAAA,iBAAA;AACA,SAAA,iBAAA;AACA,SAAA,iBAAA;AAAA,EAAA;AAAA,EAIlB,OAAO,KAAmB;AACrB,QAAA,OAAO,qBAAqB,OAAM,UAAS;AACxC,YAAA,KAAK,oBAAoB,KAAK;AAC9B,YAAA,KAAK,6BAA6B,KAAK;AAAA,IAAA,CAC7C;AACG,QAAA,OAAO,oBAAoB,OAAM,UAAS;AACvC,YAAA,KAAK,6BAA6B,KAAK;AACvC,YAAA,KAAK,oBAAoB,KAAK;AAAA,IAAA,CACpC;AACG,QAAA,OAAO,qBAAqB,OAAM,UAAS;AACxC,YAAA,KAAK,+BAA+B,KAAK;AAAA,IAAA,CAC/C;AACG,QAAA,OAAO,oBAAoB,OAAM,UAAS;AAC7C,UAAI,MAAM,YAAY;AACf,cAAA,KAAK,8BAA8B,KAAK;AACxC,cAAA,KAAK,oBAAoB,KAAK;AAAA,MAAA;AAAA,IACrC,CACA;AACG,QAAA,OAAO,4BAA4B,OAAM,UAAS;AACrD,UAAI,MAAM,YAAY;AACf,cAAA,KAAK,gBAAgB,KAAK;AAAA,MAAA;AAAA,IACjC,CACA;AACG,QAAA,OAAO,qBAAqB,OAAM,UAAS;AACxC,YAAA,KAAK,eAAe,QAAQ;AAAA,IAAA,CAClC;AAAA,EAAA;AAAA,EAGF,MAAc,oBAAoB,OAA0B;AAC3D,UAAM,kBAAkB,KAAK,eAAe,kBAAkB,MAAM,OAAO,IAAI;AAC/E,QAAI,CAAC,iBAAiB;AACrB;AAAA,IAAA;AAED,UAAM,QAAQ,IAAI,gBAAgB,IAAI,CAAY,aAAA;AAC1C,aAAA,KAAK,eAAe,IAAI;AAAA,QAC9B;AAAA,QACA,QAAQ,MAAM;AAAA,QACd,SAAS,MAAM;AAAA,QACf,OAAO;AAAA,MAAA,CACP;AAAA,IAAA,CACD,CAAC;AAAA,EAAA;AAAA,EAGH,MAAc,oBAAoB,OAAyB;AAC1D,UAAM,kBAAkB,KAAK,eAAe,mBAAmB,MAAM,OAAO,IAAI;AAChF,UAAM,QAAQ,IAAI,gBAAgB,IAAI,CAAY,aAAA;AACjD,UAAI,MAAM,KAAK,KAAK,CAAA,OAAM,SAAS,OAAO,IAAI,GAAG,SAAS,KAAK,GAAG,UAAU,GAAG,GAAG,GAAG;AAC7E,eAAA,KAAK,eAAe,IAAI;AAAA,UAC9B;AAAA,UACA,QAAQ,MAAM;AAAA,UACd,SAAS,MAAM;AAAA,UACf,OAAO;AAAA,QAAA,CACP;AAAA,MAAA;AAAA,IACF,CACA,CAAC;AAAA,EAAA;AAAA,EAGH,MAAc,oBAAoB,OAAyB;AAC1D,UAAM,kBAAkB,KAAK,eAAe,kBAAkB,MAAM,OAAO,IAAI;AAC/E,UAAM,QAAQ,IAAI,gBAAgB,IAAI,CAAY,aAAA;AAC1C,aAAA,KAAK,eAAe,IAAI;AAAA,QAC9B;AAAA,QACA,QAAQ,MAAM;AAAA,QACd,SAAS,MAAM;AAAA,QACf,OAAO;AAAA,MAAA,CACP;AAAA,IAAA,CACD,CAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQH,MAAc,6BAA6B,OAA6C;AAEvF,UAAM,0BAA0B,KAAK,eAAe,qBAAqB,MAAM,OAAO,IAAI;AAC1F,UAAM,WAAW,wBAAwB,IAAI,cAAY,KAAK,mBAAmB,OAAO,UAAU;AAAA,MACjG,CAAC,MAAM,OAAO,OAAO,GAAG,EAAE,IAAI,MAAM,GAAG;AAAA,IAAA,CACvC,CAAC;AACI,UAAA,QAAQ,IAAI,QAAQ;AAAA,EAAA;AAAA,EAG3B,MAAc,+BAA+B,OAA0B;AAChE,UAAA,KAAK,mCAAmC,OAAO,WAAW;AAAA,EAAA;AAAA,EAGjE,MAAc,8BAA8B,OAAyB;AAC9D,UAAA,KAAK,mCAAmC,OAAO,QAAQ;AAAA,EAAA;AAAA,EAE9D,MAAc,mCAAmC,OAA6C,MAA8B;AAC3H,UAAM,0BAA0B,KAAK,eAAe,qBAAqB,MAAM,OAAO,IAAI;AACpF,UAAA,WAAW,wBAAwB,IAAI,CAAY,aAAA;AACxD,UAAI,MAAM,KAAK,KAAK,SAAO,SAAS,IAAI,EAAE,IAAI,IAAI,SAAS,MAAM,EAAE,SAAS,QAAQ,IAAI,UAAU,IAAI,IAAI,GAAG;AACrG,eAAA,KAAK,mBAAmB,OAAO,UAAU;AAAA,UAC/C,CAAC,MAAM,OAAO,OAAO,GAAG,EAAE,IAAI,MAAM,GAAG;AAAA,QAAA,CACvC;AAAA,MAAA;AAAA,IACF,CACA;AACK,UAAA,QAAQ,IAAI,QAAQ;AAAA,EAAA;AAAA,EAG3B,MAAc,gBAAgB,OAAiC;AACxD,UAAA,YAAY,KAAK,eAAe,qBAAqB,MAAM,aAAa,MAAM,MAAM,eAAe,IAAI;AACvG,UAAA,WAAW,UAAU,IAAI,CAAY,aAAA;AAC1C,YAAM,UAAU,SAAS,QAAQ,SAAS,WACvC,MAAM,WACN,MAAM;AACH,YAAA,SAAS,SAAS,QAAQ;AACzB,aAAA,KAAK,mBAAmB,OAAO,UAAU;AAAA,QAC/C,CAAC,OAAO,OAAO,GAAG,EAAE,IAAI,QAAQ;AAAA,MAAA,CAChC;AAAA,IAAA,CACD;AACK,UAAA,QAAQ,IAAI,QAAQ;AAAA,EAAA;AAAA,EAI3B,MAAc,mBACb,OACA,UACA,OACC;AACD,UAAM,SAAS,MAAM,KAAK,eAAe,MAAM,UAAU,KAAK;AAC9D,UAAM,QAAQ,IAAI,OAAO,IAAI,CAAO,QAAA;AAC5B,aAAA,KAAK,eAAe,IAAI;AAAA,QAC9B;AAAA,QACA,QAAQ,SAAS;AAAA,QACjB,SAAS;AAAA,QACT;AAAA,MAAA,CACA;AAAA,IAAA,CACD,CAAC;AAAA,EAAA;AAEJ;;"}
@@ -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,14 @@ 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
117
  primary: row,
118
118
  cause
119
119
  });
120
- }
120
+ }));
121
121
  }
122
122
  }
123
123
  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,\n\t\t\t\tcause,\n\t\t\t})\n\t\t}))\n\t}\n}\n"],"names":[],"mappings":"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"}