UNPKG

1.84 kBJavaScriptView Raw
1'use strict';
2
3const uuid = require('uuid/v4');
4const formats = require('formats');
5
6const MESSAGE_TYPE = 'command';
7
8class Command {
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(name, { minLength: 1 }))
27 throw new Error('Command name is missing.');
28
29 if (!formats.isObject(payload))
30 throw new Error('Payload must be an object.');
31
32 if (!formats.isObject(metadata))
33 throw new Error('Metadata must be an object.');
34
35 this.context = context;
36 this.aggregate = { name: aggregate.name, id: aggregate.id, revision: aggregate.revision };
37 this.name = name;
38
39 this.id = id || uuid();
40
41 this.metadata = {
42 ...metadata,
43 timestamp: (new Date()).getTime(),
44 };
45
46 this.payload = payload;
47 this.routingKey = `command.${this.context}.${this.aggregate.name}`;
48 }
49
50 serialize() {
51 return JSON.parse(JSON.stringify(this));
52 }
53
54 get messageType() { // eslint-disable-line
55 return MESSAGE_TYPE;
56 }
57
58 get fullname() {
59 return `${this.context}.${this.aggregate.name}.${this.name}`;
60 }
61
62 static deserialize({
63 id,
64 context,
65 aggregate,
66 name,
67 payload = {},
68 metadata = {},
69 }) {
70 return new Command({
71 id,
72 context,
73 aggregate,
74 name,
75 payload,
76 metadata,
77 });
78 }
79
80 static definition() {
81 return {
82 id: 'id',
83 context: 'context',
84 // aggregate
85 aggregateId: 'aggregate.id',
86 aggregate: 'aggregate.name',
87 revision: 'aggregate.revision',
88
89 name: 'name',
90 payload: 'payload',
91
92 meta: 'metadata',
93 };
94 }
95}
96
97module.exports = Command;