@volontariapp/database 1.10.0 → 1.11.0-snap-69d3980

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 (79) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/outbox/consumers/outbox.consumer.d.ts +6 -4
  3. package/dist/outbox/consumers/outbox.consumer.d.ts.map +1 -1
  4. package/dist/outbox/consumers/outbox.consumer.js +31 -12
  5. package/dist/outbox/consumers/outbox.consumer.js.map +1 -1
  6. package/dist/outbox/dispatchers/outbox.dispatcher.d.ts +13 -0
  7. package/dist/outbox/dispatchers/outbox.dispatcher.d.ts.map +1 -0
  8. package/dist/outbox/dispatchers/outbox.dispatcher.js +51 -0
  9. package/dist/outbox/dispatchers/outbox.dispatcher.js.map +1 -0
  10. package/dist/outbox/index.d.ts +1 -0
  11. package/dist/outbox/index.d.ts.map +1 -1
  12. package/dist/outbox/index.js +1 -0
  13. package/dist/outbox/index.js.map +1 -1
  14. package/dist/outbox/runners/outbox.runner.d.ts +3 -1
  15. package/dist/outbox/runners/outbox.runner.d.ts.map +1 -1
  16. package/dist/outbox/runners/outbox.runner.js +4 -2
  17. package/dist/outbox/runners/outbox.runner.js.map +1 -1
  18. package/dist/test/outbox/consumers/outbox.consumer.int.spec.d.ts.map +1 -0
  19. package/dist/test/outbox/{outbox.consumer.int.spec.js → consumers/outbox.consumer.int.spec.js} +45 -13
  20. package/dist/test/outbox/consumers/outbox.consumer.int.spec.js.map +1 -0
  21. package/dist/test/outbox/consumers/outbox.consumer.unit.spec.d.ts.map +1 -0
  22. package/dist/test/outbox/{outbox.consumer.unit.spec.js → consumers/outbox.consumer.unit.spec.js} +52 -16
  23. package/dist/test/outbox/consumers/outbox.consumer.unit.spec.js.map +1 -0
  24. package/dist/test/outbox/dispatchers/outbox.dispatcher.int.spec.d.ts +2 -0
  25. package/dist/test/outbox/dispatchers/outbox.dispatcher.int.spec.d.ts.map +1 -0
  26. package/dist/test/outbox/dispatchers/outbox.dispatcher.int.spec.js +62 -0
  27. package/dist/test/outbox/dispatchers/outbox.dispatcher.int.spec.js.map +1 -0
  28. package/dist/test/outbox/dispatchers/outbox.dispatcher.unit.spec.d.ts +2 -0
  29. package/dist/test/outbox/dispatchers/outbox.dispatcher.unit.spec.d.ts.map +1 -0
  30. package/dist/test/outbox/dispatchers/outbox.dispatcher.unit.spec.js +72 -0
  31. package/dist/test/outbox/dispatchers/outbox.dispatcher.unit.spec.js.map +1 -0
  32. package/dist/test/outbox/models/outbox.model.unit.spec.d.ts.map +1 -0
  33. package/dist/test/outbox/{outbox.model.unit.spec.js → models/outbox.model.unit.spec.js} +2 -2
  34. package/dist/test/outbox/models/outbox.model.unit.spec.js.map +1 -0
  35. package/dist/test/outbox/outbox.runner.int.spec.js +3 -1
  36. package/dist/test/outbox/outbox.runner.int.spec.js.map +1 -1
  37. package/dist/test/outbox/outbox.runner.unit.spec.js +3 -1
  38. package/dist/test/outbox/outbox.runner.unit.spec.js.map +1 -1
  39. package/dist/test/outbox/writers/outbox-extended.writer.int.spec.d.ts +2 -0
  40. package/dist/test/outbox/writers/outbox-extended.writer.int.spec.d.ts.map +1 -0
  41. package/dist/test/{core/outbox-extended.int.spec.js → outbox/writers/outbox-extended.writer.int.spec.js} +8 -8
  42. package/dist/test/outbox/writers/outbox-extended.writer.int.spec.js.map +1 -0
  43. package/dist/test/outbox/writers/outbox.writer.int.spec.d.ts +2 -0
  44. package/dist/test/outbox/writers/outbox.writer.int.spec.d.ts.map +1 -0
  45. package/dist/test/{core/outbox.int.spec.js → outbox/writers/outbox.writer.int.spec.js} +14 -14
  46. package/dist/test/outbox/writers/outbox.writer.int.spec.js.map +1 -0
  47. package/dist/test/outbox/writers/outbox.writer.unit.spec.d.ts.map +1 -0
  48. package/dist/test/outbox/{outbox.writer.unit.spec.js → writers/outbox.writer.unit.spec.js} +7 -7
  49. package/dist/test/outbox/writers/outbox.writer.unit.spec.js.map +1 -0
  50. package/dist/test/utils/helpers/outbox-repository-mock.helper.d.ts +7 -0
  51. package/dist/test/utils/helpers/outbox-repository-mock.helper.d.ts.map +1 -0
  52. package/dist/test/utils/helpers/{outbox-writer-mock.helper.js → outbox-repository-mock.helper.js} +2 -2
  53. package/dist/test/utils/helpers/outbox-repository-mock.helper.js.map +1 -0
  54. package/dist/test/utils/index.d.ts +1 -1
  55. package/dist/test/utils/index.d.ts.map +1 -1
  56. package/dist/test/utils/index.js +1 -1
  57. package/dist/test/utils/index.js.map +1 -1
  58. package/package.json +1 -1
  59. package/dist/test/core/outbox-extended.int.spec.d.ts +0 -2
  60. package/dist/test/core/outbox-extended.int.spec.d.ts.map +0 -1
  61. package/dist/test/core/outbox-extended.int.spec.js.map +0 -1
  62. package/dist/test/core/outbox.int.spec.d.ts +0 -2
  63. package/dist/test/core/outbox.int.spec.d.ts.map +0 -1
  64. package/dist/test/core/outbox.int.spec.js.map +0 -1
  65. package/dist/test/outbox/outbox.consumer.int.spec.d.ts.map +0 -1
  66. package/dist/test/outbox/outbox.consumer.int.spec.js.map +0 -1
  67. package/dist/test/outbox/outbox.consumer.unit.spec.d.ts.map +0 -1
  68. package/dist/test/outbox/outbox.consumer.unit.spec.js.map +0 -1
  69. package/dist/test/outbox/outbox.model.unit.spec.d.ts.map +0 -1
  70. package/dist/test/outbox/outbox.model.unit.spec.js.map +0 -1
  71. package/dist/test/outbox/outbox.writer.unit.spec.d.ts.map +0 -1
  72. package/dist/test/outbox/outbox.writer.unit.spec.js.map +0 -1
  73. package/dist/test/utils/helpers/outbox-writer-mock.helper.d.ts +0 -7
  74. package/dist/test/utils/helpers/outbox-writer-mock.helper.d.ts.map +0 -1
  75. package/dist/test/utils/helpers/outbox-writer-mock.helper.js.map +0 -1
  76. /package/dist/test/outbox/{outbox.consumer.int.spec.d.ts → consumers/outbox.consumer.int.spec.d.ts} +0 -0
  77. /package/dist/test/outbox/{outbox.consumer.unit.spec.d.ts → consumers/outbox.consumer.unit.spec.d.ts} +0 -0
  78. /package/dist/test/outbox/{outbox.model.unit.spec.d.ts → models/outbox.model.unit.spec.d.ts} +0 -0
  79. /package/dist/test/outbox/{outbox.writer.unit.spec.d.ts → writers/outbox.writer.unit.spec.d.ts} +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.11.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Added outboxDispatcher and updated outboxConsumer
8
+
3
9
  ## 1.10.0
4
10
 
5
11
  ### Minor Changes
@@ -2,14 +2,16 @@ import type { BaseRepository } from '../../core/base.repository.js';
2
2
  import type { OutboxEntity } from '../entities/outbox.entity.js';
3
3
  import type { OutboxModel } from '../models/outbox.model.js';
4
4
  import type { Logger } from '@volontariapp/logger';
5
+ import type { OutboxDispatcher } from '../dispatchers/outbox.dispatcher.js';
5
6
  export declare class OutboxConsumer<TOutboxModel extends OutboxModel, TOutboxEntity extends OutboxEntity> {
6
- private readonly logger;
7
+ protected readonly logger: Logger;
7
8
  protected readonly repository: BaseRepository<TOutboxModel, TOutboxEntity, string>;
8
9
  protected readonly batchSize: number;
9
- constructor(logger: Logger, repository: BaseRepository<TOutboxModel, TOutboxEntity, string>, batchSize: number);
10
+ protected readonly outboxDispatcher: OutboxDispatcher<TOutboxModel, TOutboxEntity>;
11
+ constructor(logger: Logger, repository: BaseRepository<TOutboxModel, TOutboxEntity, string>, batchSize: number, outboxDispatcher: OutboxDispatcher<TOutboxModel, TOutboxEntity>);
10
12
  fetchPendingItems(): Promise<TOutboxEntity[]>;
11
13
  private normalizeRows;
12
- processItems(): void;
13
- markItemsAsDispatched(): void;
14
+ processItems(entities: TOutboxEntity[]): Promise<void>;
15
+ markItemsAsCompleted(entities: TOutboxEntity[]): Promise<void>;
14
16
  }
15
17
  //# sourceMappingURL=outbox.consumer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"outbox.consumer.d.ts","sourceRoot":"","sources":["../../../src/outbox/consumers/outbox.consumer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD,qBAAa,cAAc,CAAC,YAAY,SAAS,WAAW,EAAE,aAAa,SAAS,YAAY;IAE5F,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC,YAAY,EAAE,aAAa,EAAE,MAAM,CAAC;IAClF,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM;gBAFnB,MAAM,EAAE,MAAM,EACZ,UAAU,EAAE,cAAc,CAAC,YAAY,EAAE,aAAa,EAAE,MAAM,CAAC,EAC/D,SAAS,EAAE,MAAM;IAOhC,iBAAiB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IA2CnD,OAAO,CAAC,aAAa;IA2BrB,YAAY,IAAI,IAAI;IAIpB,qBAAqB,IAAI,IAAI;CAG9B"}
1
+ {"version":3,"file":"outbox.consumer.d.ts","sourceRoot":"","sources":["../../../src/outbox/consumers/outbox.consumer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAE5E,qBAAa,cAAc,CAAC,YAAY,SAAS,WAAW,EAAE,aAAa,SAAS,YAAY;IAE5F,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM;IACjC,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC,YAAY,EAAE,aAAa,EAAE,MAAM,CAAC;IAClF,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM;IACpC,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,YAAY,EAAE,aAAa,CAAC;gBAH/D,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,cAAc,CAAC,YAAY,EAAE,aAAa,EAAE,MAAM,CAAC,EAC/D,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,gBAAgB,CAAC,YAAY,EAAE,aAAa,CAAC;IAO9E,iBAAiB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IA2CnD,OAAO,CAAC,aAAa;IA2Bf,YAAY,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBtD,oBAAoB,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAUrE"}
@@ -4,10 +4,12 @@ export class OutboxConsumer {
4
4
  logger;
5
5
  repository;
6
6
  batchSize;
7
- constructor(logger, repository, batchSize) {
7
+ outboxDispatcher;
8
+ constructor(logger, repository, batchSize, outboxDispatcher) {
8
9
  this.logger = logger;
9
10
  this.repository = repository;
10
11
  this.batchSize = batchSize;
12
+ this.outboxDispatcher = outboxDispatcher;
11
13
  if (this.batchSize <= 0) {
12
14
  throw new InvalidOutboxSizeError();
13
15
  }
@@ -24,13 +26,13 @@ export class OutboxConsumer {
24
26
  updatedAt: () => 'NOW()',
25
27
  })
26
28
  .where(`id IN (
27
- SELECT "id"
28
- FROM "${tableName}"
29
- WHERE "status" = :pending
30
- ORDER BY "created_at" ASC
31
- LIMIT :limit
32
- FOR UPDATE SKIP LOCKED
33
- )`, { pending: OutboxStatus.PENDING, limit: this.batchSize })
29
+ SELECT "id"
30
+ FROM "${tableName}"
31
+ WHERE "status" = :pending
32
+ ORDER BY "created_at" ASC
33
+ LIMIT :limit
34
+ FOR UPDATE SKIP LOCKED
35
+ )`, { pending: OutboxStatus.PENDING, limit: this.batchSize })
34
36
  .returning('*')
35
37
  .execute();
36
38
  const rawRows = this.normalizeRows(updateResult.raw);
@@ -66,11 +68,28 @@ export class OutboxConsumer {
66
68
  };
67
69
  });
68
70
  }
69
- processItems() {
70
- this.logger.debug('Processing outbox items');
71
+ async processItems(entities) {
72
+ for (const item of entities) {
73
+ try {
74
+ this.logger.info(`Pushing outbox item ${item.id.toString()}`);
75
+ await Promise.resolve();
76
+ await this.outboxDispatcher.markAsCompleted(item);
77
+ }
78
+ catch (error) {
79
+ this.logger.error(`Error pushing outbox item ${item.id.toString()}`, { error });
80
+ await this.outboxDispatcher.markAsFailed(item, error instanceof Error ? error.message : String(error));
81
+ }
82
+ }
71
83
  }
72
- markItemsAsDispatched() {
73
- this.logger.debug('Marking outbox items as dispatched');
84
+ async markItemsAsCompleted(entities) {
85
+ this.logger.debug('Marking outbox items as completed', { ids: entities.map((e) => e.id) });
86
+ for (const item of entities) {
87
+ if (item.status !== OutboxStatus.PROCESSING) {
88
+ this.logger.warn(`Skipping outbox item ${item.id.toString()}`, { status: item.status });
89
+ continue;
90
+ }
91
+ await this.outboxDispatcher.markAsCompleted(item);
92
+ }
74
93
  }
75
94
  }
76
95
  //# sourceMappingURL=outbox.consumer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"outbox.consumer.js","sourceRoot":"","sources":["../../../src/outbox/consumers/outbox.consumer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAG9D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAIzD,MAAM,OAAO,cAAc;IAEN;IACE;IACA;IAHrB,YACmB,MAAc,EACZ,UAA+D,EAC/D,SAAiB;QAFnB,WAAM,GAAN,MAAM,CAAQ;QACZ,eAAU,GAAV,UAAU,CAAqD;QAC/D,cAAS,GAAT,SAAS,CAAQ;QAEpC,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,sBAAsB,EAAE,CAAC;QACrC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,iBAAiB;QACrB,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC;QAErD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QAE7F,OAAO,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE;YAChE,MAAM,YAAY,GAAG,MAAM,WAAW,CAAC,OAAO;iBAC3C,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;iBAC7D,MAAM,EAAE;iBACR,GAAG,CAAC;gBACH,MAAM,EAAE,YAAY,CAAC,UAAU;gBAC/B,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO;aACzB,CAAC;iBACD,KAAK,CACJ;;oBAEU,SAAS;;;;;YAKjB,EACF,EAAE,OAAO,EAAE,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,CACzD;iBACA,SAAS,CAAC,GAAG,CAAC;iBACd,OAAO,EAAE,CAAC;YAEb,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YAErD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;gBAClE,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,uBAAuB,EAAE;gBAC5E,SAAS;gBACT,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;aAClC,CAAC,CAAC;YAEH,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,aAAa,CAAC,MAAe;QACnC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAElF,MAAM,IAAI,GACR,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,IAAI,MAAM;YAC/D,CAAC,CAAE,MAA4B,CAAC,IAAI;YACpC,CAAC,CAAC,MAAM,CAAC;QAEb,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uDAAuD,EAAE;gBACxE,IAAI,EAAE,OAAO,IAAI;aAClB,CAAC,CAAC;YACH,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC;QAE1E,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAa,EAAE,EAAE;YAChC,MAAM,GAAG,GAAG,IAA+B,CAAC;YAC5C,OAAO;gBACL,GAAG,GAAG;gBACN,SAAS,EAAE,CAAC,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,UAAU,CAAS;gBACpD,SAAS,EAAE,CAAC,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,UAAU,CAAS;aACrC,CAAC;QACpB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,YAAY;QACV,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC/C,CAAC;IAED,qBAAqB;QACnB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;IAC1D,CAAC;CACF"}
1
+ {"version":3,"file":"outbox.consumer.js","sourceRoot":"","sources":["../../../src/outbox/consumers/outbox.consumer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { Logger } from '@volontariapp/logger';
2
+ import type { BaseRepository } from '../../core/base.repository.js';
3
+ import type { OutboxEntity } from '../entities/outbox.entity.js';
4
+ import type { OutboxModel } from '../models/outbox.model.js';
5
+ export declare class OutboxDispatcher<ToutboxModel extends OutboxModel, TOutboxEntity extends OutboxEntity> {
6
+ private readonly logger;
7
+ private readonly repository;
8
+ constructor(logger: Logger, repository: BaseRepository<ToutboxModel, TOutboxEntity, string>);
9
+ markAsProcessing(entity: TOutboxEntity): Promise<TOutboxEntity | null>;
10
+ markAsFailed(entity: TOutboxEntity, error?: string): Promise<TOutboxEntity | null>;
11
+ markAsCompleted(entity: TOutboxEntity): Promise<TOutboxEntity | null>;
12
+ }
13
+ //# sourceMappingURL=outbox.dispatcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbox.dispatcher.d.ts","sourceRoot":"","sources":["../../../src/outbox/dispatchers/outbox.dispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAG7D,qBAAa,gBAAgB,CAC3B,YAAY,SAAS,WAAW,EAChC,aAAa,SAAS,YAAY;IAGhC,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU;gBADV,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,cAAc,CAAC,YAAY,EAAE,aAAa,EAAE,MAAM,CAAC;IAGlF,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAkBtE,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAmBlF,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;CAiBtE"}
@@ -0,0 +1,51 @@
1
+ import { UnprocessableEntityError } from '@volontariapp/errors';
2
+ import { OutboxStatus } from '../types/outbox.status.js';
3
+ export class OutboxDispatcher {
4
+ logger;
5
+ repository;
6
+ constructor(logger, repository) {
7
+ this.logger = logger;
8
+ this.repository = repository;
9
+ }
10
+ markAsProcessing(entity) {
11
+ if (entity.status !== OutboxStatus.PENDING) {
12
+ this.logger.warn('Attempted to mark entity as processed, but it is not in PENDING status.', {
13
+ status: entity.status,
14
+ id: entity.id,
15
+ });
16
+ throw new UnprocessableEntityError(`Cannot mark entity ${entity.id} as processing because it is not in PENDING status.`);
17
+ }
18
+ this.logger.info(`Marking outbox entity ${entity.id} as processing`);
19
+ entity.status = OutboxStatus.PROCESSING;
20
+ entity.updatedAt = new Date();
21
+ return this.repository.update(entity.id, entity);
22
+ }
23
+ markAsFailed(entity, error) {
24
+ if (entity.status !== OutboxStatus.PROCESSING) {
25
+ this.logger.warn('Attempted to mark entity as failed, but it is not in PROCESSING status.', {
26
+ status: entity.status,
27
+ id: entity.id,
28
+ });
29
+ throw new UnprocessableEntityError(`Cannot mark entity ${entity.id} as failed because it is not in PROCESSING status.`);
30
+ }
31
+ this.logger.error(`Marking outbox entity ${entity.id} as failed`, { error });
32
+ entity.status = OutboxStatus.FAILED;
33
+ entity.lastError = error;
34
+ entity.updatedAt = new Date();
35
+ return this.repository.update(entity.id, entity);
36
+ }
37
+ markAsCompleted(entity) {
38
+ if (entity.status !== OutboxStatus.PROCESSING) {
39
+ this.logger.warn('Attempted to mark entity as done, but it is not in PROCESSING status.', {
40
+ status: entity.status,
41
+ id: entity.id,
42
+ });
43
+ throw new UnprocessableEntityError(`Cannot mark entity ${entity.id} as completed because it is not in PROCESSING status.`);
44
+ }
45
+ this.logger.info(`Marking outbox entity ${entity.id} as done`);
46
+ entity.status = OutboxStatus.COMPLETED;
47
+ entity.updatedAt = new Date();
48
+ return this.repository.update(entity.id, entity);
49
+ }
50
+ }
51
+ //# sourceMappingURL=outbox.dispatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbox.dispatcher.js","sourceRoot":"","sources":["../../../src/outbox/dispatchers/outbox.dispatcher.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAIhE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,MAAM,OAAO,gBAAgB;IAKR;IACA;IAFnB,YACmB,MAAc,EACd,UAA+D;QAD/D,WAAM,GAAN,MAAM,CAAQ;QACd,eAAU,GAAV,UAAU,CAAqD;IAC/E,CAAC;IAEJ,gBAAgB,CAAC,MAAqB;QACpC,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY,CAAC,OAAO,EAAE,CAAC;YAC3C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yEAAyE,EAAE;gBAC1F,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,EAAE,EAAE,MAAM,CAAC,EAAE;aACd,CAAC,CAAC;YACH,MAAM,IAAI,wBAAwB,CAChC,sBAAsB,MAAM,CAAC,EAAE,qDAAqD,CACrF,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,MAAM,CAAC,EAAE,gBAAgB,CAAC,CAAC;QAErE,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC;QACxC,MAAM,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;IAED,YAAY,CAAC,MAAqB,EAAE,KAAc;QAChD,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY,CAAC,UAAU,EAAE,CAAC;YAC9C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yEAAyE,EAAE;gBAC1F,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,EAAE,EAAE,MAAM,CAAC,EAAE;aACd,CAAC,CAAC;YACH,MAAM,IAAI,wBAAwB,CAChC,sBAAsB,MAAM,CAAC,EAAE,oDAAoD,CACpF,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,MAAM,CAAC,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAE7E,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC;QACpC,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC;QACzB,MAAM,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;IAED,eAAe,CAAC,MAAqB;QACnC,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY,CAAC,UAAU,EAAE,CAAC;YAC9C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uEAAuE,EAAE;gBACxF,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,EAAE,EAAE,MAAM,CAAC,EAAE;aACd,CAAC,CAAC;YACH,MAAM,IAAI,wBAAwB,CAChC,sBAAsB,MAAM,CAAC,EAAE,uDAAuD,CACvF,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC;QAE/D,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC;QACvC,MAAM,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;CACF"}
@@ -7,5 +7,6 @@ export * from './models/jobs-outbox.model.js';
7
7
  export * from './models/outbox.model.js';
8
8
  export * from './writers/outbox.writer.js';
9
9
  export * from './consumers/outbox.consumer.js';
10
+ export * from './dispatchers/outbox.dispatcher.js';
10
11
  export * from './runners/outbox.runner.js';
11
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/outbox/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AAEzC,cAAc,kCAAkC,CAAC;AACjD,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAE5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AAEzC,cAAc,4BAA4B,CAAC;AAE3C,cAAc,gCAAgC,CAAC;AAE/C,cAAc,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/outbox/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AAEzC,cAAc,kCAAkC,CAAC;AACjD,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAE5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AAEzC,cAAc,4BAA4B,CAAC;AAE3C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oCAAoC,CAAC;AACnD,cAAc,4BAA4B,CAAC"}
@@ -7,5 +7,6 @@ export * from './models/jobs-outbox.model.js';
7
7
  export * from './models/outbox.model.js';
8
8
  export * from './writers/outbox.writer.js';
9
9
  export * from './consumers/outbox.consumer.js';
10
+ export * from './dispatchers/outbox.dispatcher.js';
10
11
  export * from './runners/outbox.runner.js';
11
12
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/outbox/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AAEzC,cAAc,kCAAkC,CAAC;AACjD,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAE5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AAEzC,cAAc,4BAA4B,CAAC;AAE3C,cAAc,gCAAgC,CAAC;AAE/C,cAAc,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/outbox/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AAEzC,cAAc,kCAAkC,CAAC;AACjD,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAE5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AAEzC,cAAc,4BAA4B,CAAC;AAE3C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oCAAoC,CAAC;AACnD,cAAc,4BAA4B,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import type { OutboxRunnerConfig } from '@volontariapp/config';
2
+ import type { OutboxDispatcher } from '../dispatchers/outbox.dispatcher.js';
2
3
  import type { OutboxEntity, OutboxModel } from '../index.js';
3
4
  import type { BaseRepository } from '../../core/base.repository.js';
4
5
  export declare class OutboxRunner<TOutboxModel extends OutboxModel, TOutboxEntity extends OutboxEntity> {
@@ -8,7 +9,8 @@ export declare class OutboxRunner<TOutboxModel extends OutboxModel, TOutboxEntit
8
9
  private loopPromise?;
9
10
  private readonly logger;
10
11
  private readonly consumer;
11
- constructor(repository: BaseRepository<TOutboxModel, TOutboxEntity, string>, config: OutboxRunnerConfig);
12
+ private readonly dispatcher;
13
+ constructor(repository: BaseRepository<TOutboxModel, TOutboxEntity, string>, config: OutboxRunnerConfig, dispatcher: OutboxDispatcher<TOutboxModel, TOutboxEntity>);
12
14
  get isRunning(): boolean;
13
15
  start(): void;
14
16
  private runLoop;
@@ -1 +1 @@
1
- {"version":3,"file":"outbox.runner.d.ts","sourceRoot":"","sources":["../../../src/outbox/runners/outbox.runner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEpE,qBAAa,YAAY,CAAC,YAAY,SAAS,WAAW,EAAE,aAAa,SAAS,YAAY;IAQ1F,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IARzB,OAAO,CAAC,eAAe,CAAC,CAAkB;IAC1C,OAAO,CAAC,WAAW,CAAC,CAAgB;IAEpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8C;gBAGpD,UAAU,EAAE,cAAc,CAAC,YAAY,EAAE,aAAa,EAAE,MAAM,CAAC,EAC/D,MAAM,EAAE,kBAAkB;IAS7C,IAAW,SAAS,IAAI,OAAO,CAE9B;IAED,KAAK,IAAI,IAAI;YAaC,OAAO;IAoBf,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAQzB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAgB5B"}
1
+ {"version":3,"file":"outbox.runner.d.ts","sourceRoot":"","sources":["../../../src/outbox/runners/outbox.runner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEpE,qBAAa,YAAY,CAAC,YAAY,SAAS,WAAW,EAAE,aAAa,SAAS,YAAY;IAS1F,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IATzB,OAAO,CAAC,eAAe,CAAC,CAAkB;IAC1C,OAAO,CAAC,WAAW,CAAC,CAAgB;IAEpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8C;IACvE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgD;gBAGxD,UAAU,EAAE,cAAc,CAAC,YAAY,EAAE,aAAa,EAAE,MAAM,CAAC,EAC/D,MAAM,EAAE,kBAAkB,EAC3C,UAAU,EAAE,gBAAgB,CAAC,YAAY,EAAE,aAAa,CAAC;IAe3D,IAAW,SAAS,IAAI,OAAO,CAE9B;IAED,KAAK,IAAI,IAAI;YAaC,OAAO;IAoBf,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAQzB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAgB5B"}
@@ -8,11 +8,13 @@ export class OutboxRunner {
8
8
  loopPromise;
9
9
  logger;
10
10
  consumer;
11
- constructor(repository, config) {
11
+ dispatcher;
12
+ constructor(repository, config, dispatcher) {
12
13
  this.repository = repository;
13
14
  this.config = config;
14
15
  this.logger = new Logger(config.logger);
15
- this.consumer = new OutboxConsumer(this.logger, this.repository, config.batchSize);
16
+ this.dispatcher = dispatcher;
17
+ this.consumer = new OutboxConsumer(this.logger, this.repository, config.batchSize, this.dispatcher);
16
18
  }
17
19
  get isRunning() {
18
20
  return !!this.abortController && !this.abortController.signal.aborted;
@@ -1 +1 @@
1
- {"version":3,"file":"outbox.runner.js","sourceRoot":"","sources":["../../../src/outbox/runners/outbox.runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"outbox.runner.js","sourceRoot":"","sources":["../../../src/outbox/runners/outbox.runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAKjE,MAAM,OAAO,YAAY;IASJ;IACA;IATX,eAAe,CAAmB;IAClC,WAAW,CAAiB;IAEnB,MAAM,CAAS;IACf,QAAQ,CAA8C;IACtD,UAAU,CAAgD;IAE3E,YACmB,UAA+D,EAC/D,MAA0B,EAC3C,UAAyD;QAFxC,eAAU,GAAV,UAAU,CAAqD;QAC/D,WAAM,GAAN,MAAM,CAAoB;QAG3C,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,IAAI,cAAc,CAChC,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,UAAU,EACf,MAAM,CAAC,SAAS,EAChB,IAAI,CAAC,UAAU,CAChB,CAAC;IACJ,CAAC;IAKD,IAAW,SAAS;QAClB,OAAO,CAAC,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC;IACxE,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;YACrD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAC3C,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;QAG7C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IAC/D,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,MAAmB;QACvC,IAAI,CAAC;YACH,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACvB,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAItB,MAAM,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC1D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;YAC9D,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sCAAsC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QACtD,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAE7B,IAAI,CAAC;YAEH,MAAM,IAAI,CAAC,WAAW,CAAC;QACzB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;YAC7B,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;QACnC,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbox.consumer.int.spec.d.ts","sourceRoot":"","sources":["../../../../src/test/outbox/consumers/outbox.consumer.int.spec.ts"],"names":[],"mappings":""}
@@ -1,11 +1,12 @@
1
1
  import { describe, it, expect, beforeAll } from '@jest/globals';
2
- import { testDataSource, setupIntegrationTest } from '../utils/index.js';
3
- import { OutboxModel } from '../../outbox/models/outbox.model.js';
4
- import { OutboxConsumer } from '../../outbox/consumers/outbox.consumer.js';
5
- import { OutboxStatus } from '../../outbox/types/outbox.status.js';
6
- import { makeOutboxEvent } from '../utils/helpers/outbox-event.helper.js';
7
- import { TestOutboxRepository } from '../utils/repositories/outbox-test.repository.js';
8
- import { makeLoggerMock } from '../utils/helpers/logger-mock.helper.js';
2
+ import { testDataSource, setupIntegrationTest } from '../../utils/index.js';
3
+ import { OutboxModel } from '../../../outbox/models/outbox.model.js';
4
+ import { OutboxConsumer } from '../../../outbox/consumers/outbox.consumer.js';
5
+ import { OutboxDispatcher } from '../../../outbox/dispatchers/outbox.dispatcher.js';
6
+ import { OutboxStatus } from '../../../outbox/types/outbox.status.js';
7
+ import { makeOutboxEvent } from '../../utils/helpers/outbox-event.helper.js';
8
+ import { TestOutboxRepository } from '../../utils/repositories/outbox-test.repository.js';
9
+ import { makeLoggerMock } from '../../utils/helpers/logger-mock.helper.js';
9
10
  describe('OutboxConsumer (Integration)', () => {
10
11
  let repository;
11
12
  let loggerMock;
@@ -25,7 +26,8 @@ describe('OutboxConsumer (Integration)', () => {
25
26
  status: OutboxStatus.PENDING,
26
27
  });
27
28
  await repo.save([event1, event2]);
28
- const singleConsumer = new OutboxConsumer(loggerMock, repository, 1);
29
+ const dispatcher = new OutboxDispatcher(loggerMock, repository);
30
+ const singleConsumer = new OutboxConsumer(loggerMock, repository, 1, dispatcher);
29
31
  const items = await singleConsumer.fetchPendingItems();
30
32
  expect(items).toHaveLength(1);
31
33
  expect(items[0].status).toBe(OutboxStatus.PROCESSING);
@@ -41,8 +43,9 @@ describe('OutboxConsumer (Integration)', () => {
41
43
  status: OutboxStatus.PENDING,
42
44
  }));
43
45
  await repo.save(events);
44
- const consumer1 = new OutboxConsumer(loggerMock, repository, 5);
45
- const consumer2 = new OutboxConsumer(loggerMock, repository, 5);
46
+ const dispatcher = new OutboxDispatcher(loggerMock, repository);
47
+ const consumer1 = new OutboxConsumer(loggerMock, repository, 5, dispatcher);
48
+ const consumer2 = new OutboxConsumer(loggerMock, repository, 5, dispatcher);
46
49
  const [results1, results2] = await Promise.all([
47
50
  consumer1.fetchPendingItems(),
48
51
  consumer2.fetchPendingItems(),
@@ -63,9 +66,10 @@ describe('OutboxConsumer (Integration)', () => {
63
66
  status: OutboxStatus.PENDING,
64
67
  }));
65
68
  await repo.save(events);
66
- const consumer1 = new OutboxConsumer(loggerMock, repository, 5);
67
- const consumer2 = new OutboxConsumer(loggerMock, repository, 5);
68
- const consumer3 = new OutboxConsumer(loggerMock, repository, 5);
69
+ const dispatcher = new OutboxDispatcher(loggerMock, repository);
70
+ const consumer1 = new OutboxConsumer(loggerMock, repository, 5, dispatcher);
71
+ const consumer2 = new OutboxConsumer(loggerMock, repository, 5, dispatcher);
72
+ const consumer3 = new OutboxConsumer(loggerMock, repository, 5, dispatcher);
69
73
  const [results1, results2, results3] = await Promise.all([
70
74
  consumer1.fetchPendingItems(),
71
75
  consumer2.fetchPendingItems(),
@@ -79,5 +83,33 @@ describe('OutboxConsumer (Integration)', () => {
79
83
  const totalProcessed = await repo.countBy({ status: OutboxStatus.PROCESSING });
80
84
  expect(totalProcessed).toBe(10);
81
85
  });
86
+ it('markItemsAsCompleted() should mark items as COMPLETED in database', async () => {
87
+ const repo = testDataSource.getRepository(OutboxModel);
88
+ const event = makeOutboxEvent({
89
+ id: '00000000-0000-0000-0000-000000000100',
90
+ status: OutboxStatus.PROCESSING,
91
+ });
92
+ await repo.save(event);
93
+ const dispatcher = new OutboxDispatcher(loggerMock, repository);
94
+ const consumer = new OutboxConsumer(loggerMock, repository, 10, dispatcher);
95
+ const entity = await repository.findOneOrFail({ id: event.id });
96
+ await consumer.markItemsAsCompleted([entity]);
97
+ const dbItem = await repo.findOneBy({ id: event.id });
98
+ expect(dbItem?.status).toBe(OutboxStatus.COMPLETED);
99
+ });
100
+ it('processItems() should process items and mark them as COMPLETED in database', async () => {
101
+ const repo = testDataSource.getRepository(OutboxModel);
102
+ const event = makeOutboxEvent({
103
+ id: '00000000-0000-0000-0000-000000000101',
104
+ status: OutboxStatus.PROCESSING,
105
+ });
106
+ await repo.save(event);
107
+ const dispatcher = new OutboxDispatcher(loggerMock, repository);
108
+ const consumer = new OutboxConsumer(loggerMock, repository, 10, dispatcher);
109
+ const entity = await repository.findOneOrFail({ id: event.id });
110
+ await consumer.processItems([entity]);
111
+ const dbItem = await repo.findOneBy({ id: event.id });
112
+ expect(dbItem?.status).toBe(OutboxStatus.COMPLETED);
113
+ });
82
114
  });
83
115
  //# sourceMappingURL=outbox.consumer.int.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbox.consumer.int.spec.js","sourceRoot":"","sources":["../../../../src/test/outbox/consumers/outbox.consumer.int.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbox.consumer.unit.spec.d.ts","sourceRoot":"","sources":["../../../../src/test/outbox/consumers/outbox.consumer.unit.spec.ts"],"names":[],"mappings":""}
@@ -1,37 +1,40 @@
1
1
  import { describe, expect, it, beforeEach, jest } from '@jest/globals';
2
- import { OutboxConsumer } from '../../outbox/consumers/outbox.consumer.js';
3
- import { OutboxModel } from '../../outbox/models/outbox.model.js';
2
+ import { OutboxConsumer } from '../../../outbox/consumers/outbox.consumer.js';
3
+ import { OutboxModel } from '../../../outbox/models/outbox.model.js';
4
4
  import { InvalidOutboxSizeError } from '@volontariapp/errors';
5
- import { OutboxStatus } from '../../outbox/types/outbox.status.js';
6
- import { makeLoggerMock } from '../utils/helpers/logger-mock.helper.js';
7
- import { makeQueryRunnerMock } from '../utils/helpers/query-runner-mock.helper.js';
5
+ import { OutboxStatus } from '../../../outbox/types/outbox.status.js';
6
+ import { makeLoggerMock } from '../../utils/helpers/logger-mock.helper.js';
7
+ import { makeQueryRunnerMock } from '../../utils/helpers/query-runner-mock.helper.js';
8
8
  describe('OutboxConsumer (Unit)', () => {
9
9
  let consumer;
10
+ let dispatcherMock;
10
11
  let repositoryMock;
11
12
  let queryRunnerMock;
12
13
  let loggerMock;
13
14
  beforeEach(() => {
14
15
  loggerMock = makeLoggerMock();
15
- const mocks = makeQueryRunnerMock();
16
- queryRunnerMock = mocks.queryRunnerMock;
16
+ const { queryRunnerMock: qrMock } = makeQueryRunnerMock();
17
+ queryRunnerMock = qrMock;
17
18
  repositoryMock = {
18
19
  metadata: {
19
20
  target: OutboxModel,
20
21
  tableName: 'outbox',
21
22
  },
22
- executeInTransaction(work) {
23
- return work(queryRunnerMock);
24
- },
25
- toEntities(models) {
26
- return models;
27
- },
23
+ executeInTransaction: jest.fn((work) => work(queryRunnerMock)),
24
+ toEntities: jest.fn((models) => models),
25
+ update: jest.fn(),
26
+ };
27
+ dispatcherMock = {
28
+ markAsCompleted: jest.fn(),
29
+ markAsFailed: jest.fn(),
30
+ markAsProcessing: jest.fn(),
28
31
  };
29
- consumer = new OutboxConsumer(loggerMock, repositoryMock, 10);
32
+ consumer = new OutboxConsumer(loggerMock, repositoryMock, 10, dispatcherMock);
30
33
  });
31
34
  describe('constructor', () => {
32
35
  it('should throw InvalidOutboxSizeError if batchSize <= 0', () => {
33
- expect(() => new OutboxConsumer(loggerMock, repositoryMock, 0)).toThrow(InvalidOutboxSizeError);
34
- expect(() => new OutboxConsumer(loggerMock, repositoryMock, -1)).toThrow(InvalidOutboxSizeError);
36
+ expect(() => new OutboxConsumer(loggerMock, repositoryMock, 0, dispatcherMock)).toThrow(InvalidOutboxSizeError);
37
+ expect(() => new OutboxConsumer(loggerMock, repositoryMock, -1, dispatcherMock)).toThrow(InvalidOutboxSizeError);
35
38
  });
36
39
  });
37
40
  describe('fetchPendingItems', () => {
@@ -82,5 +85,38 @@ describe('OutboxConsumer (Unit)', () => {
82
85
  expect(result).toHaveLength(2);
83
86
  });
84
87
  });
88
+ describe('processItems', () => {
89
+ it('should process items and mark them as completed', async () => {
90
+ const entities = [{ id: '1' }, { id: '2' }];
91
+ await consumer.processItems(entities);
92
+ expect(dispatcherMock.markAsCompleted).toHaveBeenCalledTimes(2);
93
+ expect(dispatcherMock.markAsCompleted).toHaveBeenCalledWith(entities[0]);
94
+ expect(dispatcherMock.markAsCompleted).toHaveBeenCalledWith(entities[1]);
95
+ });
96
+ it('should mark items as failed if processing throws error', async () => {
97
+ const entities = [{ id: '1' }];
98
+ const error = new Error('Test error');
99
+ dispatcherMock.markAsCompleted.mockImplementationOnce(() => {
100
+ throw error;
101
+ });
102
+ await consumer.processItems(entities);
103
+ expect(dispatcherMock.markAsFailed).toHaveBeenCalledWith(entities[0], 'Test error');
104
+ });
105
+ });
106
+ describe('markItemsAsCompleted', () => {
107
+ it('should mark processing items as completed', async () => {
108
+ const entities = [
109
+ { id: '1', status: OutboxStatus.PROCESSING },
110
+ { id: '2', status: OutboxStatus.PENDING },
111
+ ];
112
+ const dispatcherSpy = dispatcherMock.markAsCompleted;
113
+ await consumer.markItemsAsCompleted(entities);
114
+ expect(dispatcherSpy).toHaveBeenCalledTimes(1);
115
+ expect(dispatcherSpy).toHaveBeenCalledWith(entities[0]);
116
+ expect(loggerMock.warn).toHaveBeenCalledWith('Skipping outbox item 2', {
117
+ status: OutboxStatus.PENDING,
118
+ });
119
+ });
120
+ });
85
121
  });
86
122
  //# sourceMappingURL=outbox.consumer.unit.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbox.consumer.unit.spec.js","sourceRoot":"","sources":["../../../../src/test/outbox/consumers/outbox.consumer.unit.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=outbox.dispatcher.int.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbox.dispatcher.int.spec.d.ts","sourceRoot":"","sources":["../../../../src/test/outbox/dispatchers/outbox.dispatcher.int.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,62 @@
1
+ import { describe, it, expect, beforeAll } from '@jest/globals';
2
+ import { testDataSource, setupIntegrationTest } from '../../utils/index.js';
3
+ import { OutboxModel } from '../../../outbox/models/outbox.model.js';
4
+ import { OutboxDispatcher } from '../../../outbox/dispatchers/outbox.dispatcher.js';
5
+ import { OutboxStatus } from '../../../outbox/types/outbox.status.js';
6
+ import { TestOutboxRepository } from '../../utils/repositories/outbox-test.repository.js';
7
+ import { makeLoggerMock } from '../../utils/helpers/logger-mock.helper.js';
8
+ describe('OutboxDispatcher (Integration)', () => {
9
+ let dispatcher;
10
+ let repository;
11
+ const loggerMock = makeLoggerMock();
12
+ setupIntegrationTest([OutboxModel]);
13
+ beforeAll(() => {
14
+ repository = new TestOutboxRepository(testDataSource.getRepository(OutboxModel));
15
+ dispatcher = new OutboxDispatcher(loggerMock, repository);
16
+ });
17
+ it('markAsProcessing() should update status in database', async () => {
18
+ const repo = testDataSource.getRepository(OutboxModel);
19
+ const model = new OutboxModel();
20
+ model.id = '00000000-0000-0000-0000-000000000001';
21
+ model.type = 'test';
22
+ model.emitter = 'test';
23
+ model.status = OutboxStatus.PENDING;
24
+ model.updatedAt = new Date();
25
+ await repo.save(model);
26
+ const entity = await repository.findOneOrFail({ id: model.id });
27
+ await dispatcher.markAsProcessing(entity);
28
+ const updated = await repo.findOneBy({ id: model.id });
29
+ expect(updated?.status).toBe(OutboxStatus.PROCESSING);
30
+ });
31
+ it('markAsFailed() should update status and lastError in database', async () => {
32
+ const repo = testDataSource.getRepository(OutboxModel);
33
+ const model = new OutboxModel();
34
+ model.id = '00000000-0000-0000-0000-000000000002';
35
+ model.type = 'test';
36
+ model.emitter = 'test';
37
+ model.status = OutboxStatus.PROCESSING;
38
+ model.updatedAt = new Date();
39
+ await repo.save(model);
40
+ const entity = await repository.findOneOrFail({ id: model.id });
41
+ const error = 'Failure reason';
42
+ await dispatcher.markAsFailed(entity, error);
43
+ const updated = await repo.findOneBy({ id: model.id });
44
+ expect(updated?.status).toBe(OutboxStatus.FAILED);
45
+ expect(updated?.lastError).toBe(error);
46
+ });
47
+ it('markAsCompleted() should update status to COMPLETED in database', async () => {
48
+ const repo = testDataSource.getRepository(OutboxModel);
49
+ const model = new OutboxModel();
50
+ model.id = '00000000-0000-0000-0000-000000000003';
51
+ model.type = 'test';
52
+ model.emitter = 'test';
53
+ model.status = OutboxStatus.PROCESSING;
54
+ model.updatedAt = new Date();
55
+ await repo.save(model);
56
+ const entity = await repository.findOneOrFail({ id: model.id });
57
+ await dispatcher.markAsCompleted(entity);
58
+ const updated = await repo.findOneBy({ id: model.id });
59
+ expect(updated?.status).toBe(OutboxStatus.COMPLETED);
60
+ });
61
+ });
62
+ //# sourceMappingURL=outbox.dispatcher.int.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbox.dispatcher.int.spec.js","sourceRoot":"","sources":["../../../../src/test/outbox/dispatchers/outbox.dispatcher.int.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=outbox.dispatcher.unit.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbox.dispatcher.unit.spec.d.ts","sourceRoot":"","sources":["../../../../src/test/outbox/dispatchers/outbox.dispatcher.unit.spec.ts"],"names":[],"mappings":""}