@volontariapp/database 1.8.1-snap-06e37a9 → 1.9.0-snap-eefb381

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,12 +1,10 @@
1
1
  # Changelog
2
2
 
3
- ## 1.8.1
3
+ ## 1.9.0
4
4
 
5
- ### Patch Changes
5
+ ### Minor Changes
6
6
 
7
- - Updated dependencies []:
8
- - @volontariapp/errors@0.5.0
9
- - @volontariapp/bridge@0.2.9
7
+ - added outbox extended repository and fixed changelog history
10
8
 
11
9
  ## 1.8.0
12
10
 
@@ -35,6 +33,18 @@
35
33
  - Updated dependencies []:
36
34
  - @volontariapp/logger@0.2.3
37
35
 
36
+ ## 1.5.0
37
+
38
+ ### Minor Changes
39
+
40
+ - patch database update
41
+
42
+ ## 1.4.0
43
+
44
+ ### Minor Changes
45
+
46
+ - fix: update
47
+
38
48
  ## 1.3.0
39
49
 
40
50
  ### Minor Changes
@@ -5,9 +5,10 @@ import type { Logger } from '@volontariapp/logger';
5
5
  export declare class OutboxConsumer<TOutboxModel extends OutboxModel, TOutboxEntity extends OutboxEntity> {
6
6
  private readonly logger;
7
7
  protected readonly repository: BaseRepository<TOutboxModel, TOutboxEntity, string>;
8
- private readonly batchSize;
8
+ protected readonly batchSize: number;
9
9
  constructor(logger: Logger, repository: BaseRepository<TOutboxModel, TOutboxEntity, string>, batchSize: number);
10
10
  fetchPendingItems(): Promise<TOutboxEntity[]>;
11
+ private normalizeRows;
11
12
  processItems(): void;
12
13
  markItemsAsDispatched(): void;
13
14
  }
@@ -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,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAFT,MAAM,EAAE,MAAM,EACZ,UAAU,EAAE,cAAc,CAAC,YAAY,EAAE,aAAa,EAAE,MAAM,CAAC,EACjE,SAAS,EAAE,MAAM;IAO9B,iBAAiB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IA6CnD,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;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"}
@@ -16,24 +16,24 @@ export class OutboxConsumer {
16
16
  const tableName = this.repository.metadata.tableName;
17
17
  this.logger.debug('Fetching pending outbox items', { tableName, batchSize: this.batchSize });
18
18
  return this.repository.executeInTransaction(async (queryRunner) => {
19
- const result = (await queryRunner.query(`
20
- UPDATE "${tableName}"
21
- SET
22
- "status" = $1,
23
- "updated_at" = NOW()
24
- WHERE "id" IN (
19
+ const updateResult = await queryRunner.manager
20
+ .createQueryBuilder(this.repository.metadata.target, 'outbox')
21
+ .update()
22
+ .set({
23
+ status: OutboxStatus.PROCESSING,
24
+ updatedAt: () => 'NOW()',
25
+ })
26
+ .where(`id IN (
25
27
  SELECT "id"
26
28
  FROM "${tableName}"
27
- WHERE "status" = $2
29
+ WHERE "status" = :pending
28
30
  ORDER BY "created_at" ASC
29
- LIMIT $3
31
+ LIMIT :limit
30
32
  FOR UPDATE SKIP LOCKED
31
- )
32
- RETURNING *, "created_at" AS "createdAt", "updated_at" AS "updatedAt";
33
- `, [OutboxStatus.PROCESSING, OutboxStatus.PENDING, this.batchSize]));
34
- const rawRows = Array.isArray(result) && Array.isArray(result[0])
35
- ? result[0]
36
- : result;
33
+ )`, { pending: OutboxStatus.PENDING, limit: this.batchSize })
34
+ .returning('*')
35
+ .execute();
36
+ const rawRows = this.normalizeRows(updateResult.raw);
37
37
  if (rawRows.length === 0) {
38
38
  this.logger.debug('No pending outbox items found', { tableName });
39
39
  return [];
@@ -45,6 +45,27 @@ export class OutboxConsumer {
45
45
  return this.repository.toEntities(rawRows);
46
46
  });
47
47
  }
48
+ normalizeRows(result) {
49
+ this.logger.debug('Normalizing query result', { isArray: Array.isArray(result) });
50
+ const data = result !== null && typeof result === 'object' && 'rows' in result
51
+ ? result.rows
52
+ : result;
53
+ if (!Array.isArray(data)) {
54
+ this.logger.warn('Query result data is not an array after normalization', {
55
+ type: typeof data,
56
+ });
57
+ return [];
58
+ }
59
+ this.logger.debug(`Mapping ${data.length.toString()} raw rows to models`);
60
+ return data.map((item) => {
61
+ const row = item;
62
+ return {
63
+ ...row,
64
+ createdAt: (row.createdAt ?? row.created_at),
65
+ updatedAt: (row.updatedAt ?? row.updated_at),
66
+ };
67
+ });
68
+ }
48
69
  processItems() {
49
70
  this.logger.debug('Processing outbox items');
50
71
  }
@@ -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;IACF;IAHnB,YACmB,MAAc,EACZ,UAA+D,EACjE,SAAiB;QAFjB,WAAM,GAAN,MAAM,CAAQ;QACZ,eAAU,GAAV,UAAU,CAAqD;QACjE,cAAS,GAAT,SAAS,CAAQ;QAElC,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,MAAM,GAAG,CAAC,MAAM,WAAW,CAAC,KAAK,CACrC;oBACY,SAAS;;;;;;oBAMT,SAAS;;;;;;;SAOpB,EACD,CAAC,YAAY,CAAC,UAAU,EAAE,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAChE,CAAY,CAAC;YAGd,MAAM,OAAO,GACX,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAE,MAAoB,CAAC,CAAC,CAAC,CAAC;gBAC9D,CAAC,CAAG,MAAoB,CAAC,CAAC,CAAoB;gBAC9C,CAAC,CAAE,MAAyB,CAAC;YAEjC,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;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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=outbox-extended.int.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbox-extended.int.spec.d.ts","sourceRoot":"","sources":["../../../src/test/core/outbox-extended.int.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,96 @@
1
+ import { describe, it, expect, beforeAll, afterAll, beforeEach, jest } from '@jest/globals';
2
+ import { testDataSource, initializeTestDb, closeTestDb } from '../data-source.js';
3
+ import { databaseMapper } from '../../core/mapper.service.js';
4
+ import { OutboxStatus } from '../../outbox/types/outbox.status.js';
5
+ import { makeExtendedOutboxEvent } from '../utils/helpers/extended-outbox-event.helper.js';
6
+ import { TestExtendedOutboxWriter } from '../utils/repositories/outbox-extended-test.repository.js';
7
+ import { ExtendedOutboxEntity } from '../example/entities/extended-outbox.entity.js';
8
+ import { ExtendedOutboxModel } from '../example/models/extended-outbox.model.js';
9
+ import { Logger } from '@volontariapp/logger';
10
+ describe('Outbox Writer with extended model/entity (Full Integration)', () => {
11
+ let outboxWriter;
12
+ const logger = new Logger({ minLevel: 'fatal' });
13
+ beforeAll(async () => {
14
+ await initializeTestDb();
15
+ databaseMapper.registerBidirectional(ExtendedOutboxModel, ExtendedOutboxEntity);
16
+ outboxWriter = new TestExtendedOutboxWriter(logger, testDataSource.getRepository(ExtendedOutboxModel));
17
+ });
18
+ afterAll(async () => {
19
+ await closeTestDb();
20
+ });
21
+ beforeEach(async () => {
22
+ await testDataSource.getRepository(ExtendedOutboxModel).createQueryBuilder().delete().execute();
23
+ jest.spyOn(logger, 'info').mockImplementation(() => { });
24
+ jest.spyOn(logger, 'warn').mockImplementation(() => { });
25
+ jest.spyOn(logger, 'error').mockImplementation(() => { });
26
+ });
27
+ it('create() should persist an extended outbox entity', async () => {
28
+ const event = makeExtendedOutboxEvent({
29
+ type: 'extended.created',
30
+ channel: 'sms',
31
+ });
32
+ await outboxWriter.create(event);
33
+ const row = await testDataSource
34
+ .getRepository(ExtendedOutboxModel)
35
+ .findOneByOrFail({ type: 'extended.created' });
36
+ expect(row.channel).toBe('sms');
37
+ });
38
+ it('createMany() should persist extended outbox entities', async () => {
39
+ const events = [
40
+ makeExtendedOutboxEvent({
41
+ type: 'extended.created',
42
+ createdAt: new Date(Date.now() - 60_000),
43
+ channel: 'sms',
44
+ }),
45
+ makeExtendedOutboxEvent({
46
+ type: 'extended.updated',
47
+ createdAt: new Date(Date.now() - 30_000),
48
+ channel: 'email',
49
+ }),
50
+ ];
51
+ await outboxWriter.createMany(events);
52
+ const rows = await testDataSource
53
+ .getRepository(ExtendedOutboxModel)
54
+ .find({ order: { type: 'ASC' } });
55
+ expect(rows).toHaveLength(2);
56
+ expect(rows[0].channel).toBe('sms');
57
+ expect(rows[1].channel).toBe('email');
58
+ });
59
+ it('update() should persist channel and status updates on extended entities', async () => {
60
+ const event = makeExtendedOutboxEvent({
61
+ type: 'extended.to-update',
62
+ channel: 'push',
63
+ });
64
+ await outboxWriter.create(event);
65
+ const created = await testDataSource
66
+ .getRepository(ExtendedOutboxModel)
67
+ .findOneByOrFail({ type: 'extended.to-update' });
68
+ created.status = OutboxStatus.PROCESSING;
69
+ created.attempts = 2;
70
+ created.channel = 'sms';
71
+ const toUpdate = makeExtendedOutboxEvent(created);
72
+ await outboxWriter.update(toUpdate);
73
+ const updated = await testDataSource
74
+ .getRepository(ExtendedOutboxModel)
75
+ .findOneByOrFail({ id: created.id });
76
+ expect(updated.status).toBe(OutboxStatus.PROCESSING);
77
+ expect(updated.attempts).toBe(2);
78
+ expect(updated.channel).toBe('sms');
79
+ });
80
+ it('delete() should remove an extended outbox entity', async () => {
81
+ const event = makeExtendedOutboxEvent({
82
+ type: 'extended.to-delete',
83
+ channel: 'sms',
84
+ });
85
+ await outboxWriter.create(event);
86
+ const created = await testDataSource
87
+ .getRepository(ExtendedOutboxModel)
88
+ .findOneByOrFail({ type: 'extended.to-delete' });
89
+ await outboxWriter.delete(created.id);
90
+ const deleted = await testDataSource
91
+ .getRepository(ExtendedOutboxModel)
92
+ .findOneBy({ id: created.id });
93
+ expect(deleted).toBeNull();
94
+ });
95
+ });
96
+ //# sourceMappingURL=outbox-extended.int.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbox-extended.int.spec.js","sourceRoot":"","sources":["../../../src/test/core/outbox-extended.int.spec.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ import { OutboxModel } from '../../outbox/models/outbox.model.js';
4
4
  import { InvalidOutboxSizeError } from '@volontariapp/errors';
5
5
  import { OutboxStatus } from '../../outbox/types/outbox.status.js';
6
6
  import { makeLoggerMock } from '../utils/helpers/logger-mock.helper.js';
7
+ import { makeQueryRunnerMock } from '../utils/helpers/query-runner-mock.helper.js';
7
8
  describe('OutboxConsumer (Unit)', () => {
8
9
  let consumer;
9
10
  let repositoryMock;
@@ -11,16 +12,19 @@ describe('OutboxConsumer (Unit)', () => {
11
12
  let loggerMock;
12
13
  beforeEach(() => {
13
14
  loggerMock = makeLoggerMock();
14
- queryRunnerMock = {
15
- query: jest.fn().mockResolvedValue([]),
16
- };
15
+ const mocks = makeQueryRunnerMock();
16
+ queryRunnerMock = mocks.queryRunnerMock;
17
17
  repositoryMock = {
18
18
  metadata: {
19
19
  target: OutboxModel,
20
20
  tableName: 'outbox',
21
21
  },
22
- executeInTransaction: jest.fn((work) => work(queryRunnerMock)),
23
- toEntities: jest.fn((models) => models),
22
+ executeInTransaction(work) {
23
+ return work(queryRunnerMock);
24
+ },
25
+ toEntities(models) {
26
+ return models;
27
+ },
24
28
  };
25
29
  consumer = new OutboxConsumer(loggerMock, repositoryMock, 10);
26
30
  });
@@ -32,9 +36,13 @@ describe('OutboxConsumer (Unit)', () => {
32
36
  });
33
37
  describe('fetchPendingItems', () => {
34
38
  it('should return empty array if no items found', async () => {
35
- queryRunnerMock.query.mockResolvedValueOnce([]);
39
+ const qb = queryRunnerMock.manager.createQueryBuilder();
40
+ const executeSpy = jest
41
+ .spyOn(qb, 'execute')
42
+ .mockResolvedValueOnce({ raw: [], generatedMaps: [], affected: 0 });
36
43
  const result = await consumer.fetchPendingItems();
37
44
  expect(result).toEqual([]);
45
+ expect(executeSpy).toHaveBeenCalled();
38
46
  });
39
47
  it('should fetch, mark as processing, and return items', async () => {
40
48
  const rawRows = [
@@ -57,14 +65,20 @@ describe('OutboxConsumer (Unit)', () => {
57
65
  updated_at: new Date(),
58
66
  },
59
67
  ];
60
- queryRunnerMock.query.mockResolvedValueOnce(rawRows);
68
+ const qb = queryRunnerMock.manager.createQueryBuilder();
69
+ const executeSpy = jest
70
+ .spyOn(qb, 'execute')
71
+ .mockResolvedValueOnce({ raw: rawRows, generatedMaps: [], affected: rawRows.length });
72
+ const updateSpy = jest.spyOn(qb, 'update');
73
+ const setSpy = jest.spyOn(qb, 'set');
74
+ const createQBSpy = jest.spyOn(queryRunnerMock.manager, 'createQueryBuilder');
61
75
  const result = await consumer.fetchPendingItems();
62
- expect(repositoryMock.executeInTransaction).toHaveBeenCalled();
63
- expect(queryRunnerMock.query).toHaveBeenCalledWith(expect.stringContaining('UPDATE'), [
64
- OutboxStatus.PROCESSING,
65
- OutboxStatus.PENDING,
66
- 10,
67
- ]);
76
+ expect(createQBSpy).toHaveBeenCalled();
77
+ expect(updateSpy).toHaveBeenCalled();
78
+ expect(setSpy).toHaveBeenCalledWith(expect.objectContaining({
79
+ status: OutboxStatus.PROCESSING,
80
+ }));
81
+ expect(executeSpy).toHaveBeenCalled();
68
82
  expect(result).toHaveLength(2);
69
83
  });
70
84
  });
@@ -1 +1 @@
1
- {"version":3,"file":"outbox.consumer.unit.spec.js","sourceRoot":"","sources":["../../../src/test/outbox/outbox.consumer.unit.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAEvE,OAAO,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAElE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAEnE,OAAO,EAAE,cAAc,EAAuB,MAAM,wCAAwC,CAAC;AAE7F,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,IAAI,QAAmD,CAAC;IACxD,IAAI,cAA8E,CAAC;IACnF,IAAI,eAAyC,CAAC;IAC9C,IAAI,UAA0B,CAAC;IAE/B,UAAU,CAAC,GAAG,EAAE;QACd,UAAU,GAAG,cAAc,EAAE,CAAC;QAC9B,eAAe,GAAG;YAChB,KAAK,EAAE,IAAI,CAAC,EAAE,EAA0B,CAAC,iBAAiB,CAAC,EAAE,CAAC;SACxB,CAAC;QAEzC,cAAc,GAAG;YACf,QAAQ,EAAE;gBACR,MAAM,EAAE,WAAW;gBACnB,SAAS,EAAE,QAAQ;aACpB;YACD,oBAAoB,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,IAA2C,EAAE,EAAE,CAC5E,IAAI,CAAC,eAAe,CAAC,CACtB;YACD,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAmC,CAAC;SACP,CAAC;QAE/E,QAAQ,GAAG,IAAI,cAAc,CAAC,UAAmB,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,cAAc,CAAC,UAAmB,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAC9E,sBAAsB,CACvB,CAAC;YACF,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,cAAc,CAAC,UAAmB,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAC/E,sBAAsB,CACvB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC3D,eAAe,CAAC,KAAK,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;YAChD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,iBAAiB,EAAE,CAAC;YAClD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;YAClE,MAAM,OAAO,GAAG;gBACd;oBACE,EAAE,EAAE,GAAG;oBACP,MAAM,EAAE,YAAY,CAAC,OAAO;oBAC5B,QAAQ,EAAE,CAAC;oBACX,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,MAAM;oBACf,UAAU,EAAE,IAAI,IAAI,EAAE;oBACtB,UAAU,EAAE,IAAI,IAAI,EAAE;iBACvB;gBACD;oBACE,EAAE,EAAE,GAAG;oBACP,MAAM,EAAE,YAAY,CAAC,OAAO;oBAC5B,QAAQ,EAAE,CAAC;oBACX,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,MAAM;oBACf,UAAU,EAAE,IAAI,IAAI,EAAE;oBACtB,UAAU,EAAE,IAAI,IAAI,EAAE;iBACvB;aACF,CAAC;YAEF,eAAe,CAAC,KAAK,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;YAErD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,iBAAiB,EAAE,CAAC;YAElD,MAAM,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC,gBAAgB,EAAE,CAAC;YAC/D,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE;gBACpF,YAAY,CAAC,UAAU;gBACvB,YAAY,CAAC,OAAO;gBACpB,EAAE;aACH,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"outbox.consumer.unit.spec.js","sourceRoot":"","sources":["../../../src/test/outbox/outbox.consumer.unit.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { QueryRunner } from 'typeorm';
2
+ export declare const makeQueryRunnerMock: () => {
3
+ queryRunnerMock: import("jest-mock").MockedObject<QueryRunner>;
4
+ queryBuilderMock: {
5
+ update(): any;
6
+ set(): any;
7
+ where(): any;
8
+ returning(): any;
9
+ execute(): Promise<{
10
+ raw: never[];
11
+ generatedMaps: never[];
12
+ affected: number;
13
+ }>;
14
+ };
15
+ };
16
+ //# sourceMappingURL=query-runner-mock.helper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-runner-mock.helper.d.ts","sourceRoot":"","sources":["../../../../src/test/utils/helpers/query-runner-mock.helper.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;CA4B/B,CAAC"}
@@ -0,0 +1,28 @@
1
+ export const makeQueryRunnerMock = () => {
2
+ const queryBuilderMock = {
3
+ update() {
4
+ return this;
5
+ },
6
+ set() {
7
+ return this;
8
+ },
9
+ where() {
10
+ return this;
11
+ },
12
+ returning() {
13
+ return this;
14
+ },
15
+ execute() {
16
+ return Promise.resolve({ raw: [], generatedMaps: [], affected: 0 });
17
+ },
18
+ };
19
+ const queryRunnerMock = {
20
+ manager: {
21
+ createQueryBuilder() {
22
+ return queryBuilderMock;
23
+ },
24
+ },
25
+ };
26
+ return { queryRunnerMock, queryBuilderMock };
27
+ };
28
+ //# sourceMappingURL=query-runner-mock.helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-runner-mock.helper.js","sourceRoot":"","sources":["../../../../src/test/utils/helpers/query-runner-mock.helper.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,EAAE;IACtC,MAAM,gBAAgB,GAAG;QACvB,MAAM;YACJ,OAAO,IAAI,CAAC;QACd,CAAC;QACD,GAAG;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QACD,SAAS;YACP,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO;YACL,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;QACtE,CAAC;KACF,CAAC;IAEF,MAAM,eAAe,GAAG;QACtB,OAAO,EAAE;YACP,kBAAkB;gBAChB,OAAO,gBAAgB,CAAC;YAC1B,CAAC;SACF;KACqC,CAAC;IAEzC,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,CAAC;AAC/C,CAAC,CAAC"}
@@ -1,8 +1,9 @@
1
1
  import type { Repository } from 'typeorm';
2
+ import type { Logger } from '@volontariapp/logger';
2
3
  import { OutboxWriter } from '../../../outbox/writers/outbox.writer.js';
3
4
  import { ExtendedOutboxEntity } from '../../example/entities/extended-outbox.entity.js';
4
5
  import { ExtendedOutboxModel } from '../../example/models/extended-outbox.model.js';
5
6
  export declare class TestExtendedOutboxWriter extends OutboxWriter<ExtendedOutboxModel, ExtendedOutboxEntity> {
6
- constructor(logger: unknown, repository: Repository<ExtendedOutboxModel>);
7
+ constructor(logger: Logger, repository: Repository<ExtendedOutboxModel>);
7
8
  }
8
9
  //# sourceMappingURL=outbox-extended-test.repository.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"outbox-extended-test.repository.d.ts","sourceRoot":"","sources":["../../../../src/test/utils/repositories/outbox-extended-test.repository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,OAAO,EAAE,YAAY,EAAE,MAAM,0CAA0C,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kDAAkD,CAAC;AACxF,OAAO,EAAE,mBAAmB,EAAE,MAAM,+CAA+C,CAAC;AAYpF,qBAAa,wBAAyB,SAAQ,YAAY,CACxD,mBAAmB,EACnB,oBAAoB,CACrB;gBACa,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC,mBAAmB,CAAC;CAGzE"}
1
+ {"version":3,"file":"outbox-extended-test.repository.d.ts","sourceRoot":"","sources":["../../../../src/test/utils/repositories/outbox-extended-test.repository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAE,MAAM,0CAA0C,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kDAAkD,CAAC;AACxF,OAAO,EAAE,mBAAmB,EAAE,MAAM,+CAA+C,CAAC;AAYpF,qBAAa,wBAAyB,SAAQ,YAAY,CACxD,mBAAmB,EACnB,oBAAoB,CACrB;gBACa,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,mBAAmB,CAAC;CAGxE"}
@@ -1 +1 @@
1
- {"version":3,"file":"outbox-extended-test.repository.js","sourceRoot":"","sources":["../../../../src/test/utils/repositories/outbox-extended-test.repository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,0CAA0C,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kDAAkD,CAAC;AACxF,OAAO,EAAE,mBAAmB,EAAE,MAAM,+CAA+C,CAAC;AAEpF,MAAM,4BAA6B,SAAQ,cAI1C;IACC,YAAY,UAA2C;QACrD,KAAK,CAAC,UAAU,EAAE,oBAAoB,EAAE,mBAAmB,CAAC,CAAC;IAC/D,CAAC;CACF;AAED,MAAM,OAAO,wBAAyB,SAAQ,YAG7C;IACC,YAAY,MAAe,EAAE,UAA2C;QACtE,KAAK,CAAC,MAAe,EAAE,IAAI,4BAA4B,CAAC,UAAU,CAAC,CAAC,CAAC;IACvE,CAAC;CACF"}
1
+ {"version":3,"file":"outbox-extended-test.repository.js","sourceRoot":"","sources":["../../../../src/test/utils/repositories/outbox-extended-test.repository.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,0CAA0C,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kDAAkD,CAAC;AACxF,OAAO,EAAE,mBAAmB,EAAE,MAAM,+CAA+C,CAAC;AAEpF,MAAM,4BAA6B,SAAQ,cAI1C;IACC,YAAY,UAA2C;QACrD,KAAK,CAAC,UAAU,EAAE,oBAAoB,EAAE,mBAAmB,CAAC,CAAC;IAC/D,CAAC;CACF;AAED,MAAM,OAAO,wBAAyB,SAAQ,YAG7C;IACC,YAAY,MAAc,EAAE,UAA2C;QACrE,KAAK,CAAC,MAAM,EAAE,IAAI,4BAA4B,CAAC,UAAU,CAAC,CAAC,CAAC;IAC9D,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@volontariapp/database",
3
- "version": "1.8.1-snap-06e37a9",
3
+ "version": "1.9.0-snap-eefb381",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "provenance": true
@@ -36,8 +36,8 @@
36
36
  "db:down": "docker-compose -f ../../docker-compose.test.yml down"
37
37
  },
38
38
  "dependencies": {
39
- "@volontariapp/bridge": "0.2.9-snap-06e37a9",
40
- "@volontariapp/errors": "0.5.0-snap-06e37a9",
39
+ "@volontariapp/bridge": "0.2.9",
40
+ "@volontariapp/errors": "0.5.0",
41
41
  "@volontariapp/logger": "0.2.3",
42
42
  "class-transformer": "^0.5.1",
43
43
  "class-validator": "^0.14.1",