@event-nest/postgresql 2.0.0

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/README.md ADDED
@@ -0,0 +1,4 @@
1
+ # Event Nest | PostgreSQL
2
+ The PostgreSQL module for [Event Nest](https://www.npmjs.com/package/@event-nest/core)
3
+
4
+ For a full documentation, please visit the [Event Nest](https://www.npmjs.com/package/@event-nest/core) package.
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@event-nest/postgresql",
3
+ "version": "2.0.0",
4
+ "license": "MIT",
5
+ "description": "Event sourcing module for NestJS using PostgreSQL. It uses SQL tables and transactions to store events",
6
+ "author": "Nick Tsitlakidis",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/NickTsitlakidis/event-nest.git"
10
+ },
11
+ "engines": {
12
+ "node": ">= 16"
13
+ },
14
+ "type": "commonjs",
15
+ "keywords": [
16
+ "nestjs",
17
+ "event sourcing",
18
+ "cqrs",
19
+ "ddd",
20
+ "mongodb",
21
+ "sql",
22
+ "postgresql"
23
+ ],
24
+ "peerDependencies": {
25
+ "@nestjs/common": "^9.0.0 || ^10.0.0",
26
+ "@nestjs/core": "^9.0.0 || ^10.0.0",
27
+ "pg": "^8.11.5",
28
+ "reflect-metadata": "0.1.13",
29
+ "rxjs": "^7.2.0"
30
+ },
31
+ "main": "./src/index.js",
32
+ "typings": "./src/index.d.ts",
33
+ "dependencies": {
34
+ "class-transformer": "^0.5.1",
35
+ "knex": "^3.1.0",
36
+ "tslib": "^2.3.0",
37
+ "uuid": "^9.0.1",
38
+ "@event-nest/core": "2.0.0"
39
+ }
40
+ }
package/src/index.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export * from "./lib/event-nest-postgresql.module";
2
+ export * from "./lib/postgresql-module-options";
package/src/index.js ADDED
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./lib/event-nest-postgresql.module"), exports);
5
+ tslib_1.__exportStar(require("./lib/postgresql-module-options"), exports);
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../libs/postgresql/src/index.ts"],"names":[],"mappings":";;;AAAA,6EAAmD;AACnD,0EAAgD"}
@@ -0,0 +1,12 @@
1
+ import { DomainEventEmitter } from "@event-nest/core";
2
+ import { DynamicModule } from "@nestjs/common";
3
+ import { ModulesContainer } from "@nestjs/core";
4
+ import { PostgreSQLModuleAsyncOptions, PostgreSQLModuleOptions } from "./postgresql-module-options";
5
+ export declare class EventNestPostgreSQLModule {
6
+ private readonly _eventEmitter;
7
+ private readonly _modulesContainer;
8
+ constructor(_eventEmitter: DomainEventEmitter, _modulesContainer: ModulesContainer);
9
+ static register(options: PostgreSQLModuleOptions): DynamicModule;
10
+ static registerAsync(options: PostgreSQLModuleAsyncOptions): DynamicModule;
11
+ onApplicationBootstrap(): void;
12
+ }
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ var EventNestPostgreSQLModule_1;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.EventNestPostgreSQLModule = void 0;
5
+ const tslib_1 = require("tslib");
6
+ const core_1 = require("@event-nest/core");
7
+ const common_1 = require("@nestjs/common");
8
+ const core_2 = require("@nestjs/core");
9
+ const module_providers_1 = require("./module-providers");
10
+ let EventNestPostgreSQLModule = EventNestPostgreSQLModule_1 = class EventNestPostgreSQLModule {
11
+ constructor(_eventEmitter, _modulesContainer) {
12
+ this._eventEmitter = _eventEmitter;
13
+ this._modulesContainer = _modulesContainer;
14
+ }
15
+ static register(options) {
16
+ return {
17
+ exports: [core_1.EVENT_STORE],
18
+ module: EventNestPostgreSQLModule_1,
19
+ providers: module_providers_1.ModuleProviders.create(options)
20
+ };
21
+ }
22
+ static registerAsync(options) {
23
+ return {
24
+ exports: [core_1.EVENT_STORE],
25
+ module: EventNestPostgreSQLModule_1,
26
+ providers: module_providers_1.ModuleProviders.createAsync(options)
27
+ };
28
+ }
29
+ onApplicationBootstrap() {
30
+ this._eventEmitter.bindSubscriptions(this._modulesContainer);
31
+ }
32
+ };
33
+ exports.EventNestPostgreSQLModule = EventNestPostgreSQLModule;
34
+ exports.EventNestPostgreSQLModule = EventNestPostgreSQLModule = EventNestPostgreSQLModule_1 = tslib_1.__decorate([
35
+ (0, common_1.Global)(),
36
+ (0, common_1.Module)({}),
37
+ tslib_1.__metadata("design:paramtypes", [core_1.DomainEventEmitter,
38
+ core_2.ModulesContainer])
39
+ ], EventNestPostgreSQLModule);
40
+ //# sourceMappingURL=event-nest-postgresql.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-nest-postgresql.module.js","sourceRoot":"","sources":["../../../../../libs/postgresql/src/lib/event-nest-postgresql.module.ts"],"names":[],"mappings":";;;;;AAAA,2CAAmE;AACnE,2CAA+D;AAC/D,uCAAgD;AAEhD,yDAAqD;AAK9C,IAAM,yBAAyB,iCAA/B,MAAM,yBAAyB;IAClC,YACqB,aAAiC,EACjC,iBAAmC;QADnC,kBAAa,GAAb,aAAa,CAAoB;QACjC,sBAAiB,GAAjB,iBAAiB,CAAkB;IACrD,CAAC;IAEJ,MAAM,CAAC,QAAQ,CAAC,OAAgC;QAC5C,OAAO;YACH,OAAO,EAAE,CAAC,kBAAW,CAAC;YACtB,MAAM,EAAE,2BAAyB;YACjC,SAAS,EAAE,kCAAe,CAAC,MAAM,CAAC,OAAO,CAAC;SAC7C,CAAC;IACN,CAAC;IAED,MAAM,CAAC,aAAa,CAAC,OAAqC;QACtD,OAAO;YACH,OAAO,EAAE,CAAC,kBAAW,CAAC;YACtB,MAAM,EAAE,2BAAyB;YACjC,SAAS,EAAE,kCAAe,CAAC,WAAW,CAAC,OAAO,CAAC;SAClD,CAAC;IACN,CAAC;IAED,sBAAsB;QAClB,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACjE,CAAC;CACJ,CAAA;AAzBY,8DAAyB;oCAAzB,yBAAyB;IAFrC,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC,EAAE,CAAC;6CAG6B,yBAAkB;QACd,uBAAgB;GAH/C,yBAAyB,CAyBrC"}
@@ -0,0 +1,6 @@
1
+ import { Provider } from "@nestjs/common";
2
+ import { PostgreSQLModuleAsyncOptions, PostgreSQLModuleOptions } from "./postgresql-module-options";
3
+ export declare class ModuleProviders {
4
+ static create(options: PostgreSQLModuleOptions): Provider[];
5
+ static createAsync(options: PostgreSQLModuleAsyncOptions): Provider[];
6
+ }
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ModuleProviders = void 0;
4
+ const core_1 = require("@event-nest/core");
5
+ const knex_1 = require("knex");
6
+ const postgresql_event_store_1 = require("./storage/postgresql-event-store");
7
+ const KNEX_CONNECTION = Symbol("EVENT_NEST_KNEX_CONNECTION");
8
+ function buildKnexConnection(options) {
9
+ if ((0, core_1.isNil)(options.ssl)) {
10
+ return (0, knex_1.knex)({
11
+ client: "pg",
12
+ connection: {
13
+ connectionString: options.connectionUri,
14
+ ssl: { rejectUnauthorized: false }
15
+ }
16
+ });
17
+ }
18
+ return (0, knex_1.knex)({
19
+ client: "pg",
20
+ connection: {
21
+ connectionString: options.connectionUri,
22
+ ssl: {
23
+ ca: options.ssl.certificate,
24
+ rejectUnauthorized: options.ssl.rejectUnauthorized
25
+ }
26
+ }
27
+ });
28
+ }
29
+ class ModuleProviders {
30
+ static create(options) {
31
+ return [
32
+ {
33
+ provide: core_1.DomainEventEmitter,
34
+ useFactory: () => {
35
+ return new core_1.DomainEventEmitter(options.concurrentSubscriptions);
36
+ }
37
+ },
38
+ {
39
+ provide: KNEX_CONNECTION,
40
+ useValue: buildKnexConnection(options)
41
+ },
42
+ {
43
+ inject: [core_1.DomainEventEmitter, KNEX_CONNECTION],
44
+ provide: core_1.EVENT_STORE,
45
+ useFactory: (eventEmitter, knexConnection) => {
46
+ return new postgresql_event_store_1.PostgreSQLEventStore(eventEmitter, options.schemaName, options.aggregatesTableName, options.eventsTableName, knexConnection);
47
+ }
48
+ }
49
+ ];
50
+ }
51
+ static createAsync(options) {
52
+ const optionsProvider = {
53
+ inject: options.inject,
54
+ provide: "EVENT_NEST_PG_OPTIONS",
55
+ useFactory: async (...args) => {
56
+ return await options.useFactory(...args);
57
+ }
58
+ };
59
+ const emitterProvider = {
60
+ inject: ["EVENT_NEST_PG_OPTIONS"],
61
+ provide: core_1.DomainEventEmitter,
62
+ useFactory: (options) => {
63
+ return new core_1.DomainEventEmitter(options.concurrentSubscriptions);
64
+ }
65
+ };
66
+ const knexProvider = {
67
+ inject: ["EVENT_NEST_PG_OPTIONS"],
68
+ provide: KNEX_CONNECTION,
69
+ useFactory: (options) => {
70
+ return buildKnexConnection(options);
71
+ }
72
+ };
73
+ const eventStoreProvider = {
74
+ inject: ["EVENT_NEST_PG_OPTIONS", core_1.DomainEventEmitter, KNEX_CONNECTION],
75
+ provide: core_1.EVENT_STORE,
76
+ useFactory: (options, emitter, knexConnection) => {
77
+ return new postgresql_event_store_1.PostgreSQLEventStore(emitter, options.schemaName, options.aggregatesTableName, options.eventsTableName, knexConnection);
78
+ }
79
+ };
80
+ return [optionsProvider, knexProvider, emitterProvider, eventStoreProvider];
81
+ }
82
+ }
83
+ exports.ModuleProviders = ModuleProviders;
84
+ //# sourceMappingURL=module-providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-providers.js","sourceRoot":"","sources":["../../../../../libs/postgresql/src/lib/module-providers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { CoreModuleOptions } from "@event-nest/core";
2
+ export interface SslOptions {
3
+ certificate?: string;
4
+ rejectUnauthorized: boolean;
5
+ }
6
+ export interface PostgreSQLModuleOptions extends CoreModuleOptions {
7
+ /**
8
+ * The name of the table which will be used to store the aggregate root rows.
9
+ */
10
+ aggregatesTableName: string;
11
+ /**
12
+ * A valid connection string which will be used to connect to the PostgreSQL server.
13
+ */
14
+ connectionUri: string;
15
+ /**
16
+ * The name of the table which will be used to store the event rows
17
+ */
18
+ eventsTableName: string;
19
+ /**
20
+ * The name of the database schema
21
+ */
22
+ schemaName: string;
23
+ /**
24
+ * Options to define if you want to use SSL or not. By default, the setting is disabled. To enable it you need to
25
+ * provide a string representation of your certificate and set the rejectUnauthorized flag to true.
26
+ */
27
+ ssl?: SslOptions;
28
+ }
29
+ export interface PostgreSQLModuleAsyncOptions {
30
+ inject?: any[];
31
+ useFactory: (...args: any[]) => PostgreSQLModuleOptions | Promise<PostgreSQLModuleOptions>;
32
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=postgresql-module-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgresql-module-options.js","sourceRoot":"","sources":["../../../../../libs/postgresql/src/lib/postgresql-module-options.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ export interface AggregateRootRow {
2
+ id: string;
3
+ version: number;
4
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=aggregate-root-row.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregate-root-row.js","sourceRoot":"","sources":["../../../../../../libs/postgresql/src/lib/storage/aggregate-root-row.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ export interface EventRow {
2
+ aggregate_root_id: string;
3
+ aggregate_root_name: string;
4
+ aggregate_root_version: number;
5
+ created_at: Date;
6
+ event_name: string;
7
+ id: string;
8
+ payload: string;
9
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=event-row.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-row.js","sourceRoot":"","sources":["../../../../../../libs/postgresql/src/lib/storage/event-row.ts"],"names":[],"mappings":""}
@@ -0,0 +1,19 @@
1
+ import { AbstractEventStore, AggregateRoot, AggregateRootClass, DomainEventEmitter, StoredAggregateRoot, StoredEvent } from "@event-nest/core";
2
+ import * as knex from "knex";
3
+ export declare class PostgreSQLEventStore extends AbstractEventStore {
4
+ private _schemaName;
5
+ private _aggregatesTableName;
6
+ private _eventsTableName;
7
+ private readonly _knexConnection;
8
+ private readonly _fullAggregatesTableName;
9
+ private readonly _fullEventsTableName;
10
+ private readonly _logger;
11
+ constructor(eventEmitter: DomainEventEmitter, _schemaName: string, _aggregatesTableName: string, _eventsTableName: string, _knexConnection: knex.Knex);
12
+ get aggregatesTableName(): string;
13
+ get eventsTableName(): string;
14
+ get schemaName(): string;
15
+ findAggregateRootVersion(id: string): Promise<number>;
16
+ findByAggregateRootId<T extends AggregateRoot>(aggregateRootClass: AggregateRootClass<T>, id: string): Promise<Array<StoredEvent>>;
17
+ generateEntityId(): Promise<string>;
18
+ save(events: Array<StoredEvent>, aggregate: StoredAggregateRoot): Promise<Array<StoredEvent>>;
19
+ }
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PostgreSQLEventStore = void 0;
4
+ const core_1 = require("@event-nest/core");
5
+ const common_1 = require("@nestjs/common");
6
+ const uuid_1 = require("uuid");
7
+ class PostgreSQLEventStore extends core_1.AbstractEventStore {
8
+ constructor(eventEmitter, _schemaName, _aggregatesTableName, _eventsTableName, _knexConnection) {
9
+ super(eventEmitter);
10
+ this._schemaName = _schemaName;
11
+ this._aggregatesTableName = _aggregatesTableName;
12
+ this._eventsTableName = _eventsTableName;
13
+ this._knexConnection = _knexConnection;
14
+ this._logger = new common_1.Logger(PostgreSQLEventStore.name);
15
+ this._fullAggregatesTableName = this._schemaName + "." + this._aggregatesTableName;
16
+ this._fullEventsTableName = this._schemaName + "." + this._eventsTableName;
17
+ }
18
+ get aggregatesTableName() {
19
+ return this._aggregatesTableName;
20
+ }
21
+ get eventsTableName() {
22
+ return this._eventsTableName;
23
+ }
24
+ get schemaName() {
25
+ return this._schemaName;
26
+ }
27
+ async findAggregateRootVersion(id) {
28
+ const aggregate = await this._knexConnection(this._fullAggregatesTableName)
29
+ .select("version")
30
+ .where("id", id)
31
+ .first();
32
+ if ((0, core_1.isNil)(aggregate)) {
33
+ return -1;
34
+ }
35
+ return aggregate.version;
36
+ }
37
+ async findByAggregateRootId(aggregateRootClass, id) {
38
+ const aggregateRootName = (0, core_1.getAggregateRootName)(aggregateRootClass);
39
+ if ((0, core_1.isNil)(aggregateRootName)) {
40
+ this._logger.error(`Missing aggregate root name for class: ${aggregateRootClass.name}. Use the @AggregateRootName decorator.`);
41
+ throw new core_1.MissingAggregateRootNameException(aggregateRootClass.name);
42
+ }
43
+ const rows = await this._knexConnection(this._fullEventsTableName).select("*").where({
44
+ aggregate_root_id: id,
45
+ aggregate_root_name: aggregateRootName
46
+ });
47
+ if (rows.length > 0) {
48
+ return rows.map((row) => {
49
+ return core_1.StoredEvent.fromStorage(row.id, row.aggregate_root_id, row.event_name, row.created_at, row.aggregate_root_version, row.aggregate_root_name, row.payload);
50
+ });
51
+ }
52
+ return [];
53
+ }
54
+ generateEntityId() {
55
+ return Promise.resolve((0, uuid_1.v4)());
56
+ }
57
+ async save(events, aggregate) {
58
+ if (events.length === 0) {
59
+ return [];
60
+ }
61
+ let incrementedVersion = 0;
62
+ let finalAggregate;
63
+ try {
64
+ await this._knexConnection.transaction(async (trx) => {
65
+ const aggregateInDb = await trx(this._fullAggregatesTableName)
66
+ .select("*")
67
+ .forUpdate()
68
+ .where("id", aggregate.id)
69
+ .first();
70
+ let foundAggregate = (0, core_1.isNil)(aggregateInDb)
71
+ ? undefined
72
+ : new core_1.StoredAggregateRoot(aggregateInDb.id, aggregateInDb.version);
73
+ if ((0, core_1.isNil)(foundAggregate)) {
74
+ aggregate.version = 0;
75
+ this._logger.debug(`Aggregate ${aggregate.id} does not exist. Will save it`);
76
+ await trx(this._fullAggregatesTableName).insert({
77
+ id: aggregate.id,
78
+ version: aggregate.version
79
+ });
80
+ foundAggregate = aggregate;
81
+ }
82
+ if (foundAggregate.version !== aggregate.version) {
83
+ this._logger.error(`Concurrency issue for aggregate ${aggregate.id}. Expected ${aggregate.version}. Stored ${foundAggregate.version}`);
84
+ throw new core_1.EventConcurrencyException(aggregate.id, foundAggregate.version, aggregate.version);
85
+ }
86
+ for (let i = 0; i < events.length; i++) {
87
+ incrementedVersion = aggregate.version + i + 1;
88
+ events[i].aggregateRootVersion = incrementedVersion;
89
+ }
90
+ aggregate.version = incrementedVersion;
91
+ finalAggregate = aggregate;
92
+ this._logger.debug(`Saving ${events.length} events for aggregate ${aggregate.id}`);
93
+ const mapped = events.map((ev) => {
94
+ return {
95
+ aggregate_root_id: ev.aggregateRootId,
96
+ aggregate_root_name: ev.aggregateRootName,
97
+ aggregate_root_version: ev.aggregateRootVersion,
98
+ created_at: ev.createdAt,
99
+ event_name: ev.eventName,
100
+ id: ev.id,
101
+ payload: JSON.stringify(ev.payload)
102
+ };
103
+ });
104
+ await trx(this._fullEventsTableName).insert(mapped);
105
+ await trx(this._fullAggregatesTableName)
106
+ .update("version", finalAggregate.version)
107
+ .where("id", finalAggregate.id);
108
+ });
109
+ }
110
+ catch (error) {
111
+ this._logger.error("Unable to complete transaction for aggregate root with id : " + aggregate.id);
112
+ throw error;
113
+ }
114
+ return events;
115
+ }
116
+ }
117
+ exports.PostgreSQLEventStore = PostgreSQLEventStore;
118
+ //# sourceMappingURL=postgresql-event-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgresql-event-store.js","sourceRoot":"","sources":["../../../../../../libs/postgresql/src/lib/storage/postgresql-event-store.ts"],"names":[],"mappings":"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"}