UNPKG

@dolittle/sdk.projections

Version:

Dolittle is a decentralized, distributed, event-driven microservice platform built to harness the power of events.

146 lines 13.1 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.ProjectionBuilderForReadModel = void 0; const sdk_artifacts_1 = require("@dolittle/sdk.artifacts"); const sdk_events_1 = require("@dolittle/sdk.events"); const Projection_1 = require("../Projection"); const ProjectionModelId_1 = require("../ProjectionModelId"); const ProjectionCopies_1 = require("../Copies/ProjectionCopies"); const MongoDBCopies_1 = require("../Copies/MongoDB/MongoDBCopies"); const CopyToMongoDBBuilder_1 = require("./Copies/CopyToMongoDBBuilder"); const IProjectionBuilderForReadModel_1 = require("./IProjectionBuilderForReadModel"); const KeySelectorBuilder_1 = require("./KeySelectorBuilder"); const ProjectionAlias_1 = require("../ProjectionAlias"); /** * Represents an implementation of {@link IProjectionBuilderForReadModel}. * @template T The type of the projection read model. */ class ProjectionBuilderForReadModel extends IProjectionBuilderForReadModel_1.IProjectionBuilderForReadModel { /** * Initializes a new instance of {@link ProjectionBuilder}. * @param {ProjectionId} _projectionId - The unique identifier of the projection to build for. * @param {Constructor<T> | T} _readModelTypeOrInstance - The type or instance of the read model to build a projection for. * @param {ScopeId} _scopeId - The scope of the projection. * @param {IModelBuilder} _modelBuilder - For binding the parent projection builder and read model to its identifier. * @param {ProjectionBuilder} _parentBuilder - For binding the builder to the identifier. */ constructor(_projectionId, _readModelTypeOrInstance, _scopeId, _modelBuilder, _parentBuilder) { super(); this._projectionId = _projectionId; this._readModelTypeOrInstance = _readModelTypeOrInstance; this._scopeId = _scopeId; this._modelBuilder = _modelBuilder; this._parentBuilder = _parentBuilder; this._onMethods = []; this._modelBuilder.bindIdentifierToProcessorBuilder(this._modelId, this._parentBuilder); if (_readModelTypeOrInstance instanceof Function) { this._modelBuilder.bindIdentifierToType(this._modelId, _readModelTypeOrInstance); this._alias = ProjectionAlias_1.ProjectionAlias.from(_readModelTypeOrInstance.name); } } on(typeOrEventTypeOrId, keySelectorCallbackOrGeneration, keySelectorCallbackOrCallback, maybeCallback) { const typeOrEventType = this.getTypeOrEventTypeFrom(typeOrEventTypeOrId, keySelectorCallbackOrGeneration); const keySelectorCallback = typeof keySelectorCallbackOrGeneration === 'function' ? keySelectorCallbackOrGeneration : keySelectorCallbackOrCallback; const callback = maybeCallback || keySelectorCallbackOrCallback; this._onMethods.push([typeOrEventType, keySelectorCallback, callback]); return this; } /** @inheritdoc */ inScope(scopeId) { this._modelBuilder.unbindIdentifierFromProcessorBuilder(this._modelId, this._parentBuilder); this._scopeId = sdk_events_1.ScopeId.from(scopeId); this._modelBuilder.bindIdentifierToProcessorBuilder(this._modelId, this._parentBuilder); return this; } /** @inheritdoc */ withAlias(alias) { this._alias = ProjectionAlias_1.ProjectionAlias.from(alias); return this; } /** @inheritdoc */ copyToMongoDB(callback) { this._copyToMongoDBCallback = callback !== null && callback !== void 0 ? callback : (() => { }); return this; } /** * Builds the projection. * @param {IEventTypes} eventTypes - For event types resolution. * @param {IClientBuildResults} results - For keeping track of build results. * @returns {IProjection | undefined} The built projection if successful. */ build(eventTypes, results) { const events = new sdk_events_1.EventTypeMap(); if (this._onMethods.length < 1) { results.addFailure(`Failed to register projection ${this._projectionId}. No on methods are configured`); return; } const allMethodsBuilt = this.tryAddOnMethods(eventTypes, events); if (!allMethodsBuilt) { results.addFailure(`Failed to register projection ${this._projectionId}. Could not build projection`, 'Maybe it tries to handle the same type of event twice?'); return; } const copies = this.buildCopies(results); if (copies === undefined) { results.addFailure(`Failed to register projection ${this._projectionId}. Copies specification is not valid`); return undefined; } return new Projection_1.Projection(this._projectionId, this._readModelTypeOrInstance, this._scopeId, events, copies, this._alias); } tryAddOnMethods(eventTypes, events) { let allMethodsValid = true; const keySelectorBuilder = new KeySelectorBuilder_1.KeySelectorBuilder(); for (const [typeOrEventTypeOrId, keySelectorBuilderCallback, method] of this._onMethods) { const eventType = this.getEventType(typeOrEventTypeOrId, eventTypes); if (events.has(eventType)) { allMethodsValid = false; } events.set(eventType, [method, keySelectorBuilderCallback(keySelectorBuilder)]); } return allMethodsValid; } getTypeOrEventTypeFrom(typeOrEventTypeOrId, keySelectorCallbackOrGeneration) { if (typeof typeOrEventTypeOrId === 'function') { return typeOrEventTypeOrId; } if (typeOrEventTypeOrId instanceof sdk_events_1.EventType) { return typeOrEventTypeOrId; } const eventTypeId = typeOrEventTypeOrId; const eventTypeGeneration = typeof keySelectorCallbackOrGeneration === 'function' ? sdk_artifacts_1.Generation.first : keySelectorCallbackOrGeneration; return new sdk_events_1.EventType(sdk_events_1.EventTypeId.from(eventTypeId), sdk_artifacts_1.Generation.from(eventTypeGeneration)); } getEventType(typeOrEventTypeOrId, eventTypes) { let eventType; if (typeOrEventTypeOrId instanceof sdk_events_1.EventType) { eventType = typeOrEventTypeOrId; } else { eventType = eventTypes.getFor(typeOrEventTypeOrId); } return eventType; } buildCopies(results) { const mongoDBCopies = this.buildMongoDBCopies(results); if (mongoDBCopies === undefined) { return undefined; } return new ProjectionCopies_1.ProjectionCopies(mongoDBCopies); } buildMongoDBCopies(results) { if (this._copyToMongoDBCallback === undefined) { return MongoDBCopies_1.MongoDBCopies.default; } const builder = new CopyToMongoDBBuilder_1.CopyToMongoDBBuilder(this._projectionId, this._readModelTypeOrInstance); this._copyToMongoDBCallback(builder); return builder.build(results); } get _modelId() { return new ProjectionModelId_1.ProjectionModelId(this._projectionId, this._scopeId); } } exports.ProjectionBuilderForReadModel = ProjectionBuilderForReadModel; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvamVjdGlvbkJ1aWxkZXJGb3JSZWFkTW9kZWwuanMiLCJzb3VyY2VSb290IjoiLi4vIiwic291cmNlcyI6WyJCdWlsZGVycy9Qcm9qZWN0aW9uQnVpbGRlckZvclJlYWRNb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsK0NBQStDO0FBQy9DLHFHQUFxRzs7O0FBTXJHLDJEQUFxRDtBQUNyRCxxREFBbUg7QUFJbkgsOENBQTJDO0FBRzNDLDREQUF5RDtBQUN6RCxpRUFBOEQ7QUFDOUQsbUVBQWdFO0FBRWhFLHdFQUFxRTtBQUNyRSxxRkFBa0Y7QUFDbEYsNkRBQTBEO0FBSzFELHdEQUEwRTtBQUUxRTs7O0dBR0c7QUFDSCxNQUFhLDZCQUFpQyxTQUFRLCtEQUFpQztJQUtuRjs7Ozs7OztPQU9HO0lBQ0gsWUFDcUIsYUFBMkIsRUFDM0Isd0JBQTRDLEVBQ3JELFFBQWlCLEVBQ1IsYUFBNEIsRUFDNUIsY0FBaUM7UUFFbEQsS0FBSyxFQUFFLENBQUM7UUFOUyxrQkFBYSxHQUFiLGFBQWEsQ0FBYztRQUMzQiw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQW9CO1FBQ3JELGFBQVEsR0FBUixRQUFRLENBQVM7UUFDUixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUFqQjlDLGVBQVUsR0FBK0IsRUFBRSxDQUFDO1FBb0JoRCxJQUFJLENBQUMsYUFBYSxDQUFDLGdDQUFnQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3hGLElBQUksd0JBQXdCLFlBQVksUUFBUSxFQUFFO1lBQzlDLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO1lBQ2pGLElBQUksQ0FBQyxNQUFNLEdBQUcsaUNBQWUsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDckU7SUFDTCxD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