@volontariapp/domain-event 2.5.0 → 2.6.0-snap-ae3e8c2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.6.0
4
+
5
+ ### Minor Changes
6
+
7
+ - trigger SQL
8
+
3
9
  ## 2.5.0
4
10
 
5
11
  ### Minor Changes
@@ -0,0 +1,7 @@
1
+ export declare const EVENT_QUEUE_TRIGGER_FUNCTION: string;
2
+ export declare const EVENTS_TRIGGER: string;
3
+ export declare const REQUIREMENTS_TRIGGER: string;
4
+ export declare const TAGS_TRIGGER: string;
5
+ export declare const EVENT_TAGS_TRIGGER: string;
6
+ export declare function getTriggerSql(tableName: string, eventType: string, emitter: string): string;
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/database/triggers/index.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,4BAA4B,QAAyC,CAAC;AACnF,eAAO,MAAM,cAAc,QAAoC,CAAC;AAChE,eAAO,MAAM,oBAAoB,QAA0C,CAAC;AAC5E,eAAO,MAAM,YAAY,QAAkC,CAAC;AAC5D,eAAO,MAAM,kBAAkB,QAAwC,CAAC;AAKxE,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAQ3F"}
@@ -0,0 +1,21 @@
1
+ import { readFileSync } from 'fs';
2
+ import { join, dirname } from 'path';
3
+ import { fileURLToPath } from 'url';
4
+ const __filename = fileURLToPath(import.meta.url);
5
+ const __dirname = dirname(__filename);
6
+ const readSqlFile = (filename) => readFileSync(join(__dirname, filename), 'utf8');
7
+ export const EVENT_QUEUE_TRIGGER_FUNCTION = readSqlFile('event-queue-trigger.sql');
8
+ export const EVENTS_TRIGGER = readSqlFile('events.trigger.sql');
9
+ export const REQUIREMENTS_TRIGGER = readSqlFile('requirements.trigger.sql');
10
+ export const TAGS_TRIGGER = readSqlFile('tags.trigger.sql');
11
+ export const EVENT_TAGS_TRIGGER = readSqlFile('event_tags.trigger.sql');
12
+ export function getTriggerSql(tableName, eventType, emitter) {
13
+ const triggerName = `${tableName}_event_queue_trigger`;
14
+ return `
15
+ DROP TRIGGER IF EXISTS ${triggerName} ON ${tableName};
16
+ CREATE TRIGGER ${triggerName}
17
+ AFTER INSERT OR UPDATE OR DELETE ON ${tableName}
18
+ FOR EACH ROW EXECUTE FUNCTION create_event_queue_record('${eventType}', '${emitter}');
19
+ `;
20
+ }
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/database/triggers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,MAAM,WAAW,GAAG,CAAC,QAAgB,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;AAE1F,MAAM,CAAC,MAAM,4BAA4B,GAAG,WAAW,CAAC,yBAAyB,CAAC,CAAC;AACnF,MAAM,CAAC,MAAM,cAAc,GAAG,WAAW,CAAC,oBAAoB,CAAC,CAAC;AAChE,MAAM,CAAC,MAAM,oBAAoB,GAAG,WAAW,CAAC,0BAA0B,CAAC,CAAC;AAC5E,MAAM,CAAC,MAAM,YAAY,GAAG,WAAW,CAAC,kBAAkB,CAAC,CAAC;AAC5D,MAAM,CAAC,MAAM,kBAAkB,GAAG,WAAW,CAAC,wBAAwB,CAAC,CAAC;AAKxE,MAAM,UAAU,aAAa,CAAC,SAAiB,EAAE,SAAiB,EAAE,OAAe;IACjF,MAAM,WAAW,GAAG,GAAG,SAAS,sBAAsB,CAAC;IACvD,OAAO;6BACoB,WAAW,OAAO,SAAS;qBACnC,WAAW;0CACU,SAAS;+DACY,SAAS,OAAO,OAAO;GACnF,CAAC;AACJ,CAAC"}
package/dist/index.d.ts CHANGED
@@ -13,4 +13,5 @@ export * from './repositories/interfaces/requirement.repository.js';
13
13
  export * from './repositories/postgres-requirement.repository.js';
14
14
  export * from './services/index.js';
15
15
  export * from './value-objects/event-location.value-object.js';
16
+ export * from './database/triggers/index.js';
16
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,kCAAkC,CAAC;AAEjD,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qBAAqB,CAAC;AAEpC,cAAc,+CAA+C,CAAC;AAC9D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,qDAAqD,CAAC;AACpE,cAAc,mDAAmD,CAAC;AAElE,cAAc,qBAAqB,CAAC;AAEpC,cAAc,gDAAgD,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,kCAAkC,CAAC;AAEjD,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qBAAqB,CAAC;AAEpC,cAAc,+CAA+C,CAAC;AAC9D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,qDAAqD,CAAC;AACpE,cAAc,mDAAmD,CAAC;AAElE,cAAc,qBAAqB,CAAC;AAEpC,cAAc,gDAAgD,CAAC;AAE/D,cAAc,8BAA8B,CAAC"}
package/dist/index.js CHANGED
@@ -14,5 +14,6 @@ export * from './repositories/interfaces/requirement.repository.js';
14
14
  export * from './repositories/postgres-requirement.repository.js';
15
15
  export * from './services/index.js';
16
16
  export * from './value-objects/event-location.value-object.js';
17
+ export * from './database/triggers/index.js';
17
18
  registerEventMappings();
18
19
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,kCAAkC,CAAC;AAEjD,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qBAAqB,CAAC;AAEpC,cAAc,+CAA+C,CAAC;AAC9D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,qDAAqD,CAAC;AACpE,cAAc,mDAAmD,CAAC;AAElE,cAAc,qBAAqB,CAAC;AAEpC,cAAc,gDAAgD,CAAC;AAE/D,qBAAqB,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,kCAAkC,CAAC;AAEjD,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qBAAqB,CAAC;AAEpC,cAAc,+CAA+C,CAAC;AAC9D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,qDAAqD,CAAC;AACpE,cAAc,mDAAmD,CAAC;AAElE,cAAc,qBAAqB,CAAC;AAEpC,cAAc,gDAAgD,CAAC;AAE/D,cAAc,8BAA8B,CAAC;AAE7C,qBAAqB,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"data-source.d.ts","sourceRoot":"","sources":["../../src/test/data-source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAezD,eAAO,MAAM,cAAc,YAqBzB,CAAC;AAEH,eAAO,MAAM,iBAAiB,GAAI,CAAC,SAAS,MAAM,eAAe,UAAU,CAAC,KAAG,UAAU,CAAC,CAAC,CACpB,CAAC;AAExE,eAAO,MAAM,gBAAgB,QAAa,OAAO,CAAC,IAAI,CAMrD,CAAC;AAEF,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,IAAI,CAIhD,CAAC;AAEF,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,IAAI,CAIhD,CAAC"}
1
+ {"version":3,"file":"data-source.d.ts","sourceRoot":"","sources":["../../src/test/data-source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAkBzD,eAAO,MAAM,cAAc,YAuBzB,CAAC;AAEH,eAAO,MAAM,iBAAiB,GAAI,CAAC,SAAS,MAAM,eAAe,UAAU,CAAC,KAAG,UAAU,CAAC,CAAC,CACpB,CAAC;AAExE,eAAO,MAAM,gBAAgB,QAAa,OAAO,CAAC,IAAI,CAMrD,CAAC;AAEF,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,IAAI,CAIhD,CAAC;AAEF,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,IAAI,CAIhD,CAAC"}
@@ -3,6 +3,7 @@ import { EventModel } from '../models/event.model.js';
3
3
  import { TagModel } from '../models/tag.model.js';
4
4
  import { RequirementModel } from '../models/requirement.model.js';
5
5
  import { registerEventMappings } from '../models/mappers.js';
6
+ import { EventQueueModel, JobsOutboxModel } from '@volontariapp/database';
6
7
  import { InitialSchema1776008237420 } from './migrations/1776008237420-InitialSchema.js';
7
8
  import { AddDetailsToRequirement1776104175000 } from './migrations/1776104175000-AddDetailsToRequirement.js';
8
9
  import { AddEventOrganizerAndMakeRequirementCreatorNullable1776104180000 } from './migrations/1776104180000-AddEventOrganizerAndMakeRequirementCreatorNullable.js';
@@ -10,6 +11,7 @@ import { UpdateTagSchemaAndAddEventLocalisation1776110000000 } from './migration
10
11
  import { JobsOutboxAndEventQueue1776786226145 } from './migrations/1776786226145-JobsOutboxAndEventQueue.js';
11
12
  import { JobsOutboxAndEventQueueWithTraceId1776974876099 } from './migrations/1776974876099-JobsOutboxAndEventQueueWithTraceId.js';
12
13
  import { UpdateOutboxModels1777630647718 } from './migrations/1777630647718-UpdateOutboxModels.js';
14
+ import { SetupEventTriggers1776786226146 } from './migrations/1776786226146-SetupEventTriggers.js';
13
15
  const isMigrationRun = process.env.TYPEORM_MIGRATION_RUN === 'true';
14
16
  export const testDataSource = new DataSource({
15
17
  type: 'postgres',
@@ -18,7 +20,7 @@ export const testDataSource = new DataSource({
18
20
  username: 'user',
19
21
  password: 'password',
20
22
  database: 'ms_event',
21
- entities: [EventModel, TagModel, RequirementModel],
23
+ entities: [EventModel, TagModel, RequirementModel, EventQueueModel, JobsOutboxModel],
22
24
  migrations: isMigrationRun
23
25
  ? [
24
26
  InitialSchema1776008237420,
@@ -28,6 +30,7 @@ export const testDataSource = new DataSource({
28
30
  JobsOutboxAndEventQueue1776786226145,
29
31
  JobsOutboxAndEventQueueWithTraceId1776974876099,
30
32
  UpdateOutboxModels1777630647718,
33
+ SetupEventTriggers1776786226146,
31
34
  ]
32
35
  : [],
33
36
  synchronize: false,
@@ -46,6 +49,6 @@ export const closeTestDb = async () => {
46
49
  }
47
50
  };
48
51
  export const truncateAll = async () => {
49
- await testDataSource.query('TRUNCATE TABLE event_tags, event_requirements, events, tags, requirements CASCADE;');
52
+ await testDataSource.query('TRUNCATE TABLE event_tags, event_requirements, events, tags, requirements, event_queue, jobs_outbox CASCADE;');
50
53
  };
51
54
  //# sourceMappingURL=data-source.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"data-source.js","sourceRoot":"","sources":["../../src/test/data-source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,0BAA0B,EAAE,MAAM,6CAA6C,CAAC;AACzF,OAAO,EAAE,oCAAoC,EAAE,MAAM,uDAAuD,CAAC;AAC7G,OAAO,EAAE,+DAA+D,EAAE,MAAM,kFAAkF,CAAC;AACnK,OAAO,EAAE,mDAAmD,EAAE,MAAM,sEAAsE,CAAC;AAC3I,OAAO,EAAE,oCAAoC,EAAE,MAAM,uDAAuD,CAAC;AAC7G,OAAO,EAAE,+CAA+C,EAAE,MAAM,kEAAkE,CAAC;AACnI,OAAO,EAAE,+BAA+B,EAAE,MAAM,kDAAkD,CAAC;AAEnG,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,MAAM,CAAC;AAEpE,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,UAAU,CAAC;IAC3C,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,IAAI;IACV,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,gBAAgB,CAAC;IAClD,UAAU,EAAE,cAAc;QACxB,CAAC,CAAC;YACE,0BAA0B;YAC1B,oCAAoC;YACpC,+DAA+D;YAC/D,mDAAmD;YACnD,oCAAoC;YACpC,+CAA+C;YAC/C,+BAA+B;SAChC;QACH,CAAC,CAAC,EAAE;IACN,WAAW,EAAE,KAAK;IAClB,OAAO,EAAE,KAAK;CACf,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAmB,WAAwB,EAAiB,EAAE,CAC7F,cAAc,CAAC,aAAa,CAAC,WAAW,CAA6B,CAAC;AAExE,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,IAAmB,EAAE;IACxD,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC;QAClC,MAAM,cAAc,CAAC,UAAU,EAAE,CAAC;IACpC,CAAC;IAED,qBAAqB,EAAE,CAAC;AAC1B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,IAAmB,EAAE;IACnD,IAAI,cAAc,CAAC,aAAa,EAAE,CAAC;QACjC,MAAM,cAAc,CAAC,OAAO,EAAE,CAAC;IACjC,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,IAAmB,EAAE;IACnD,MAAM,cAAc,CAAC,KAAK,CACxB,oFAAoF,CACrF,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"data-source.js","sourceRoot":"","sources":["../../src/test/data-source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE1E,OAAO,EAAE,0BAA0B,EAAE,MAAM,6CAA6C,CAAC;AACzF,OAAO,EAAE,oCAAoC,EAAE,MAAM,uDAAuD,CAAC;AAC7G,OAAO,EAAE,+DAA+D,EAAE,MAAM,kFAAkF,CAAC;AACnK,OAAO,EAAE,mDAAmD,EAAE,MAAM,sEAAsE,CAAC;AAC3I,OAAO,EAAE,oCAAoC,EAAE,MAAM,uDAAuD,CAAC;AAC7G,OAAO,EAAE,+CAA+C,EAAE,MAAM,kEAAkE,CAAC;AACnI,OAAO,EAAE,+BAA+B,EAAE,MAAM,kDAAkD,CAAC;AACnG,OAAO,EAAE,+BAA+B,EAAE,MAAM,kDAAkD,CAAC;AAEnG,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,MAAM,CAAC;AAEpE,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,UAAU,CAAC;IAC3C,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,IAAI;IACV,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,CAAC;IAEpF,UAAU,EAAE,cAAc;QACxB,CAAC,CAAC;YACE,0BAA0B;YAC1B,oCAAoC;YACpC,+DAA+D;YAC/D,mDAAmD;YACnD,oCAAoC;YACpC,+CAA+C;YAC/C,+BAA+B;YAC/B,+BAA+B;SAChC;QACH,CAAC,CAAC,EAAE;IACN,WAAW,EAAE,KAAK;IAClB,OAAO,EAAE,KAAK;CACf,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAmB,WAAwB,EAAiB,EAAE,CAC7F,cAAc,CAAC,aAAa,CAAC,WAAW,CAA6B,CAAC;AAExE,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,IAAmB,EAAE;IACxD,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC;QAClC,MAAM,cAAc,CAAC,UAAU,EAAE,CAAC;IACpC,CAAC;IAED,qBAAqB,EAAE,CAAC;AAC1B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,IAAmB,EAAE;IACnD,IAAI,cAAc,CAAC,aAAa,EAAE,CAAC;QACjC,MAAM,cAAc,CAAC,OAAO,EAAE,CAAC;IACjC,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,IAAmB,EAAE;IACnD,MAAM,cAAc,CAAC,KAAK,CACxB,8GAA8G,CAC/G,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=triggers.int.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triggers.int.spec.d.ts","sourceRoot":"","sources":["../../../src/test/integration/triggers.int.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,87 @@
1
+ import { describe, it, expect, beforeAll, afterAll, beforeEach } from '@jest/globals';
2
+ import { testDataSource, initializeTestDb, closeTestDb, truncateAll, getTestRepository, } from '../data-source.js';
3
+ import { EventModel } from '../../models/event.model.js';
4
+ import { TagModel } from '../../models/tag.model.js';
5
+ import { RequirementModel } from '../../models/requirement.model.js';
6
+ import { PostgresEventRepository } from '../../repositories/postgres-event.repository.js';
7
+ import { PostgresTagRepository } from '../../repositories/postgres-tag.repository.js';
8
+ import { PostgresRequirementRepository } from '../../repositories/postgres-requirement.repository.js';
9
+ import { EventFactory } from '../__test-utils__/factories/event.factory.js';
10
+ import { TagFactory } from '../__test-utils__/factories/tag.factory.js';
11
+ import { RequirementFactory } from '../__test-utils__/factories/requirement.factory.js';
12
+ import { EventQueueModel } from '@volontariapp/database';
13
+ import { EventMessagingType } from '@volontariapp/messaging';
14
+ describe('SQL Triggers (Integration)', () => {
15
+ let eventRepository;
16
+ let tagRepository;
17
+ let requirementRepository;
18
+ beforeAll(async () => {
19
+ await initializeTestDb();
20
+ await testDataSource.runMigrations();
21
+ eventRepository = new PostgresEventRepository(getTestRepository(EventModel));
22
+ tagRepository = new PostgresTagRepository(getTestRepository(TagModel));
23
+ requirementRepository = new PostgresRequirementRepository(getTestRepository(RequirementModel));
24
+ });
25
+ afterAll(async () => {
26
+ await closeTestDb();
27
+ });
28
+ beforeEach(async () => {
29
+ await truncateAll();
30
+ });
31
+ it('should create an event_queue record when an event is inserted', async () => {
32
+ const input = EventFactory.buildInput({ name: 'Trigger Test Event' });
33
+ await eventRepository.create(input);
34
+ const records = await testDataSource
35
+ .getRepository(EventQueueModel)
36
+ .find({ where: { type: EventMessagingType.EVENT_CHANGED } });
37
+ expect(records).toHaveLength(1);
38
+ const record = records[0];
39
+ expect(record.payload.after?.name).toBe('Trigger Test Event');
40
+ expect(record.payload.before).toBeFalsy();
41
+ expect(record.emitter).toBe('ms-event-db');
42
+ });
43
+ it('should create an event_queue record when a requirement is updated', async () => {
44
+ const req = await requirementRepository.create(RequirementFactory.buildInput({ currentQuantity: 0 }));
45
+ await requirementRepository.update(req.id, { currentQuantity: 5 });
46
+ const records = await testDataSource.getRepository(EventQueueModel).find({
47
+ where: { type: EventMessagingType.REQUIREMENT_CHANGED },
48
+ order: { createdAt: 'DESC' },
49
+ });
50
+ expect(records.length).toBeGreaterThanOrEqual(2);
51
+ const updateRecord = records[0];
52
+ expect(updateRecord.payload.before?.currentQuantity).toBe(0);
53
+ expect(updateRecord.payload.after?.currentQuantity).toBe(5);
54
+ expect(updateRecord.emitter).toBe('ms-event-db');
55
+ });
56
+ it('should create an event_queue record when a tag is deleted', async () => {
57
+ const tag = await tagRepository.create(TagFactory.buildInput({ name: 'To Delete' }));
58
+ await tagRepository.delete(tag.id);
59
+ const records = await testDataSource
60
+ .getRepository(EventQueueModel)
61
+ .find({ where: { type: EventMessagingType.TAG_CHANGED } });
62
+ const typedRecords = records;
63
+ const deleteRecord = typedRecords.find((r) => r.payload.before?.name === 'To Delete');
64
+ expect(deleteRecord).toBeDefined();
65
+ if (deleteRecord) {
66
+ expect(deleteRecord.payload.after).toBeFalsy();
67
+ expect(deleteRecord.payload.before?.name).toBe('To Delete');
68
+ }
69
+ });
70
+ it('should handle ManyToMany relation updates', async () => {
71
+ const event = await eventRepository.create(EventFactory.buildInput({ name: 'Relation Event' }));
72
+ const tag = await tagRepository.create(TagFactory.buildInput());
73
+ await testDataSource.query('INSERT INTO event_tags ("eventsId", "tagsId") VALUES ($1, $2)', [
74
+ event.id,
75
+ tag.id,
76
+ ]);
77
+ const records = await testDataSource
78
+ .getRepository(EventQueueModel)
79
+ .find({ where: { type: EventMessagingType.EVENT_TAG_LINKED } });
80
+ expect(records).toHaveLength(1);
81
+ const record = records[0];
82
+ expect(record.payload.after?.eventsId).toBe(event.id);
83
+ expect(record.payload.after?.tagsId).toBe(tag.id);
84
+ expect(record.emitter).toBe('ms-event-db');
85
+ });
86
+ });
87
+ //# sourceMappingURL=triggers.int.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triggers.int.spec.js","sourceRoot":"","sources":["../../../src/test/integration/triggers.int.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { MigrationInterface, QueryRunner } from 'typeorm';
2
+ export declare class SetupEventTriggers1776786226146 implements MigrationInterface {
3
+ name: string;
4
+ up(queryRunner: QueryRunner): Promise<void>;
5
+ down(queryRunner: QueryRunner): Promise<void>;
6
+ }
7
+ //# sourceMappingURL=1776786226146-SetupEventTriggers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"1776786226146-SetupEventTriggers.d.ts","sourceRoot":"","sources":["../../../src/test/migrations/1776786226146-SetupEventTriggers.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE/D,qBAAa,+BAAgC,YAAW,kBAAkB;IACxE,IAAI,SAAqC;IAE5B,EAAE,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ3C,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CAQ3D"}
@@ -0,0 +1,18 @@
1
+ import { EVENT_QUEUE_TRIGGER_FUNCTION, EVENTS_TRIGGER, REQUIREMENTS_TRIGGER, TAGS_TRIGGER, EVENT_TAGS_TRIGGER, } from '../../database/triggers/index.js';
2
+ export class SetupEventTriggers1776786226146 {
3
+ name = 'SetupEventTriggers1776786226146';
4
+ async up(queryRunner) {
5
+ await queryRunner.query(EVENT_QUEUE_TRIGGER_FUNCTION);
6
+ await queryRunner.query(EVENTS_TRIGGER);
7
+ await queryRunner.query(REQUIREMENTS_TRIGGER);
8
+ await queryRunner.query(TAGS_TRIGGER);
9
+ await queryRunner.query(EVENT_TAGS_TRIGGER);
10
+ }
11
+ async down(queryRunner) {
12
+ await queryRunner.query(`DROP TRIGGER IF EXISTS tags_event_queue_trigger ON tags;`);
13
+ await queryRunner.query(`DROP TRIGGER IF EXISTS requirements_event_queue_trigger ON requirements;`);
14
+ await queryRunner.query(`DROP TRIGGER IF EXISTS events_event_queue_trigger ON events;`);
15
+ await queryRunner.query(`DROP FUNCTION IF EXISTS create_event_queue_record();`);
16
+ }
17
+ }
18
+ //# sourceMappingURL=1776786226146-SetupEventTriggers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"1776786226146-SetupEventTriggers.js","sourceRoot":"","sources":["../../../src/test/migrations/1776786226146-SetupEventTriggers.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,4BAA4B,EAC5B,cAAc,EACd,oBAAoB,EACpB,YAAY,EACZ,kBAAkB,GACnB,MAAM,kCAAkC,CAAC;AAI1C,MAAM,OAAO,+BAA+B;IAC1C,IAAI,GAAG,iCAAiC,CAAC;IAElC,KAAK,CAAC,EAAE,CAAC,WAAwB;QACtC,MAAM,WAAW,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QACtD,MAAM,WAAW,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACxC,MAAM,WAAW,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC9C,MAAM,WAAW,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACtC,MAAM,WAAW,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAC9C,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,WAAwB;QACxC,MAAM,WAAW,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;QACpF,MAAM,WAAW,CAAC,KAAK,CACrB,0EAA0E,CAC3E,CAAC;QACF,MAAM,WAAW,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;QACxF,MAAM,WAAW,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAClF,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@volontariapp/domain-event",
3
- "version": "2.5.0",
3
+ "version": "2.6.0-snap-ae3e8c2",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "provenance": true
@@ -58,6 +58,7 @@
58
58
  "@volontariapp/errors": "0.5.0",
59
59
  "@volontariapp/errors-nest": "0.10.0",
60
60
  "@volontariapp/logger": "0.2.3",
61
+ "@volontariapp/messaging": "1.0.0-snap-ae3e8c2",
61
62
  "class-transformer": "^0.5.1"
62
63
  }
63
64
  }