UNPKG

1.17 kBJavaScriptView Raw
1'use strict';
2
3const dotty = require('dotty');
4
5const { valueop } = require('../../utils');
6
7const generateEvent = (aggregate, name, payload, metadata) => {
8 const event = {};
9 dotty.put(event, aggregate.definitions.event.name, name);
10 dotty.put(event, aggregate.definitions.event.payload, payload);
11 dotty.put(event, aggregate.definitions.event.meta, metadata);
12 return event;
13};
14
15const generateAggregateApi = (aggregate, eventEnricher = valueop) => {
16 const AggregateApi = function AggregateApi(aggregateModel) {
17 this._aggregateModel = aggregateModel;
18 this.apply.__self = this;
19 };
20
21 AggregateApi.prototype.get = function get(...params) {
22 return this._aggregateModel.get(...params);
23 };
24
25 AggregateApi.prototype.apply = function apply(name, payload, metadata) {
26 const evt = generateEvent(aggregate, name, payload, metadata);
27 this._aggregateModel.apply(eventEnricher(evt, this._aggregateModel) || evt);
28 };
29
30 aggregate.events.forEach(({ name }) => {
31 AggregateApi.prototype.apply[name] = function applyEvent(payload, metadata) {
32 this.call(this.__self, name, payload, metadata);
33 };
34 });
35
36 return AggregateApi;
37};
38
39module.exports = generateAggregateApi;