@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
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.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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