@rkrkdldkd/example-event-sourcing 0.1.5 → 0.1.7

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 (68) hide show
  1. package/dist/app.module.js +2 -1
  2. package/dist/app.module.js.map +1 -1
  3. package/dist/common/constants.d.ts +1 -0
  4. package/dist/common/constants.js +2 -1
  5. package/dist/common/constants.js.map +1 -1
  6. package/dist/decorator/aggregate-event-repository.decorator.d.ts +3 -1
  7. package/dist/decorator/aggregate-event-repository.decorator.js +6 -4
  8. package/dist/decorator/aggregate-event-repository.decorator.js.map +1 -1
  9. package/dist/decorator/event.decorator.js +9 -4
  10. package/dist/decorator/event.decorator.js.map +1 -1
  11. package/dist/helper/metadata/get-aggregate-event-repository-metadata.d.ts +4 -0
  12. package/dist/helper/metadata/get-aggregate-event-repository-metadata.js +10 -0
  13. package/dist/helper/metadata/get-aggregate-event-repository-metadata.js.map +1 -0
  14. package/dist/helper/metadata/index.d.ts +1 -0
  15. package/dist/helper/metadata/index.js +1 -0
  16. package/dist/helper/metadata/index.js.map +1 -1
  17. package/dist/interface/aggregate/aggregate-event-repository-metadata.interface.d.ts +5 -0
  18. package/dist/interface/aggregate/aggregate-event-repository-metadata.interface.js +3 -0
  19. package/dist/interface/aggregate/aggregate-event-repository-metadata.interface.js.map +1 -0
  20. package/dist/interface/aggregate/index.d.ts +1 -0
  21. package/dist/interface/aggregate/index.js +1 -0
  22. package/dist/interface/aggregate/index.js.map +1 -1
  23. package/dist/interface/event/event-filter.interface.d.ts +6 -0
  24. package/dist/interface/{postgres-event-store-config.js → event/event-filter.interface.js} +1 -1
  25. package/dist/interface/event/event-filter.interface.js.map +1 -0
  26. package/dist/interface/event/index.d.ts +1 -0
  27. package/dist/interface/event/index.js +1 -0
  28. package/dist/interface/event/index.js.map +1 -1
  29. package/dist/interface/index.d.ts +0 -2
  30. package/dist/interface/index.js +0 -2
  31. package/dist/interface/index.js.map +1 -1
  32. package/dist/main.js +5 -0
  33. package/dist/main.js.map +1 -1
  34. package/dist/model/db/db.connection.d.ts +2 -1
  35. package/dist/model/db/db.connection.js +20 -0
  36. package/dist/model/db/db.connection.js.map +1 -1
  37. package/dist/model/db/event-sourcing.repository.d.ts +7 -2
  38. package/dist/model/db/event-sourcing.repository.js +74 -1
  39. package/dist/model/db/event-sourcing.repository.js.map +1 -1
  40. package/dist/model/db/event-store.entity.d.ts +16 -0
  41. package/dist/model/db/event-store.entity.js +34 -0
  42. package/dist/model/db/event-store.entity.js.map +1 -0
  43. package/dist/model/db/event-store.repository.d.ts +7 -0
  44. package/dist/model/db/event-store.repository.js +44 -0
  45. package/dist/model/db/event-store.repository.js.map +1 -1
  46. package/dist/model/db/event.registry.d.ts +7 -0
  47. package/dist/model/db/event.registry.js +14 -0
  48. package/dist/model/db/event.registry.js.map +1 -0
  49. package/dist/model/db/index.d.ts +3 -0
  50. package/dist/model/db/index.js +3 -0
  51. package/dist/model/db/index.js.map +1 -1
  52. package/dist/model/db/raw-event-store.interface.d.ts +14 -0
  53. package/dist/{interface/postgres-snapshot-store-config.js → model/db/raw-event-store.interface.js} +1 -1
  54. package/dist/model/db/raw-event-store.interface.js.map +1 -0
  55. package/dist/model/db/snapshot.entity.d.ts +2 -0
  56. package/dist/model/db/snapshot.entity.js +5 -0
  57. package/dist/model/db/snapshot.entity.js.map +1 -1
  58. package/dist/model/db/snapshot.repository.js +4 -2
  59. package/dist/model/db/snapshot.repository.js.map +1 -1
  60. package/dist/temp.event-store.d.ts +6 -13
  61. package/dist/temp.event-store.js +22 -33
  62. package/dist/temp.event-store.js.map +1 -1
  63. package/dist/tsconfig.build.tsbuildinfo +1 -1
  64. package/package.json +3 -1
  65. package/dist/interface/postgres-event-store-config.d.ts +0 -6
  66. package/dist/interface/postgres-event-store-config.js.map +0 -1
  67. package/dist/interface/postgres-snapshot-store-config.d.ts +0 -7
  68. package/dist/interface/postgres-snapshot-store-config.js.map +0 -1
@@ -11,6 +11,7 @@ const common_1 = require("@nestjs/common");
11
11
  const event_sourcing_module_1 = require("./event-sourcing.module");
12
12
  const app_controller_1 = require("./app.controller");
13
13
  const app_service_1 = require("./app.service");
14
+ const temp_event_store_1 = require("./temp.event-store");
14
15
  let AppModule = class AppModule {
15
16
  };
16
17
  exports.AppModule = AppModule;
@@ -26,7 +27,7 @@ exports.AppModule = AppModule = __decorate([
26
27
  }),
27
28
  ],
28
29
  controllers: [app_controller_1.AppController],
29
- providers: [app_service_1.AppService],
30
+ providers: [app_service_1.AppService, temp_event_store_1.AA],
30
31
  })
31
32
  ], AppModule);
32
33
  //# sourceMappingURL=app.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"app.module.js","sourceRoot":"","sources":["../src/app.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,mEAAgE;AAChE,qDAAiD;AACjD,+CAA2C;AAepC,IAAM,SAAS,GAAf,MAAM,SAAS;CAAG,CAAA;AAAZ,8BAAS;oBAAT,SAAS;IAbrB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,2CAAmB,CAAC,YAAY,CAAC;gBAC/B,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,IAAI;gBACV,IAAI,EAAE,UAAU;gBAChB,QAAQ,EAAE,UAAU;gBACpB,QAAQ,EAAE,UAAU;aACrB,CAAC;SACH;QACD,WAAW,EAAE,CAAC,8BAAa,CAAC;QAC5B,SAAS,EAAE,CAAC,wBAAU,CAAC;KACxB,CAAC;GACW,SAAS,CAAG"}
1
+ {"version":3,"file":"app.module.js","sourceRoot":"","sources":["../src/app.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,mEAAgE;AAChE,qDAAiD;AACjD,+CAA2C;AAC3C,yDAAwC;AAejC,IAAM,SAAS,GAAf,MAAM,SAAS;CAAG,CAAA;AAAZ,8BAAS;oBAAT,SAAS;IAbrB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,2CAAmB,CAAC,YAAY,CAAC;gBAC/B,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,IAAI;gBACV,IAAI,EAAE,UAAU;gBAChB,QAAQ,EAAE,UAAU;gBACpB,QAAQ,EAAE,UAAU;aACrB,CAAC;SACH;QACD,WAAW,EAAE,CAAC,8BAAa,CAAC;QAC5B,SAAS,EAAE,CAAC,wBAAU,EAAE,qBAAE,CAAC;KAC5B,CAAC;GACW,SAAS,CAAG"}
@@ -1,4 +1,5 @@
1
1
  export declare const EVENT_SOURCING_OPTIONS: unique symbol;
2
+ export declare const DEFAULT_BATCH_SIZE = 100;
2
3
  export declare const AGGREGATE_METADATA = "AGGREGATE_METADATA";
3
4
  export declare const COMMAND_HANDLER_METADATA = "COMMAND_HANDLER_METADATA";
4
5
  export declare const COMMAND_METADATA = "COMMAND_METADATA";
@@ -1,7 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AGGREGATE_EVENT_REPOSITORY_METADATA = exports.SNAPSHOT_METADATA = exports.QUERY_METADATA = exports.QUERY_HANDLER_METADATA = exports.EVENT_SUBSCRIBER_METADATA = exports.EVENT_SERIALIZER_METADATA = exports.EVENT_PUBLISHER_METADATA = exports.EVENT_HANDLER_METADATA = exports.EVENT_METADATA = exports.COMMAND_METADATA = exports.COMMAND_HANDLER_METADATA = exports.AGGREGATE_METADATA = exports.EVENT_SOURCING_OPTIONS = void 0;
3
+ exports.AGGREGATE_EVENT_REPOSITORY_METADATA = exports.SNAPSHOT_METADATA = exports.QUERY_METADATA = exports.QUERY_HANDLER_METADATA = exports.EVENT_SUBSCRIBER_METADATA = exports.EVENT_SERIALIZER_METADATA = exports.EVENT_PUBLISHER_METADATA = exports.EVENT_HANDLER_METADATA = exports.EVENT_METADATA = exports.COMMAND_METADATA = exports.COMMAND_HANDLER_METADATA = exports.AGGREGATE_METADATA = exports.DEFAULT_BATCH_SIZE = exports.EVENT_SOURCING_OPTIONS = void 0;
4
4
  exports.EVENT_SOURCING_OPTIONS = Symbol();
5
+ exports.DEFAULT_BATCH_SIZE = 100;
5
6
  exports.AGGREGATE_METADATA = 'AGGREGATE_METADATA';
6
7
  exports.COMMAND_HANDLER_METADATA = 'COMMAND_HANDLER_METADATA';
7
8
  exports.COMMAND_METADATA = 'COMMAND_METADATA';
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/common/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,sBAAsB,GAAG,MAAM,EAAE,CAAC;AAElC,QAAA,kBAAkB,GAAG,oBAAoB,CAAC;AAC1C,QAAA,wBAAwB,GAAG,0BAA0B,CAAC;AACtD,QAAA,gBAAgB,GAAG,kBAAkB,CAAC;AACtC,QAAA,cAAc,GAAG,gBAAgB,CAAC;AAClC,QAAA,sBAAsB,GAAG,wBAAwB,CAAC;AAClD,QAAA,wBAAwB,GAAG,0BAA0B,CAAC;AACtD,QAAA,yBAAyB,GAAG,2BAA2B,CAAC;AACxD,QAAA,yBAAyB,GAAG,2BAA2B,CAAC;AACxD,QAAA,sBAAsB,GAAG,wBAAwB,CAAC;AAClD,QAAA,cAAc,GAAG,gBAAgB,CAAC;AAClC,QAAA,iBAAiB,GAAG,mBAAmB,CAAC;AAExC,QAAA,mCAAmC,GAC9C,qCAAqC,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/common/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,sBAAsB,GAAG,MAAM,EAAE,CAAC;AAElC,QAAA,kBAAkB,GAAG,GAAG,CAAC;AAEzB,QAAA,kBAAkB,GAAG,oBAAoB,CAAC;AAC1C,QAAA,wBAAwB,GAAG,0BAA0B,CAAC;AACtD,QAAA,gBAAgB,GAAG,kBAAkB,CAAC;AACtC,QAAA,cAAc,GAAG,gBAAgB,CAAC;AAClC,QAAA,sBAAsB,GAAG,wBAAwB,CAAC;AAClD,QAAA,wBAAwB,GAAG,0BAA0B,CAAC;AACtD,QAAA,yBAAyB,GAAG,2BAA2B,CAAC;AACxD,QAAA,yBAAyB,GAAG,2BAA2B,CAAC;AACxD,QAAA,sBAAsB,GAAG,wBAAwB,CAAC;AAClD,QAAA,cAAc,GAAG,gBAAgB,CAAC;AAClC,QAAA,iBAAiB,GAAG,mBAAmB,CAAC;AAExC,QAAA,mCAAmC,GAC9C,qCAAqC,CAAC"}
@@ -1 +1,3 @@
1
- export declare const AggregateEventRepository: (name2: string) => ClassDecorator;
1
+ import { ClassConstructor } from '@smiledragon-corp/app-common/types';
2
+ import { AggregateRoot } from 'src/model/aggregate.root';
3
+ export declare const AggregateEventRepository: (aggregate: ClassConstructor<AggregateRoot>) => ClassDecorator;
@@ -1,12 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AggregateEventRepository = void 0;
4
+ const class_validator_1 = require("class-validator");
4
5
  const constants_1 = require("../common/constants");
5
- const AggregateEventRepository = (name2) => {
6
+ const AggregateEventRepository = (aggregate) => {
6
7
  return (target) => {
7
- console.log(name2);
8
- const { name } = target;
9
- Reflect.defineMetadata(constants_1.AGGREGATE_EVENT_REPOSITORY_METADATA, name, target);
8
+ if (!(0, class_validator_1.isDefined)(aggregate)) {
9
+ throw new Error('AggregateEventRepository requires an aggregate constructor.');
10
+ }
11
+ Reflect.defineMetadata(constants_1.AGGREGATE_EVENT_REPOSITORY_METADATA, { aggregate }, target);
10
12
  };
11
13
  };
12
14
  exports.AggregateEventRepository = AggregateEventRepository;
@@ -1 +1 @@
1
- {"version":3,"file":"aggregate-event-repository.decorator.js","sourceRoot":"","sources":["../../src/decorator/aggregate-event-repository.decorator.ts"],"names":[],"mappings":";;;AAAA,mDAA2E;AAIpE,MAAM,wBAAwB,GAAG,CAAC,KAAa,EAAkB,EAAE;IACxE,OAAO,CAAC,MAAc,EAAE,EAAE;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAyC,CAAC;QAE3D,OAAO,CAAC,cAAc,CAAC,+CAAmC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5E,CAAC,CAAC;AACJ,CAAC,CAAC;AAPW,QAAA,wBAAwB,4BAOnC"}
1
+ {"version":3,"file":"aggregate-event-repository.decorator.js","sourceRoot":"","sources":["../../src/decorator/aggregate-event-repository.decorator.ts"],"names":[],"mappings":";;;AACA,qDAA4C;AAC5C,mDAA2E;AAGpE,MAAM,wBAAwB,GAAG,CACtC,SAA0C,EAC1B,EAAE;IAClB,OAAO,CAAC,MAAc,EAAE,EAAE;QACxB,IAAI,CAAC,IAAA,2BAAS,EAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CACb,6DAA6D,CAC9D,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,cAAc,CACpB,+CAAmC,EACnC,EAAE,SAAS,EAAE,EACb,MAAM,CACP,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC,CAAC;AAhBW,QAAA,wBAAwB,4BAgBnC"}
@@ -3,13 +3,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Event = void 0;
4
4
  require("reflect-metadata");
5
5
  const constants_1 = require("../common/constants");
6
+ const event_registry_1 = require("../model/db/event.registry");
6
7
  const Event = (name) => {
7
8
  return (target) => {
8
- const eventName = target.name;
9
- if (eventName.length > 80) {
10
- throw new Error(`Event name '${eventName}' exceeds the maximum length of 80 characters.`);
9
+ const metadata = {
10
+ name: name ?? target.name,
11
+ eventClass: target,
12
+ };
13
+ if (metadata.name.length > 80) {
14
+ throw new Error(`Event name '${metadata.name}' exceeds the maximum length of 80 characters.`);
11
15
  }
12
- Reflect.defineMetadata(constants_1.EVENT_METADATA, { name: eventName }, target);
16
+ event_registry_1.EventRegistry.register(metadata.name, metadata.eventClass);
17
+ Reflect.defineMetadata(constants_1.EVENT_METADATA, metadata, target);
13
18
  };
14
19
  };
15
20
  exports.Event = Event;
@@ -1 +1 @@
1
- {"version":3,"file":"event.decorator.js","sourceRoot":"","sources":["../../src/decorator/event.decorator.ts"],"names":[],"mappings":";;;AAAA,4BAA0B;AAC1B,mDAAsD;AAgB/C,MAAM,KAAK,GAAG,CAAC,IAAa,EAAkB,EAAE;IACrD,OAAO,CAAC,MAAc,EAAE,EAAE;QACxB,MAAM,SAAS,GAAI,MAAmC,CAAC,IAAI,CAAC;QAC5D,IAAI,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CACb,eAAe,SAAS,gDAAgD,CACzE,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,cAAc,CAAC,0BAAc,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;IACtE,CAAC,CAAC;AACJ,CAAC,CAAC;AAXW,QAAA,KAAK,SAWhB"}
1
+ {"version":3,"file":"event.decorator.js","sourceRoot":"","sources":["../../src/decorator/event.decorator.ts"],"names":[],"mappings":";;;AAAA,4BAA0B;AAC1B,mDAAsD;AAGtD,+DAA4D;AAcrD,MAAM,KAAK,GAAG,CAAC,IAAa,EAAkB,EAAE;IACrD,OAAO,CAAC,MAAc,EAAE,EAAE;QACxB,MAAM,QAAQ,GAAG;YACf,IAAI,EAAE,IAAI,IAAK,MAAmC,CAAC,IAAI;YACvD,UAAU,EAAE,MAAkC;SAC/C,CAAC;QAEF,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CACb,eAAe,QAAQ,CAAC,IAAI,gDAAgD,CAC7E,CAAC;QACJ,CAAC;QAED,8BAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;QAE3D,OAAO,CAAC,cAAc,CAAC,0BAAc,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC3D,CAAC,CAAC;AACJ,CAAC,CAAC;AAjBW,QAAA,KAAK,SAiBhB"}
@@ -0,0 +1,4 @@
1
+ import { ClassConstructor } from '@smiledragon-corp/app-common/types';
2
+ import { AggregateEventRepositoryMetadata } from 'src/interface/aggregate/aggregate-event-repository-metadata.interface';
3
+ import { AggregateRoot, EventSourcingRepository } from 'src/model';
4
+ export declare const getAggregateEventRepositoryMetadata: (cls: ClassConstructor<EventSourcingRepository<AggregateRoot>>) => AggregateEventRepositoryMetadata | undefined;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getAggregateEventRepositoryMetadata = void 0;
4
+ const constants_1 = require("../../common/constants");
5
+ const assume_metadata_type_1 = require("./assume-metadata-type");
6
+ const getAggregateEventRepositoryMetadata = (cls) => {
7
+ return (0, assume_metadata_type_1.ensureMetadata)(Reflect.getMetadata(constants_1.AGGREGATE_EVENT_REPOSITORY_METADATA, cls));
8
+ };
9
+ exports.getAggregateEventRepositoryMetadata = getAggregateEventRepositoryMetadata;
10
+ //# sourceMappingURL=get-aggregate-event-repository-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-aggregate-event-repository-metadata.js","sourceRoot":"","sources":["../../../src/helper/metadata/get-aggregate-event-repository-metadata.ts"],"names":[],"mappings":";;;AACA,sDAA2E;AAC3E,iEAA0E;AAInE,MAAM,mCAAmC,GAAG,CACjD,GAA6D,EACf,EAAE;IAChD,OAAO,IAAA,qCAAc,EACnB,OAAO,CAAC,WAAW,CAAC,+CAAmC,EAAE,GAAG,CAAC,CAC9D,CAAC;AACJ,CAAC,CAAC;AANW,QAAA,mCAAmC,uCAM9C"}
@@ -1,4 +1,5 @@
1
1
  export * from './assume-metadata-type';
2
+ export * from './get-aggregate-event-repository-metadata';
2
3
  export * from './get-aggregate-metadata';
3
4
  export * from './get-event-handler-metadata';
4
5
  export * from './get-event-metadata';
@@ -15,6 +15,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./assume-metadata-type"), exports);
18
+ __exportStar(require("./get-aggregate-event-repository-metadata"), exports);
18
19
  __exportStar(require("./get-aggregate-metadata"), exports);
19
20
  __exportStar(require("./get-event-handler-metadata"), exports);
20
21
  __exportStar(require("./get-event-metadata"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/helper/metadata/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yDAAuC;AACvC,2DAAyC;AACzC,+DAA6C;AAC7C,uDAAqC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/helper/metadata/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yDAAuC;AACvC,4EAA0D;AAC1D,2DAAyC;AACzC,+DAA6C;AAC7C,uDAAqC"}
@@ -0,0 +1,5 @@
1
+ import { ClassConstructor } from 'src/interface/class-constructor.type';
2
+ import { AggregateRoot } from 'src/model/aggregate.root';
3
+ export interface AggregateEventRepositoryMetadata {
4
+ aggregate: ClassConstructor<AggregateRoot>;
5
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=aggregate-event-repository-metadata.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregate-event-repository-metadata.interface.js","sourceRoot":"","sources":["../../../src/interface/aggregate/aggregate-event-repository-metadata.interface.ts"],"names":[],"mappings":""}
@@ -1,2 +1,3 @@
1
1
  export * from './aggregate-metadata.interface';
2
+ export * from './aggregate-event-repository-metadata.interface';
2
3
  export * from './event-handler-method.type';
@@ -15,5 +15,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./aggregate-metadata.interface"), exports);
18
+ __exportStar(require("./aggregate-event-repository-metadata.interface"), exports);
18
19
  __exportStar(require("./event-handler-method.type"), exports);
19
20
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/interface/aggregate/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iEAA+C;AAC/C,8DAA4C"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/interface/aggregate/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iEAA+C;AAC/C,kFAAgE;AAChE,8DAA4C"}
@@ -0,0 +1,6 @@
1
+ export interface IEventFilter {
2
+ fromVersion?: number;
3
+ direction: 'DESC' | 'ASC';
4
+ limit?: number;
5
+ batch?: number;
6
+ }
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=postgres-event-store-config.js.map
3
+ //# sourceMappingURL=event-filter.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-filter.interface.js","sourceRoot":"","sources":["../../../src/interface/event/event-filter.interface.ts"],"names":[],"mappings":""}
@@ -1,4 +1,5 @@
1
1
  export * from './event-envelope-metadata.interface';
2
+ export * from './event-filter.interface';
2
3
  export * from './event-handler-metadata.interface';
3
4
  export * from './event-metadata.interface';
4
5
  export * from './event-publisher.interface';
@@ -15,6 +15,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./event-envelope-metadata.interface"), exports);
18
+ __exportStar(require("./event-filter.interface"), exports);
18
19
  __exportStar(require("./event-handler-metadata.interface"), exports);
19
20
  __exportStar(require("./event-metadata.interface"), exports);
20
21
  __exportStar(require("./event-publisher.interface"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/interface/event/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sEAAoD;AACpD,qEAAmD;AACnD,6DAA2C;AAC3C,8DAA4C;AAC5C,oDAAkC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/interface/event/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sEAAoD;AACpD,2DAAyC;AACzC,qEAAmD;AACnD,6DAA2C;AAC3C,8DAA4C;AAC5C,oDAAkC"}
@@ -1,6 +1,4 @@
1
1
  export * from './aggregate/index';
2
2
  export * from './class-constructor.type';
3
3
  export * from './event/index';
4
- export * from './postgres-event-store-config';
5
4
  export * from './postgres-event.entity';
6
- export * from './postgres-snapshot-store-config';
@@ -17,7 +17,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./aggregate/index"), exports);
18
18
  __exportStar(require("./class-constructor.type"), exports);
19
19
  __exportStar(require("./event/index"), exports);
20
- __exportStar(require("./postgres-event-store-config"), exports);
21
20
  __exportStar(require("./postgres-event.entity"), exports);
22
- __exportStar(require("./postgres-snapshot-store-config"), exports);
23
21
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/interface/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,2DAAyC;AACzC,gDAA8B;AAC9B,gEAA8C;AAC9C,0DAAwC;AACxC,mEAAiD"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/interface/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,2DAAyC;AACzC,gDAA8B;AAC9B,0DAAwC"}
package/dist/main.js CHANGED
@@ -1,10 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const core_1 = require("@nestjs/core");
4
+ const time_uuid_1 = require("@smiledragon-corp/time-uuid");
4
5
  const app_module_1 = require("./app.module");
6
+ const temp_event_store_1 = require("./temp.event-store");
5
7
  async function bootstrap() {
6
8
  const app = await core_1.NestFactory.create(app_module_1.AppModule);
7
9
  await app.listen(process.env.PORT ?? 3000);
10
+ const repo = app.get(temp_event_store_1.AA);
11
+ const a = await repo.getOneAggregate(time_uuid_1.TimeUUID.parse('019b6359-125a-7718-bdcf-8ebac31313d1'));
12
+ console.log(a);
8
13
  }
9
14
  bootstrap();
10
15
  //# sourceMappingURL=main.js.map
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";;AAAA,uCAA2C;AAC3C,6CAAyC;AAEzC,KAAK,UAAU,SAAS;IACtB,MAAM,GAAG,GAAG,MAAM,kBAAW,CAAC,MAAM,CAAC,sBAAS,CAAC,CAAC;IAChD,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";;AAAA,uCAA2C;AAC3C,2DAAuD;AACvD,6CAAyC;AACzC,yDAAwC;AAExC,KAAK,UAAU,SAAS;IACtB,MAAM,GAAG,GAAG,MAAM,kBAAW,CAAC,MAAM,CAAC,sBAAS,CAAC,CAAC;IAChD,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;IAE3C,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,qBAAE,CAAC,CAAC;IAEzB,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,eAAe,CAClC,oBAAQ,CAAC,KAAK,CAAC,sCAAsC,CAAC,CACvD,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC;AAED,SAAS,EAAE,CAAC"}
@@ -1,4 +1,4 @@
1
- import { PoolClient, QueryConfig, QueryConfigValues, QueryResult, QueryResultRow } from 'pg';
1
+ import { PoolClient, QueryConfig, QueryConfigValues, QueryResult, QueryResultRow, Submittable } from 'pg';
2
2
  export declare class DbConnection {
3
3
  private connection;
4
4
  private readonly logger;
@@ -8,4 +8,5 @@ export declare class DbConnection {
8
8
  rollback(): Promise<void>;
9
9
  release(): void;
10
10
  query<R extends QueryResultRow = any, I = any[]>(queryTextOrConfig: string | QueryConfig<I>, values?: QueryConfigValues<I>): Promise<QueryResult<R>>;
11
+ queryWithCursor<T extends Submittable>(queryStream: T): T;
11
12
  }
@@ -47,6 +47,26 @@ class DbConnection {
47
47
  throw error;
48
48
  }
49
49
  }
50
+ queryWithCursor(queryStream) {
51
+ const start = Date.now();
52
+ const text = queryStream.text;
53
+ const params = queryStream.values;
54
+ const paramsText = params === undefined ? '' : ` [params: ${JSON.stringify(params)}]`;
55
+ const cursor = this.connection.query(queryStream);
56
+ if (typeof cursor.on === 'function') {
57
+ cursor.on('end', (result) => {
58
+ const ms = Date.now() - start;
59
+ const rowsText = result?.rowCount === undefined ? '' : ` [rows ${result.rowCount}]`;
60
+ this.logger.log(`[cursor] ${text ?? '[unknown]'}${paramsText}${rowsText} [took ${ms} ms]`);
61
+ });
62
+ cursor.on('error', (error) => {
63
+ const ms = Date.now() - start;
64
+ const message = error?.message ?? 'unknown error';
65
+ this.logger.error(`[cursor] ${text ?? '[unknown]'}${paramsText} [took ${ms} ms] error=${message}`);
66
+ });
67
+ }
68
+ return cursor;
69
+ }
50
70
  }
51
71
  exports.DbConnection = DbConnection;
52
72
  //# sourceMappingURL=db.connection.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"db.connection.js","sourceRoot":"","sources":["../../../src/model/db/db.connection.ts"],"names":[],"mappings":";;;AAQA,uEAAiE;AAEjE,MAAa,YAAY;IACf,UAAU,CAAa;IACd,MAAM,GAAkB,IAAI,8BAAa,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAE9E,YAAY,UAAsB;QAChC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,MAAM;QACV,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO;QACL,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,KAAK,CACT,iBAA0C,EAC1C,MAA6B;QAE7B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,IAAI,GACR,OAAO,iBAAiB,KAAK,QAAQ;YACnC,CAAC,CAAC,iBAAiB;YACnB,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC;QAE7B,MAAM,MAAM,GACV,MAAM;YACN,CAAC,OAAO,iBAAiB,KAAK,QAAQ;gBACpC,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAEhC,MAAM,UAAU,GACd,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC;QAErE,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CACxC,iBAAiB,EACjB,MAAM,CACP,CAAC;YACF,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;YAC9B,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,WAAW,IAAI,IAAI,WAAW,GAAG,UAAU,UAAU,EAAE,MAAM,CAC9D,CAAC;YACF,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;YAC9B,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACzE,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,WAAW,IAAI,IAAI,WAAW,GAAG,UAAU,UAAU,EAAE,cAAc,OAAO,EAAE,CAC/E,CAAC;YACF,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF;AAlED,oCAkEC"}
1
+ {"version":3,"file":"db.connection.js","sourceRoot":"","sources":["../../../src/model/db/db.connection.ts"],"names":[],"mappings":"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"}
@@ -1,19 +1,24 @@
1
+ import { TimeUUID } from '@smiledragon-corp/time-uuid';
1
2
  import { AggregateRoot } from '../aggregate.root';
2
3
  import { EventEnvelope } from '../event-envelope';
3
4
  import { DbClient } from './db.client';
4
5
  import { DbConnection } from './db.connection';
5
6
  import { EventStoreRepository } from './event-store.repository';
6
7
  import { SnapshotRepository } from './snapshot.repository';
7
- export declare class EventSourcingRepository {
8
+ export declare abstract class EventSourcingRepository<T extends AggregateRoot> {
8
9
  private readonly dbClient;
9
10
  private readonly eventStoreRepository;
10
11
  private readonly snapshotRepository;
11
12
  constructor(dbClient: DbClient, eventStoreRepository: EventStoreRepository, snapshotRepository: SnapshotRepository);
12
- getById(): Promise<void>;
13
+ getOneAggregate(pk: TimeUUID): Promise<T | undefined>;
13
14
  getEnvelope({ aggregate, version, connection, }: {
14
15
  aggregate: string;
15
16
  version: number;
16
17
  connection: DbConnection;
17
18
  }): Promise<EventEnvelope>;
18
19
  save(aggregate: AggregateRoot): Promise<void>;
20
+ private getLatestSnapshot;
21
+ private parsePayload;
22
+ private getTableNames;
23
+ private getRepositoryMetadata;
19
24
  }
@@ -15,9 +15,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.EventSourcingRepository = void 0;
16
16
  const common_1 = require("@nestjs/common");
17
17
  const time_uuid_1 = require("@smiledragon-corp/time-uuid");
18
+ const get_aggregate_event_repository_metadata_1 = require("../../helper/metadata/get-aggregate-event-repository-metadata");
18
19
  const event_envelope_1 = require("../event-envelope");
19
20
  const db_client_1 = require("./db.client");
20
21
  const event_store_repository_1 = require("./event-store.repository");
22
+ const snapshot_entity_1 = require("./snapshot.entity");
21
23
  const snapshot_repository_1 = require("./snapshot.repository");
22
24
  let EventSourcingRepository = class EventSourcingRepository {
23
25
  dbClient;
@@ -28,7 +30,45 @@ let EventSourcingRepository = class EventSourcingRepository {
28
30
  this.eventStoreRepository = eventStoreRepository;
29
31
  this.snapshotRepository = snapshotRepository;
30
32
  }
31
- async getById() { }
33
+ async getOneAggregate(pk) {
34
+ const metadata = this.getRepositoryMetadata();
35
+ const aggregateClass = metadata.aggregate;
36
+ const { eventStoreTableName } = this.getTableNames(aggregateClass.name);
37
+ const aggregateName = aggregateClass.name;
38
+ const streamId = `${aggregateName}:${pk.toString()}`;
39
+ const connection = await this.dbClient.getConnection();
40
+ try {
41
+ let aggregate = new aggregateClass();
42
+ const snapshot = await this.getLatestSnapshot({
43
+ aggregateName,
44
+ streamId,
45
+ connection,
46
+ });
47
+ if (snapshot) {
48
+ const snapshotEntity = snapshot_entity_1.SnapshotEntity.FromRaw(snapshot);
49
+ aggregate = snapshotEntity.toDomain(aggregateClass);
50
+ aggregate.version = snapshotEntity.version;
51
+ }
52
+ const fromVersion = snapshot?.version ?? 0;
53
+ const cursor = this.eventStoreRepository.getEvents({
54
+ tableName: eventStoreTableName,
55
+ streamId,
56
+ connection,
57
+ filter: {
58
+ fromVersion: fromVersion + 1,
59
+ direction: 'ASC',
60
+ },
61
+ });
62
+ await aggregate.loadFromHistory(cursor);
63
+ if (aggregate.version < 1) {
64
+ return undefined;
65
+ }
66
+ return aggregate;
67
+ }
68
+ finally {
69
+ connection.release();
70
+ }
71
+ }
32
72
  async getEnvelope({ aggregate, version, connection, }) {
33
73
  const { rows: entities } = await connection.query(`SELECT event, payload, event_id, aggregate_id, version, occurred_on, correlation_id, causation_id
34
74
  FROM "${aggregate}_event"
@@ -70,6 +110,39 @@ let EventSourcingRepository = class EventSourcingRepository {
70
110
  connection.release();
71
111
  }
72
112
  }
113
+ async getLatestSnapshot({ aggregateName, streamId, connection, }) {
114
+ const { snapshotTableName } = this.getTableNames(aggregateName);
115
+ const { rows: snapshots } = await connection.query(`SELECT *
116
+ FROM "${snapshotTableName}"
117
+ WHERE stream_id = $1
118
+ ORDER BY version DESC
119
+ LIMIT 1`, [streamId]);
120
+ return snapshots[0];
121
+ }
122
+ parsePayload(payload) {
123
+ if (typeof payload !== 'string') {
124
+ return payload;
125
+ }
126
+ try {
127
+ return JSON.parse(payload);
128
+ }
129
+ catch {
130
+ return { value: payload };
131
+ }
132
+ }
133
+ getTableNames(aggregateName) {
134
+ return {
135
+ eventStoreTableName: `${aggregateName}_event`,
136
+ snapshotTableName: `${aggregateName}_snapshot`,
137
+ };
138
+ }
139
+ getRepositoryMetadata() {
140
+ const metadata = (0, get_aggregate_event_repository_metadata_1.getAggregateEventRepositoryMetadata)(this.constructor);
141
+ if (!metadata) {
142
+ throw new Error('Missing @AggregateEventRepository metadata on repository.');
143
+ }
144
+ return metadata;
145
+ }
73
146
  };
74
147
  exports.EventSourcingRepository = EventSourcingRepository;
75
148
  exports.EventSourcingRepository = EventSourcingRepository = __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"event-sourcing.repository.js","sourceRoot":"","sources":["../../../src/model/db/event-sourcing.repository.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAwC;AACxC,2DAAuD;AAGvD,sDAAkD;AAClD,2CAAuC;AAEvC,qEAAgE;AAChE,+DAA2D;AAE3D,IAAa,uBAAuB,GAApC,MAAa,uBAAuB;IAGf;IACA;IACA;IAJnB,YAEmB,QAAkB,EAClB,oBAA0C,EAC1C,kBAAsC;QAFtC,aAAQ,GAAR,QAAQ,CAAU;QAClB,yBAAoB,GAApB,oBAAoB,CAAsB;QAC1C,uBAAkB,GAAlB,kBAAkB,CAAoB;IACtD,CAAC;IAEJ,KAAK,CAAC,OAAO,KAAI,CAAC;IAElB,KAAK,CAAC,WAAW,CAAC,EAChB,SAAS,EACT,OAAO,EACP,UAAU,GAKX;QACC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,UAAU,CAAC,KAAK,CAa/C;gBACU,SAAS;2BACE,EACrB,CAAC,OAAO,CAAC,CACV,CAAC;QAEF,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAE3B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,sBAAsB,OAAO,YAAY,CAAC,CAAC;QAC7D,CAAC;QAED,OAAO,8BAAa,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE;YACtD,OAAO,EAAE,oBAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;YACxC,WAAW,EAAE,MAAM,CAAC,YAAY;YAChC,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,UAAU,EAAE,MAAM,CAAC,WAAW;YAC9B,aAAa,EAAE,MAAM,CAAC,cAAc,IAAI,SAAS;YACjD,WAAW,EAAE,MAAM,CAAC,YAAY,IAAI,SAAS;SAC9C,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAwB;QACjC,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;QAElC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QAEvD,IAAI,CAAC;YACH,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC;YAEzB,MAAM,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;gBACnC,SAAS;gBACT,MAAM;gBACN,UAAU;aACX,CAAC,CAAC;YAEH,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;gBACjC,SAAS;gBACT,UAAU;aACX,CAAC,CAAC;YAEH,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,UAAU,CAAC,QAAQ,EAAE,CAAC;YAC5B,MAAM,KAAK,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,OAAO,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;CACF,CAAA;AAjFY,0DAAuB;kCAAvB,uBAAuB;IAE/B,WAAA,IAAA,eAAM,EAAC,oBAAQ,CAAC,CAAA;qCACU,oBAAQ;QACI,6CAAoB;QACtB,wCAAkB;GAL9C,uBAAuB,CAiFnC"}
1
+ {"version":3,"file":"event-sourcing.repository.js","sourceRoot":"","sources":["../../../src/model/db/event-sourcing.repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { ClassConstructor } from '@smiledragon-corp/app-common/types';
2
+ import { IEvent, IEventPayload } from 'src/interface';
3
+ import { RawEventStore } from './raw-event-store.interface';
4
+ export declare class EventStoreEntity {
5
+ stream_id: string;
6
+ version: number;
7
+ event: string;
8
+ payload: IEventPayload<IEvent>;
9
+ event_id: string;
10
+ aggregate_id: string;
11
+ occurred_on: Date;
12
+ correlation_id: string | null;
13
+ causation_id: string | null;
14
+ static FromRaw(raw: RawEventStore): EventStoreEntity;
15
+ toDomain<T extends IEvent>(eventClass: ClassConstructor<IEvent>): T;
16
+ }
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EventStoreEntity = void 0;
4
+ class EventStoreEntity {
5
+ stream_id;
6
+ version;
7
+ event;
8
+ payload;
9
+ event_id;
10
+ aggregate_id;
11
+ occurred_on;
12
+ correlation_id;
13
+ causation_id;
14
+ static FromRaw(raw) {
15
+ const entity = new EventStoreEntity();
16
+ entity.stream_id = raw.stream_id;
17
+ entity.version = raw.version;
18
+ entity.event = raw.event;
19
+ entity.payload = raw.payload;
20
+ entity.event_id = raw.event_id;
21
+ entity.aggregate_id = raw.aggregate_id;
22
+ entity.occurred_on = raw.occurred_on;
23
+ entity.correlation_id = raw.correlation_id;
24
+ entity.causation_id = raw.causation_id;
25
+ return entity;
26
+ }
27
+ toDomain(eventClass) {
28
+ const event = new eventClass();
29
+ Object.assign(event, this.payload);
30
+ return event;
31
+ }
32
+ }
33
+ exports.EventStoreEntity = EventStoreEntity;
34
+ //# sourceMappingURL=event-store.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-store.entity.js","sourceRoot":"","sources":["../../../src/model/db/event-store.entity.ts"],"names":[],"mappings":";;;AAIA,MAAa,gBAAgB;IAC3B,SAAS,CAAS;IAClB,OAAO,CAAS;IAChB,KAAK,CAAS;IACd,OAAO,CAAwB;IAC/B,QAAQ,CAAS;IACjB,YAAY,CAAS;IACrB,WAAW,CAAO;IAClB,cAAc,CAAgB;IAC9B,YAAY,CAAgB;IAE5B,MAAM,CAAC,OAAO,CAAC,GAAkB;QAC/B,MAAM,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;QAEtC,MAAM,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;QACjC,MAAM,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QAC7B,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;QACzB,MAAM,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QAC7B,MAAM,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;QAC/B,MAAM,CAAC,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC;QACvC,MAAM,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC;QACrC,MAAM,CAAC,cAAc,GAAG,GAAG,CAAC,cAAc,CAAC;QAC3C,MAAM,CAAC,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC;QAEvC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,QAAQ,CAAmB,UAAoC;QAC7D,MAAM,KAAK,GAAG,IAAI,UAAU,EAAE,CAAC;QAE/B,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAEnC,OAAO,KAAU,CAAC;IACpB,CAAC;CACF;AAlCD,4CAkCC"}
@@ -1,4 +1,5 @@
1
1
  import { IEvent } from 'src/interface';
2
+ import { IEventFilter } from 'src/interface/event/event-filter.interface';
2
3
  import { AggregateRoot } from '../aggregate.root';
3
4
  import { EventEnvelope } from '../event-envelope';
4
5
  import { DbClient } from './db.client';
@@ -18,4 +19,10 @@ export declare class EventStoreRepository {
18
19
  events: IEvent[];
19
20
  connection: DbConnection;
20
21
  }): Promise<void>;
22
+ getEvents({ tableName, streamId, connection, filter, }: {
23
+ tableName: string;
24
+ streamId: string;
25
+ connection: DbConnection;
26
+ filter?: IEventFilter;
27
+ }): AsyncGenerator<IEvent[]>;
21
28
  }
@@ -11,13 +11,20 @@ var __metadata = (this && this.__metadata) || function (k, v) {
11
11
  var __param = (this && this.__param) || function (paramIndex, decorator) {
12
12
  return function (target, key) { decorator(target, key, paramIndex); }
13
13
  };
14
+ var __importDefault = (this && this.__importDefault) || function (mod) {
15
+ return (mod && mod.__esModule) ? mod : { "default": mod };
16
+ };
14
17
  Object.defineProperty(exports, "__esModule", { value: true });
15
18
  exports.EventStoreRepository = void 0;
16
19
  const common_1 = require("@nestjs/common");
17
20
  const time_uuid_1 = require("@smiledragon-corp/time-uuid");
21
+ const pg_cursor_1 = __importDefault(require("pg-cursor"));
22
+ const common_2 = require("../../common");
18
23
  const helper_1 = require("../../helper");
19
24
  const event_envelope_1 = require("../event-envelope");
20
25
  const db_client_1 = require("./db.client");
26
+ const event_store_entity_1 = require("./event-store.entity");
27
+ const event_registry_1 = require("./event.registry");
21
28
  let EventStoreRepository = class EventStoreRepository {
22
29
  dbClient;
23
30
  columns = [
@@ -91,6 +98,43 @@ let EventStoreRepository = class EventStoreRepository {
91
98
  connection,
92
99
  });
93
100
  }
101
+ async *getEvents({ tableName, streamId, connection, filter, }) {
102
+ const fromVersion = filter?.fromVersion;
103
+ const direction = filter?.direction || 'ASC';
104
+ const limit = filter?.limit || Number.MAX_SAFE_INTEGER;
105
+ const batch = filter?.batch || common_2.DEFAULT_BATCH_SIZE;
106
+ const query = `
107
+ SELECT event, payload
108
+ FROM "${tableName}"
109
+ WHERE stream_id = $1
110
+ ${fromVersion ? 'AND version >= $2' : ''}
111
+ ORDER BY version ${direction}
112
+ LIMIT ${fromVersion ? '$3' : '$2'}
113
+ `;
114
+ const params = fromVersion
115
+ ? [streamId, fromVersion, limit]
116
+ : [streamId, limit];
117
+ const cursor = connection.queryWithCursor(new pg_cursor_1.default(query, params));
118
+ let done = false;
119
+ while (!done) {
120
+ const rows = await new Promise((resolve, reject) => cursor.read(batch, (err, result) => err ? reject(err) : resolve(result)));
121
+ if (rows.length === 0) {
122
+ done = true;
123
+ }
124
+ else {
125
+ const entities = rows.map((row) => {
126
+ const eventClass = event_registry_1.EventRegistry.getClass(row.event);
127
+ if (!eventClass) {
128
+ throw new Error(`Event class not found for event: ${row.event}`);
129
+ }
130
+ const eventEntity = event_store_entity_1.EventStoreEntity.FromRaw(row);
131
+ return eventEntity.toDomain(eventClass);
132
+ });
133
+ yield entities;
134
+ }
135
+ }
136
+ cursor.close(() => { });
137
+ }
94
138
  };
95
139
  exports.EventStoreRepository = EventStoreRepository;
96
140
  exports.EventStoreRepository = EventStoreRepository = __decorate([