UNPKG

@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
"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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWdncmVnYXRlUm9vdE9wZXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiLi4vIiwic291cmNlcyI6WyJBZ2dyZWdhdGVSb290T3BlcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsK0NBQStDO0FBQy9DLHFHQUFxRzs7O0FBS3JHLHFEQUEwSjtBQUMxSiw2REFBd0Q7QUFJeEQseUVBQXNFO0FBR3RFOzs7R0FHRztBQUNILE1BQWEsdUJBQThELFNBQVEsbURBQXdDO0lBQ3ZIOzs7Ozs7OztPQVFHO0lBQ0gsWUFDcUIsS0FBa0MsRUFDbEMsa0JBQXFDLEVBQ3JDLGNBQTZCLEVBQzdCLFdBQXdCLEVBQ3hCLFdBQXdCLEVBQ3hCLE9BQWU7UUFDaEMsS0FBSyxFQUFFLENBQUM7UUFOUyxVQUFLLEdBQUwsS0FBSyxDQUE2QjtRQUNsQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW1CO1FBQ3JDLG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBQzdCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLFlBQU8sR0FBUCxPQUFPLENBQVE7SUFFcEMsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixLQUFLLENBQUMsT0FBTyxDQUFDLE1BQTJDLEVBQUUsZUFBNkIsNkJBQVksQ0FBQyxPQUFPO1FBQ3hHLE1BQU0sUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDckQsUUFBUSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDO1FBQ3RELFFBQVEsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUV2QyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FDZCwyQkFBMkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLDJCQUEyQixJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxvQ0FBb0MsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUN4SixJQUFJLENBQUMsS0FBSyxFQUNWLElBQUksQ0FBQyxrQkFBa0IsRUFDdkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRXpCLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFakQsTUFBTSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFdkIsSUFBSSxRQUFRLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDbkMsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDNUM7SUFDTCxDQUFDO0lBRU8sbUJBQW1CLENBQUMsUUFBd0I7UUFDaEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQ2QsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksMkJBQTJCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLGtCQUFrQixRQUFRLENBQUMsYUFBYSxDQUFDLE1BQU0sK0JBQStCLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFDMUssSUFBSSxDQUFDLEtBQUssRUFDVixJQUFJLENBQUMsa0JBQWtCLEVBQ3ZCLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUM3QixJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFekIsT0FBTyxJQUFJLENBQUMsV0FBVzthQUNsQixZQUFZLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQzthQUN4QyxlQUFlLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQzthQUNwQyxhQUFhLENBQUMsaUNBQW9CLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDaEcsTUFBTSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFTyw2QkFBNkIsQ0FBQyxRQUF3QjtRQUMxRCxPQUFPLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ2xDLE1BQU0sV0FBVyxHQUE4QjtnQkFDM0MsT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLO2dCQUNoQixTQUFTLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUM7Z0JBQ3RGLE1BQU0sRUFBRSxDQUFDLENBQUMsUUFBUTthQUNyQixDQUFDO1lBQ0YsT0FBTyxXQUFXLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sS0FBSyxDQUFDLGFBQWEsQ0FBQyxRQUF3QixFQUFFLFlBQTBCO1FBQzVFLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUNkLDBCQUEwQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksMkJBQTJCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLHlCQUF5QixJQUFJLENBQUMsY0FBYyxFQUFFLEVBQzVJLElBQUksQ0FBQyxLQUFLLEVBQ1YsSUFBSSxDQUFDLGtCQUFrQixFQUN2QixJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFekIsTUFBTSxlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNoSSxJQUFJLGVBQWUsQ0FBQyxTQUFTLEVBQUU7WUFDM0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsZUFBZSxlQUFlLENBQUMsTUFBTSxFQUFFLEVBQUUsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BGLFFBQVEsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7U0FDckM7YUFBTTtZQUNILElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7U0FDL0M7SUFDTCxDQUFDO0NBQ0o7QUFsRkQsMERBa0ZDIn0=