@dolittle/sdk.aggregates
Version:
Dolittle is a decentralized, distributed, event-driven microservice platform built to harness the power of events.
75 lines • 7.94 kB
JavaScript
"use strict";
// Copyright (c) Dolittle. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.AggregateRootOperations = void 0;
const sdk_events_1 = require("@dolittle/sdk.events");
const sdk_resilience_1 = require("@dolittle/sdk.resilience");
const IAggregateRootOperations_1 = require("./IAggregateRootOperations");
/**
* Represents an implementation of {@link IAggregateRootOperations<TAggregate>}.
* @template TAggregateRoot
*/
class AggregateRootOperations extends IAggregateRootOperations_1.IAggregateRootOperations {
/**
* Initialises a new instance of the {@link AggregateRootOperations} class.
* @param {Constructor<TAggregateRoot>} _type - The class implementing the aggregate root.
* @param {AggregateRootType} _aggregateRootType - The aggregate root type associated with the aggregate root.
* @param {EventSourceId} _eventSourceId - The event source id of the aggregate root to perform operations on.
* @param {IEventStore} _eventStore - The event store to fetch committed events from and commit aggregate events with.
* @param {IEventTypes} _eventTypes - All registered event types.
* @param {Logger} _logger - The logger to use for logging.
*/
constructor(_type, _aggregateRootType, _eventSourceId, _eventStore, _eventTypes, _logger) {
super();
this._type = _type;
this._aggregateRootType = _aggregateRootType;
this._eventSourceId = _eventSourceId;
this._eventStore = _eventStore;
this._eventTypes = _eventTypes;
this._logger = _logger;
}
/** @inheritdoc */
async perform(action, cancellation = sdk_resilience_1.Cancellation.default) {
const instance = new this._type(this._eventSourceId);
instance.aggregateRootId = this._aggregateRootType.id;
instance.eventTypes = this._eventTypes;
this._logger.debug(`Performing operation on ${this._type.name} with aggregate root id ${this._aggregateRootType.id} applying events to event source ${this._eventSourceId}`, this._type, this._aggregateRootType, this._eventSourceId);
await this.reApplyEvents(instance, cancellation);
await action(instance);
if (instance.appliedEvents.length > 0) {
await this.commitAppliedEvents(instance);
}
}
commitAppliedEvents(instance) {
this._logger.debug(`${this._type.name} with aggregate root id ${this._aggregateRootType.id} is committing ${instance.appliedEvents.length} events to the event source ${this._eventSourceId}`, this._type, this._aggregateRootType, instance.appliedEvents.length, this._eventSourceId);
return this._eventStore
.forAggregate(this._aggregateRootType.id)
.withEventSource(this._eventSourceId)
.expectVersion(sdk_events_1.AggregateRootVersion.from(instance.version.value - instance.appliedEvents.length))
.commit(this.getUncommittedAggregateEvents(instance));
}
getUncommittedAggregateEvents(instance) {
return instance.appliedEvents.map(_ => {
const uncommitted = {
content: _.event,
eventType: _.hasEventType ? _.eventType : this._eventTypes.getFor(_.event.constructor),
public: _.isPublic
};
return uncommitted;
});
}
async reApplyEvents(instance, cancellation) {
this._logger.debug(`Re-applying events for ${this._type.name} with aggregate root id ${this._aggregateRootType.id} with event source id ${this._eventSourceId}`, this._type, this._aggregateRootType, this._eventSourceId);
const committedEvents = await this._eventStore.fetchForAggregate(this._aggregateRootType.id, this._eventSourceId, cancellation);
if (committedEvents.hasEvents) {
this._logger.debug(`Re-applying ${committedEvents.length}`, committedEvents.length);
instance.reApply(committedEvents);
}
else {
this._logger.debug('No events to re-apply');
}
}
}
exports.AggregateRootOperations = AggregateRootOperations;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWdncmVnYXRlUm9vdE9wZXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiLi4vIiwic291cmNlcyI6WyJBZ2dyZWdhdGVSb290T3BlcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsK0NBQStDO0FBQy9DLHFHQUFxRzs7O0FBS3JHLHFEQUEwSjtBQUMxSiw2REFBd0Q7QUFJeEQseUVBQXNFO0FBR3RFOzs7R0FHRztBQUNILE1BQWEsdUJBQThELFNBQVEsbURBQXdDO0lBQ3ZIOzs7Ozs7OztPQVFHO0lBQ0gsWUFDcUIsS0FBa0MsRUFDbEMsa0JBQXFDLEVBQ3JDLGNBQTZCLEVBQzdCLFdBQXdCLEVBQ3hCLFdBQXdCLEVBQ3hCLE9BQWU7UUFDaEMsS0FBSyxFQUFFLENBQUM7UUFOUyxVQUFLLEdBQUwsS0FBSyxDQUE2QjtRQUNsQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW1CO1FBQ3JDLG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBQzdCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLFlBQU8sR0FBUCxPQUFPLENBQVE7SUFFcEMsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixLQUFLLENBQUMsT0FBTyxDQUFDLE1BQTJDLEVBQUUsZUFBNkIsNkJBQVksQ0FBQyxPQUFPO1FBQ3hHLE1BQU0sUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDckQsUUFBUSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDO1FBQ3RELFFBQVEsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUV2QyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FDZCwyQkFBMkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLDJCQUEyQixJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxvQ0FBb0MsSUFBSSxDQUFDLGNB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