@event-nest/core 3.2.1 → 3.3.1
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 +19 -11
- package/package.json +4 -4
- package/src/lib/aggregate-root/aggregate-root-name.js +1 -1
- package/src/lib/aggregate-root/aggregate-root-name.js.map +1 -1
- package/src/lib/aggregate-root/aggregate-root.js +21 -17
- package/src/lib/aggregate-root/aggregate-root.js.map +1 -1
- package/src/lib/aggregate-root/reflection.js +1 -1
- package/src/lib/aggregate-root/reflection.js.map +1 -1
- package/src/lib/domain-event-registrations.d.ts +5 -5
- package/src/lib/domain-event-registrations.js +9 -9
- package/src/lib/domain-event-registrations.js.map +1 -1
- package/src/lib/domain-event-subscription.d.ts +2 -2
- package/src/lib/domain-event-subscription.js +12 -12
- package/src/lib/domain-event-subscription.js.map +1 -1
- package/src/lib/storage/abstract-event-store.js +9 -9
- package/src/lib/storage/abstract-event-store.js.map +1 -1
- package/src/lib/storage/event-store.d.ts +2 -3
- package/src/lib/storage/event-store.js.map +1 -1
- package/src/lib/utils/type-utils.d.ts +1 -1
- package/src/lib/utils/type-utils.js +4 -4
- package/src/lib/utils/type-utils.js.map +1 -1
package/README.md
CHANGED
|
@@ -24,6 +24,7 @@ It would also probably help to make some distinctions about what Event Nest is n
|
|
|
24
24
|
- [Getting Started](#getting-started)
|
|
25
25
|
- [MongoDB setup](#mongodb-setup)
|
|
26
26
|
- [PostgreSQL setup](#postgresql-setup)
|
|
27
|
+
- [Manual creation of PostgreSQL tables](#manual-creation-of-postgresql-tables)
|
|
27
28
|
- [Concepts](#concepts)
|
|
28
29
|
- [Event](#event)
|
|
29
30
|
- [Aggregate Root](#aggregate-root)
|
|
@@ -87,14 +88,21 @@ import { Module } from "@nestjs/common";
|
|
|
87
88
|
aggregatesTableName: "aggregates",
|
|
88
89
|
connectionUri: "postgresql://postgres:password@localhost:5432/event_nest",
|
|
89
90
|
eventsTableName: "events",
|
|
90
|
-
schemaName: "event_nest_schema"
|
|
91
|
+
schemaName: "event_nest_schema",
|
|
92
|
+
ensureTablesExist: true
|
|
91
93
|
})
|
|
92
94
|
]
|
|
93
95
|
})
|
|
94
96
|
export class AppModule {}
|
|
95
97
|
```
|
|
96
98
|
|
|
97
|
-
|
|
99
|
+
If the database user has privileges to create tables, you can set the `ensureTablesExist` option to `true`. This will create the necessary tables in your database during application bootstrap.
|
|
100
|
+
By default, this option is disabled to avoid requiring a user with elevated privileges.
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
#### Manual creation of PostgreSQL tables
|
|
105
|
+
If you prefer to create the tables manually, the following guidelines describe the structure of the tables that need to be created.
|
|
98
106
|
|
|
99
107
|
**Aggregates Table :**
|
|
100
108
|
|
|
@@ -207,15 +215,15 @@ export class User extends AggregateRoot {
|
|
|
207
215
|
}
|
|
208
216
|
|
|
209
217
|
@ApplyEvent(UserCreatedEvent)
|
|
210
|
-
private applyUserCreatedEvent
|
|
218
|
+
private applyUserCreatedEvent(event: UserCreatedEvent) {
|
|
211
219
|
this.name = event.name;
|
|
212
220
|
this.email = event.email;
|
|
213
|
-
}
|
|
221
|
+
}
|
|
214
222
|
|
|
215
223
|
@ApplyEvent(UserUpdatedEvent)
|
|
216
|
-
private applyUserUpdatedEvent
|
|
224
|
+
private applyUserUpdatedEvent(event: UserUpdatedEvent) {
|
|
217
225
|
this.name = event.newName;
|
|
218
|
-
}
|
|
226
|
+
}
|
|
219
227
|
|
|
220
228
|
}
|
|
221
229
|
```
|
|
@@ -233,7 +241,7 @@ In our case, we have the following creation cases :
|
|
|
233
241
|
The `reconstitute` method will initiate the event processing based on the events order.
|
|
234
242
|
|
|
235
243
|
To apply each event, we have defined two private methods which are decorated with the `@ApplyEvent` decorator. Each method will be called when the corresponding event is retrieved, and it's ready to be processed.
|
|
236
|
-
This is the place to update the object's internal state based on the event's data.
|
|
244
|
+
This is the place to update the object's internal state based on the event's data.
|
|
237
245
|
|
|
238
246
|
|
|
239
247
|
Finally, we define an `update` method which is the place to run any business logic we need and append the corresponding event (`UserUpdatedEvent`) to the event stream.
|
|
@@ -287,10 +295,10 @@ import { PublishedDomainEvent, DomainEventSubscription, OnDomainEvent } from "@e
|
|
|
287
295
|
@DomainEventSubscription(UserCreatedEvent, UserUpdatedEvent)
|
|
288
296
|
export class UserEventSubscription implements OnDomainEvent<UserCreatedEvent | UserUpdatedEvent> {
|
|
289
297
|
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
298
|
+
onDomainEvent(event: PublishedDomainEvent<UserCreatedEvent | UserUpdatedEvent>): Promise<unknown> {
|
|
299
|
+
//Here you can create/update your read model based on the event and your custom logic.
|
|
300
|
+
return Promise.resolve(undefined);
|
|
301
|
+
}
|
|
294
302
|
|
|
295
303
|
}
|
|
296
304
|
```
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@event-nest/core",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.3.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"author": "Nick Tsitlakidis",
|
|
6
6
|
"description": "Event sourcing module for NestJS. It provides a set of decorators and classes to build an application based on event sourcing.",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"url": "https://github.com/NickTsitlakidis/event-nest.git"
|
|
19
19
|
},
|
|
20
20
|
"engines": {
|
|
21
|
-
"node": ">=
|
|
21
|
+
"node": ">= 18"
|
|
22
22
|
},
|
|
23
23
|
"type": "commonjs",
|
|
24
24
|
"peerDependencies": {
|
|
@@ -31,6 +31,6 @@
|
|
|
31
31
|
"dependencies": {
|
|
32
32
|
"class-transformer": "^0.5.1"
|
|
33
33
|
},
|
|
34
|
-
"
|
|
35
|
-
"
|
|
34
|
+
"types": "./src/index.d.ts",
|
|
35
|
+
"main": "./src/index.js"
|
|
36
36
|
}
|
|
@@ -19,7 +19,7 @@ const AggregateRootName = (name) => {
|
|
|
19
19
|
};
|
|
20
20
|
};
|
|
21
21
|
exports.AggregateRootName = AggregateRootName;
|
|
22
|
-
// eslint-disable-next-line @typescript-eslint/
|
|
22
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
|
|
23
23
|
function getAggregateRootName(targetClass) {
|
|
24
24
|
return Reflect.getMetadata(metadata_keys_1.AGGREGATE_ROOT_NAME_KEY, targetClass)?.aggregateRootName;
|
|
25
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aggregate-root-name.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/aggregate-root/aggregate-root-name.ts"],"names":[],"mappings":";;;AAoBA,oDAEC;AAtBD,4BAA0B;AAE1B,oDAA2D;AAE3D;;;;;;;;GAQG;AACI,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAkB,EAAE;IAC9D,OAAO,CAAC,MAAc,EAAE,EAAE;QACtB,OAAO,CAAC,cAAc,CAAC,uCAAuB,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;IACzF,CAAC,CAAC;AACN,CAAC,CAAC;AAJW,QAAA,iBAAiB,qBAI5B;AAEF,
|
|
1
|
+
{"version":3,"file":"aggregate-root-name.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/aggregate-root/aggregate-root-name.ts"],"names":[],"mappings":";;;AAoBA,oDAEC;AAtBD,4BAA0B;AAE1B,oDAA2D;AAE3D;;;;;;;;GAQG;AACI,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAkB,EAAE;IAC9D,OAAO,CAAC,MAAc,EAAE,EAAE;QACtB,OAAO,CAAC,cAAc,CAAC,uCAAuB,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;IACzF,CAAC,CAAC;AACN,CAAC,CAAC;AAJW,QAAA,iBAAiB,qBAI5B;AAEF,sEAAsE;AACtE,SAAgB,oBAAoB,CAAC,WAAqB;IACtD,OAAO,OAAO,CAAC,WAAW,CAAC,uCAAuB,EAAE,WAAW,CAAC,EAAE,iBAAiB,CAAC;AACxF,CAAC"}
|
|
@@ -18,7 +18,7 @@ class AggregateRoot {
|
|
|
18
18
|
* Returns a clone array of all the currently appended events of the entity.
|
|
19
19
|
*/
|
|
20
20
|
get appendedEvents() {
|
|
21
|
-
return this._appendedEvents
|
|
21
|
+
return [...this._appendedEvents];
|
|
22
22
|
}
|
|
23
23
|
get id() {
|
|
24
24
|
return this._id;
|
|
@@ -57,7 +57,7 @@ class AggregateRoot {
|
|
|
57
57
|
* Call this once all the events you want, have been appended.
|
|
58
58
|
*/
|
|
59
59
|
async commit() {
|
|
60
|
-
const toPublish = this._appendedEvents
|
|
60
|
+
const toPublish = [...this._appendedEvents];
|
|
61
61
|
if (toPublish.length > 0) {
|
|
62
62
|
await this.publish(toPublish);
|
|
63
63
|
this._appendedEvents = [];
|
|
@@ -84,54 +84,58 @@ class AggregateRoot {
|
|
|
84
84
|
* @param events The events that will be sent to {@link ApplyEvent} functions
|
|
85
85
|
*/
|
|
86
86
|
reconstitute(events) {
|
|
87
|
+
const startedAt = Date.now();
|
|
87
88
|
if (events.length > 0) {
|
|
88
89
|
const [unregistered, missingProcessor, known] = this.splitEvents(this.sortEvents(events));
|
|
89
90
|
if (unregistered.length > 0 || missingProcessor.length > 0) {
|
|
90
|
-
const
|
|
91
|
-
this.logger.error(
|
|
92
|
-
throw
|
|
91
|
+
const throwable = new unknown_event_exception_1.UnknownEventException(unregistered, missingProcessor, this.id);
|
|
92
|
+
this.logger.error(throwable.message);
|
|
93
|
+
throw throwable;
|
|
93
94
|
}
|
|
94
|
-
known
|
|
95
|
+
for (const knownEvent of known) {
|
|
95
96
|
try {
|
|
96
|
-
this[
|
|
97
|
+
this[knownEvent.processorKey](knownEvent.payload);
|
|
97
98
|
}
|
|
98
99
|
catch (error) {
|
|
99
100
|
this.logger.error(`Unable to process domain event due to error in processor function: ${error}`);
|
|
100
101
|
throw error;
|
|
101
102
|
}
|
|
102
|
-
}
|
|
103
|
+
}
|
|
103
104
|
this.resolveVersion(events);
|
|
104
105
|
}
|
|
106
|
+
const duration = Date.now() - startedAt;
|
|
107
|
+
this._logger.debug(`Reconstitution of ${this.constructor.name} took ${duration}ms`);
|
|
105
108
|
}
|
|
106
109
|
resolveVersion(events) {
|
|
107
|
-
const sorted = events.sort((
|
|
108
|
-
|
|
110
|
+
const sorted = events.sort((event1, event2) => event1.aggregateRootVersion - event2.aggregateRootVersion);
|
|
111
|
+
const lastElement = sorted.at(-1);
|
|
112
|
+
this._version = (0, type_utils_1.isNil)(lastElement) ? 0 : lastElement.aggregateRootVersion;
|
|
109
113
|
}
|
|
110
114
|
sortEvents(events) {
|
|
111
|
-
return events.sort((
|
|
115
|
+
return events.sort((event1, event2) => event1.aggregateRootVersion - event2.aggregateRootVersion);
|
|
112
116
|
}
|
|
113
117
|
splitEvents(events) {
|
|
114
118
|
const known = [];
|
|
115
119
|
const unregistered = [];
|
|
116
120
|
const missingProcessor = [];
|
|
117
|
-
events
|
|
118
|
-
const eventClass = (0, domain_event_registrations_1.getEventClass)(
|
|
121
|
+
for (const storedEvent of events) {
|
|
122
|
+
const eventClass = (0, domain_event_registrations_1.getEventClass)(storedEvent.eventName);
|
|
119
123
|
if ((0, type_utils_1.isNil)(eventClass)) {
|
|
120
|
-
unregistered.push(
|
|
124
|
+
unregistered.push(storedEvent.eventName);
|
|
121
125
|
}
|
|
122
126
|
else {
|
|
123
127
|
const processorKey = (0, reflection_1.getDecoratedPropertyKey)(this, eventClass);
|
|
124
128
|
if ((0, type_utils_1.isNil)(processorKey)) {
|
|
125
|
-
missingProcessor.push(
|
|
129
|
+
missingProcessor.push(storedEvent.eventName);
|
|
126
130
|
}
|
|
127
131
|
else {
|
|
128
132
|
known.push({
|
|
129
|
-
payload:
|
|
133
|
+
payload: storedEvent.getPayloadAs(eventClass),
|
|
130
134
|
processorKey
|
|
131
135
|
});
|
|
132
136
|
}
|
|
133
137
|
}
|
|
134
|
-
}
|
|
138
|
+
}
|
|
135
139
|
return [unregistered, missingProcessor, known];
|
|
136
140
|
}
|
|
137
141
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aggregate-root.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/aggregate-root/aggregate-root.ts"],"names":[],"mappings":";;;AAAA,2CAAwC;AAExC,8EAA4E;AAC5E,mFAA8E;AAC9E,6FAAwF;AAExF,oDAA4C;AAE5C,6CAAuD;AAOvD,MAAsB,aAAa;IAK/B,YACqB,GAAW,EAC5B,MAAe;QADE,QAAG,GAAH,GAAG,CAAQ;QAG5B,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QAClB,IAAI,CAAC,OAAO,GAAG,IAAA,kBAAK,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,eAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC3E,CAAC;IAED;;OAEG;IACH,IAAI,cAAc;QACd,OAAO,
|
|
1
|
+
{"version":3,"file":"aggregate-root.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/aggregate-root/aggregate-root.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ exports.getDecoratedPropertyKey = getDecoratedPropertyKey;
|
|
|
4
4
|
require("reflect-metadata");
|
|
5
5
|
function getDecoratedPropertyKey(entity, eventClass) {
|
|
6
6
|
const metadataKeys = Reflect.getMetadataKeys(entity);
|
|
7
|
-
if (!metadataKeys || metadataKeys.length
|
|
7
|
+
if (!metadataKeys || metadataKeys.length === 0) {
|
|
8
8
|
return undefined;
|
|
9
9
|
}
|
|
10
10
|
const matchingKey = metadataKeys.find((metadataKey) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reflection.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/aggregate-root/reflection.ts"],"names":[],"mappings":";;AAKA,0DAgBC;AArBD,4BAA0B;AAK1B,SAAgB,uBAAuB,CAAC,MAAqB,EAAE,UAA0B;IACrF,MAAM,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IACrD,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"reflection.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/aggregate-root/reflection.ts"],"names":[],"mappings":";;AAKA,0DAgBC;AArBD,4BAA0B;AAK1B,SAAgB,uBAAuB,CAAC,MAAqB,EAAE,UAA0B;IACrF,MAAM,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IACrD,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7C,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE;QAClD,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAC1D,OAAO,QAAQ,CAAC,UAAU,KAAK,UAAU,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,WAAW,EAAE,CAAC;QACf,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,OAAO,OAAO,CAAC,WAAW,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC;AACxD,CAAC"}
|
|
@@ -3,16 +3,16 @@ type Registration = {
|
|
|
3
3
|
eventClass: unknown;
|
|
4
4
|
eventName: string;
|
|
5
5
|
};
|
|
6
|
-
/**
|
|
7
|
-
* Returns the event name that matches the class of the provided object.
|
|
8
|
-
* @param target
|
|
9
|
-
*/
|
|
10
|
-
export declare function getEventName(target: object): string | undefined;
|
|
11
6
|
/**
|
|
12
7
|
* Returns the class that matches the provided name. Or undefined.
|
|
13
8
|
* @param name The event name to be checked.
|
|
14
9
|
*/
|
|
15
10
|
export declare function getEventClass<T>(name: string): Class<T> | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* Returns the event name that matches the class of the provided object.
|
|
13
|
+
* @param target
|
|
14
|
+
*/
|
|
15
|
+
export declare function getEventName(target: object): string | undefined;
|
|
16
16
|
export declare function isRegistered(event: object): boolean;
|
|
17
17
|
export declare function registerEvent(newRegistration: Registration): void;
|
|
18
18
|
export {};
|
|
@@ -1,20 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getEventName = getEventName;
|
|
4
3
|
exports.getEventClass = getEventClass;
|
|
4
|
+
exports.getEventName = getEventName;
|
|
5
5
|
exports.isRegistered = isRegistered;
|
|
6
6
|
exports.registerEvent = registerEvent;
|
|
7
7
|
const event_name_conflict_exception_1 = require("./exceptions/event-name-conflict-exception");
|
|
8
8
|
const type_utils_1 = require("./utils/type-utils");
|
|
9
9
|
const registrations = [];
|
|
10
|
-
/**
|
|
11
|
-
* Returns the event name that matches the class of the provided object.
|
|
12
|
-
* @param target
|
|
13
|
-
*/
|
|
14
|
-
function getEventName(target) {
|
|
15
|
-
const found = registrations.find((registration) => registration.eventClass === target.constructor);
|
|
16
|
-
return found ? found.eventName : undefined;
|
|
17
|
-
}
|
|
18
10
|
/**
|
|
19
11
|
* Returns the class that matches the provided name. Or undefined.
|
|
20
12
|
* @param name The event name to be checked.
|
|
@@ -23,6 +15,14 @@ function getEventClass(name) {
|
|
|
23
15
|
const found = registrations.find((registration) => registration.eventName === name);
|
|
24
16
|
return (0, type_utils_1.isNil)(found) ? undefined : found.eventClass;
|
|
25
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* Returns the event name that matches the class of the provided object.
|
|
20
|
+
* @param target
|
|
21
|
+
*/
|
|
22
|
+
function getEventName(target) {
|
|
23
|
+
const found = registrations.find((registration) => registration.eventClass === target.constructor);
|
|
24
|
+
return found ? found.eventName : undefined;
|
|
25
|
+
}
|
|
26
26
|
function isRegistered(event) {
|
|
27
27
|
return !(0, type_utils_1.isNil)(getEventName(event));
|
|
28
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domain-event-registrations.js","sourceRoot":"","sources":["../../../../../libs/core/src/lib/domain-event-registrations.ts"],"names":[],"mappings":";;AAgBA,
|
|
1
|
+
{"version":3,"file":"domain-event-registrations.js","sourceRoot":"","sources":["../../../../../libs/core/src/lib/domain-event-registrations.ts"],"names":[],"mappings":";;AAgBA,sCAGC;AAMD,oCAGC;AAED,oCAEC;AAED,sCAMC;AAtCD,8FAAwF;AACxF,mDAA2C;AAO3C,MAAM,aAAa,GAAwB,EAAE,CAAC;AAE9C;;;GAGG;AACH,SAAgB,aAAa,CAAI,IAAY;IACzC,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC;IACpF,OAAO,IAAA,kBAAK,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,KAAK,CAAC,UAAuB,CAAC;AACrE,CAAC;AAED;;;GAGG;AACH,SAAgB,YAAY,CAAC,MAAc;IACvC,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,UAAU,KAAK,MAAM,CAAC,WAAW,CAAC,CAAC;IACnG,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/C,CAAC;AAED,SAAgB,YAAY,CAAC,KAAa;IACtC,OAAO,CAAC,IAAA,kBAAK,EAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,SAAgB,aAAa,CAAC,eAA6B;IACvD,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,SAAS,KAAK,eAAe,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7F,MAAM,IAAI,0DAA0B,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;IACpE,CAAC;IAED,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Class } from "type-fest";
|
|
2
2
|
import { OnDomainEvent } from "./on-domain-event";
|
|
3
3
|
export declare const DomainEventSubscription: (...eventClasses: Class<unknown>[]) => ClassDecorator;
|
|
4
|
-
export declare function isDomainEventSubscription(targetInstance: object): boolean;
|
|
5
|
-
export declare function getEventsFromDomainEventSubscription(subscriptionInstance: OnDomainEvent<unknown>): any[];
|
|
6
4
|
export declare function getEventId(eventConstructor: Function): string | undefined;
|
|
5
|
+
export declare function getEventsFromDomainEventSubscription(subscriptionInstance: OnDomainEvent<unknown>): any[];
|
|
6
|
+
export declare function isDomainEventSubscription(targetInstance: object): boolean;
|
|
@@ -1,33 +1,33 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.DomainEventSubscription = void 0;
|
|
4
|
-
exports.isDomainEventSubscription = isDomainEventSubscription;
|
|
5
|
-
exports.getEventsFromDomainEventSubscription = getEventsFromDomainEventSubscription;
|
|
6
4
|
exports.getEventId = getEventId;
|
|
7
|
-
|
|
5
|
+
exports.getEventsFromDomainEventSubscription = getEventsFromDomainEventSubscription;
|
|
6
|
+
exports.isDomainEventSubscription = isDomainEventSubscription;
|
|
7
|
+
const node_crypto_1 = require("node:crypto");
|
|
8
8
|
const metadata_keys_1 = require("./metadata-keys");
|
|
9
9
|
const type_utils_1 = require("./utils/type-utils");
|
|
10
10
|
const DomainEventSubscription = (...eventClasses) => {
|
|
11
11
|
return (target) => {
|
|
12
|
-
|
|
12
|
+
for (const event of eventClasses) {
|
|
13
13
|
if (!Reflect.hasOwnMetadata(metadata_keys_1.DOMAIN_EVENT_KEY, event)) {
|
|
14
|
-
Reflect.defineMetadata(metadata_keys_1.DOMAIN_EVENT_KEY, { eventSubscriptionId: `${event.name}-${(0,
|
|
14
|
+
Reflect.defineMetadata(metadata_keys_1.DOMAIN_EVENT_KEY, { eventSubscriptionId: `${event.name}-${(0, node_crypto_1.randomUUID)()}` }, event);
|
|
15
15
|
}
|
|
16
|
-
}
|
|
16
|
+
}
|
|
17
17
|
Reflect.defineMetadata(metadata_keys_1.DOMAIN_EVENT_SUBSCRIPTION_KEY, { events: eventClasses }, target);
|
|
18
18
|
};
|
|
19
19
|
};
|
|
20
20
|
exports.DomainEventSubscription = DomainEventSubscription;
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
return
|
|
21
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
|
|
22
|
+
function getEventId(eventConstructor) {
|
|
23
|
+
return Reflect.getMetadata(metadata_keys_1.DOMAIN_EVENT_KEY, eventConstructor)?.eventSubscriptionId;
|
|
24
24
|
}
|
|
25
25
|
function getEventsFromDomainEventSubscription(subscriptionInstance) {
|
|
26
26
|
const metadata = Reflect.getMetadata(metadata_keys_1.DOMAIN_EVENT_SUBSCRIPTION_KEY, subscriptionInstance.constructor);
|
|
27
27
|
return (0, type_utils_1.isNil)(metadata) ? [] : metadata.events;
|
|
28
28
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
return
|
|
29
|
+
function isDomainEventSubscription(targetInstance) {
|
|
30
|
+
const hasMetadata = Reflect.hasOwnMetadata(metadata_keys_1.DOMAIN_EVENT_SUBSCRIPTION_KEY, targetInstance.constructor);
|
|
31
|
+
return hasMetadata && typeof targetInstance.onDomainEvent === "function";
|
|
32
32
|
}
|
|
33
33
|
//# sourceMappingURL=domain-event-subscription.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domain-event-subscription.js","sourceRoot":"","sources":["../../../../../libs/core/src/lib/domain-event-subscription.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"domain-event-subscription.js","sourceRoot":"","sources":["../../../../../libs/core/src/lib/domain-event-subscription.ts"],"names":[],"mappings":";;;AAwBA,gCAEC;AAED,oFAGC;AAED,8DAGC;AApCD,6CAAyC;AAGzC,mDAAkF;AAElF,mDAA2C;AAEpC,MAAM,uBAAuB,GAAG,CAAC,GAAG,YAA8B,EAAkB,EAAE;IACzF,OAAO,CAAC,MAAc,EAAE,EAAE;QACtB,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,gCAAgB,EAAE,KAAK,CAAC,EAAE,CAAC;gBACnD,OAAO,CAAC,cAAc,CAClB,gCAAgB,EAChB,EAAE,mBAAmB,EAAE,GAAG,KAAK,CAAC,IAAI,IAAI,IAAA,wBAAU,GAAE,EAAE,EAAE,EACxD,KAAK,CACR,CAAC;YACN,CAAC;QACL,CAAC;QAED,OAAO,CAAC,cAAc,CAAC,6CAA6B,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,MAAM,CAAC,CAAC;IAC5F,CAAC,CAAC;AACN,CAAC,CAAC;AAdW,QAAA,uBAAuB,2BAclC;AAEF,sEAAsE;AACtE,SAAgB,UAAU,CAAC,gBAA0B;IACjD,OAAO,OAAO,CAAC,WAAW,CAAC,gCAAgB,EAAE,gBAAgB,CAAC,EAAE,mBAAmB,CAAC;AACxF,CAAC;AAED,SAAgB,oCAAoC,CAAC,oBAA4C;IAC7F,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,6CAA6B,EAAE,oBAAoB,CAAC,WAAW,CAAC,CAAC;IACtG,OAAO,IAAA,kBAAK,EAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;AAClD,CAAC;AAED,SAAgB,yBAAyB,CAAC,cAAsB;IAC5D,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,6CAA6B,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC;IACtG,OAAO,WAAW,IAAI,OAAQ,cAAyC,CAAC,aAAa,KAAK,UAAU,CAAC;AACzG,CAAC"}
|
|
@@ -23,8 +23,8 @@ class AbstractEventStore {
|
|
|
23
23
|
if ((0, type_utils_1.isNil)(aggregateRootName)) {
|
|
24
24
|
throw new missing_aggregate_root_name_exception_1.MissingAggregateRootNameException(aggregateRoot.constructor.name);
|
|
25
25
|
}
|
|
26
|
-
if (events.length
|
|
27
|
-
return
|
|
26
|
+
if (events.length === 0) {
|
|
27
|
+
return [];
|
|
28
28
|
}
|
|
29
29
|
const ids = await Promise.all(events.map(() => this.generateEntityId()));
|
|
30
30
|
if (ids.length !== events.length || !(0, type_utils_1.hasAllValues)(ids)) {
|
|
@@ -32,7 +32,7 @@ class AbstractEventStore {
|
|
|
32
32
|
}
|
|
33
33
|
const published = [];
|
|
34
34
|
const storedEvents = [];
|
|
35
|
-
|
|
35
|
+
for (const event of events) {
|
|
36
36
|
const id = ids.pop();
|
|
37
37
|
storedEvents.push(stored_event_1.StoredEvent.fromPublishedEvent(id, aggregateRoot.id, aggregateRootName, event.payload, event.occurredAt));
|
|
38
38
|
published.push({
|
|
@@ -40,16 +40,16 @@ class AbstractEventStore {
|
|
|
40
40
|
eventId: id,
|
|
41
41
|
version: aggregateRoot.version
|
|
42
42
|
});
|
|
43
|
-
}
|
|
43
|
+
}
|
|
44
44
|
const toStore = new stored_aggregate_root_1.StoredAggregateRoot(aggregateRoot.id, aggregateRoot.version);
|
|
45
45
|
const saved = await this.save(storedEvents, toStore);
|
|
46
|
-
published
|
|
47
|
-
const found = saved.find((s) => s.id ===
|
|
46
|
+
for (const publishedEvent of published) {
|
|
47
|
+
const found = saved.find((s) => s.id === publishedEvent.eventId);
|
|
48
48
|
if ((0, type_utils_1.isNil)(found)) {
|
|
49
|
-
throw new unknown_event_version_exception_1.UnknownEventVersionException(
|
|
49
|
+
throw new unknown_event_version_exception_1.UnknownEventVersionException(publishedEvent.eventId, publishedEvent.aggregateRootId);
|
|
50
50
|
}
|
|
51
|
-
|
|
52
|
-
}
|
|
51
|
+
publishedEvent.version = found.aggregateRootVersion;
|
|
52
|
+
}
|
|
53
53
|
this._eventEmitter.emitMultiple(published);
|
|
54
54
|
aggregateRoot.resolveVersion(saved);
|
|
55
55
|
return saved;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abstract-event-store.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/storage/abstract-event-store.ts"],"names":[],"mappings":";;;AAEA,+EAA6E;AAE7E,mFAA8E;AAC9E,+GAAwG;AACxG,mGAA6F;AAE7F,oDAA0D;AAE1D,mEAA8D;AAC9D,iDAA6C;AAE7C;;;;GAIG;AACH,MAAsB,kBAAkB;IACpC,YAA8B,aAAiC;QAAjC,kBAAa,GAAb,aAAa,CAAoB;IAAG,CAAC;IAEnE,YAAY,CAA0B,aAAgB;QAClD,aAAa,CAAC,OAAO,GAAG,KAAK,EAAE,MAAyC,EAAE,EAAE;YACxE,MAAM,iBAAiB,GAAG,IAAA,0CAAoB,EAAC,aAAa,CAAC,WAAW,CAAC,CAAC;YAC1E,IAAI,IAAA,kBAAK,EAAC,iBAAiB,CAAC,EAAE,CAAC;gBAC3B,MAAM,IAAI,yEAAiC,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAChF,CAAC;YAED,IAAI,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"abstract-event-store.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/storage/abstract-event-store.ts"],"names":[],"mappings":";;;AAEA,+EAA6E;AAE7E,mFAA8E;AAC9E,+GAAwG;AACxG,mGAA6F;AAE7F,oDAA0D;AAE1D,mEAA8D;AAC9D,iDAA6C;AAE7C;;;;GAIG;AACH,MAAsB,kBAAkB;IACpC,YAA8B,aAAiC;QAAjC,kBAAa,GAAb,aAAa,CAAoB;IAAG,CAAC;IAEnE,YAAY,CAA0B,aAAgB;QAClD,aAAa,CAAC,OAAO,GAAG,KAAK,EAAE,MAAyC,EAAE,EAAE;YACxE,MAAM,iBAAiB,GAAG,IAAA,0CAAoB,EAAC,aAAa,CAAC,WAAW,CAAC,CAAC;YAC1E,IAAI,IAAA,kBAAK,EAAC,iBAAiB,CAAC,EAAE,CAAC;gBAC3B,MAAM,IAAI,yEAAiC,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAChF,CAAC;YAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,OAAO,EAAE,CAAC;YACd,CAAC;YAED,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;YACzE,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,IAAI,CAAC,IAAA,yBAAY,EAAC,GAAG,CAAC,EAAE,CAAC;gBACrD,MAAM,IAAI,+CAAqB,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAC/D,CAAC;YACD,MAAM,SAAS,GAAwC,EAAE,CAAC;YAC1D,MAAM,YAAY,GAAuB,EAAE,CAAC;YAE5C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBACzB,MAAM,EAAE,GAAG,GAAG,CAAC,GAAG,EAAY,CAAC;gBAC/B,YAAY,CAAC,IAAI,CACb,0BAAW,CAAC,kBAAkB,CAC1B,EAAE,EACF,aAAa,CAAC,EAAE,EAChB,iBAAiB,EACjB,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,UAAU,CACnB,CACJ,CAAC;gBACF,SAAS,CAAC,IAAI,CAAC;oBACX,GAAG,KAAK;oBACR,OAAO,EAAE,EAAE;oBACX,OAAO,EAAE,aAAa,CAAC,OAAO;iBACjC,CAAC,CAAC;YACP,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,2CAAmB,CAAC,aAAa,CAAC,EAAE,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;YACjF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACrD,KAAK,MAAM,cAAc,IAAI,SAAS,EAAE,CAAC;gBACrC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,cAAc,CAAC,OAAO,CAAC,CAAC;gBACjE,IAAI,IAAA,kBAAK,EAAC,KAAK,CAAC,EAAE,CAAC;oBACf,MAAM,IAAI,8DAA4B,CAAC,cAAc,CAAC,OAAO,EAAE,cAAc,CAAC,eAAe,CAAC,CAAC;gBACnG,CAAC;gBAED,cAAc,CAAC,OAAO,GAAG,KAAK,CAAC,oBAAoB,CAAC;YACxD,CAAC;YAED,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAC3C,aAAa,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YACpC,OAAO,KAAK,CAAC;QACjB,CAAC,CAAC;QACF,OAAO,aAAa,CAAC;IACzB,CAAC;CAiBJ;AAxED,gDAwEC"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
+
import { Class } from "type-fest";
|
|
1
2
|
import { AggregateRoot } from "../aggregate-root/aggregate-root";
|
|
2
3
|
import { StoredAggregateRoot } from "./stored-aggregate-root";
|
|
3
4
|
import { StoredEvent } from "./stored-event";
|
|
4
|
-
export type AggregateRootClass<T> =
|
|
5
|
-
prototype: T;
|
|
6
|
-
} & Function;
|
|
5
|
+
export type AggregateRootClass<T> = Class<T>;
|
|
7
6
|
export declare const EVENT_STORE: unique symbol;
|
|
8
7
|
/**
|
|
9
8
|
* Defines the main EventStore interface that can be used to retrieve and save events. Each implementation of this interface
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-store.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/storage/event-store.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"event-store.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/storage/event-store.ts"],"names":[],"mappings":";;;AAWM,QAAA,WAAW,GAAG,MAAM,CAAC,wBAAwB,CAAC,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
+
export declare function hasAllValues<T>(toCheck: Array<null | T | undefined>): toCheck is Array<T>;
|
|
1
2
|
export declare function isNil(toCheck: unknown): toCheck is null | undefined;
|
|
2
|
-
export declare function hasAllValues<T>(toCheck: Array<T | null | undefined>): toCheck is Array<T>;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.isNil = isNil;
|
|
4
3
|
exports.hasAllValues = hasAllValues;
|
|
5
|
-
|
|
6
|
-
return toCheck === null || toCheck === undefined;
|
|
7
|
-
}
|
|
4
|
+
exports.isNil = isNil;
|
|
8
5
|
function hasAllValues(toCheck) {
|
|
9
6
|
return toCheck.every((item) => !isNil(item));
|
|
10
7
|
}
|
|
8
|
+
function isNil(toCheck) {
|
|
9
|
+
return toCheck === null || toCheck === undefined;
|
|
10
|
+
}
|
|
11
11
|
//# sourceMappingURL=type-utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type-utils.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/utils/type-utils.ts"],"names":[],"mappings":";;AAAA,
|
|
1
|
+
{"version":3,"file":"type-utils.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/utils/type-utils.ts"],"names":[],"mappings":";;AAAA,oCAEC;AAED,sBAEC;AAND,SAAgB,YAAY,CAAI,OAAoC;IAChE,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,SAAgB,KAAK,CAAC,OAAgB;IAClC,OAAO,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,CAAC;AACrD,CAAC"}
|