UNPKG

1.93 kBJavaScriptView Raw
1'use strict';
2
3const uuid = require('uuid/v4');
4const formats = require('formats');
5
6const TYPE_NAME = 'domain';
7
8class Event {
9 constructor({
10 id,
11 context,
12 aggregate,
13 name,
14 payload = {},
15 metadata = {},
16 }) {
17 if (!formats.isAlphanumeric(context, { minLength: 1 }))
18 throw new Error('Invalid context.');
19
20 if (!formats.isObject(aggregate))
21 throw new Error('Invalid aggregate.');
22
23 if (!formats.isAlphanumeric(aggregate.name, { minLength: 1 }))
24 throw new Error('Aggregate name is missing.');
25
26 if (!formats.isString(aggregate.id, { minLength: 1 }))
27 throw new Error('Aggregate id is missing.');
28
29 if (!formats.isAlphanumeric(name, { minLength: 1 }))
30 throw new Error('Command name is missing.');
31
32 if (!formats.isObject(payload))
33 throw new Error('Payload must be an object.');
34
35 if (!formats.isObject(metadata))
36 throw new Error('Metadata must be an object.');
37
38 this.type = TYPE_NAME;
39
40 this.id = id || uuid();
41
42 this.context = context;
43 this.aggregate = { name: aggregate.name, id: aggregate.id, revision: aggregate.revision };
44 this.name = name;
45
46 this.metadata = {
47 ...metadata,
48 };
49
50
51 this.payload = payload;
52 }
53
54 static get type() {
55 return TYPE_NAME;
56 }
57
58 serialize() {
59 return JSON.parse(JSON.stringify(this));
60 }
61
62 get fullname() {
63 return `${this.context}.${this.aggregate.name}.${this.name}`;
64 }
65
66 static deserialize({
67 id,
68 context,
69 aggregate,
70 name,
71 payload = {},
72 metadata = {},
73 }) {
74 return new Event({
75 id,
76 context,
77 aggregate,
78 name,
79 payload,
80 metadata,
81 });
82 }
83
84 static definition() {
85 return {
86 id: 'id',
87 context: 'context',
88 // aggregate
89 aggregateId: 'aggregate.id',
90 aggregate: 'aggregate.name',
91 revision: 'aggregate.revision',
92
93 name: 'name',
94
95 payload: 'payload',
96 // metadta
97 meta: 'metadata',
98 commitStamp: 'metadata.timestamp',
99 correlationId: 'metadata.correlationId',
100 };
101 }
102}
103
104module.exports = Event;