@dolittle/sdk.projections
Version:
Dolittle is a decentralized, distributed, event-driven microservice platform built to harness the power of events.
93 lines • 8.23 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.CopyToMongoDBBuilder = void 0;
const ProjectionProperty_1 = require("../../Copies/ProjectionProperty");
const CollectionName_1 = require("../../Copies/MongoDB/CollectionName");
const Conversion_1 = require("../../Copies/MongoDB/Conversion");
const MongoDBCopies_1 = require("../../Copies/MongoDB/MongoDBCopies");
const PropertyConversion_1 = require("../../Copies/MongoDB/PropertyConversion");
const ICopyToMongoDBBuilder_1 = require("./ICopyToMongoDBBuilder");
/**
* Represents an implementation of {@link ICopyToMongoDBBuilder}.
* @template T The type of the projection read model.
*/
class CopyToMongoDBBuilder extends ICopyToMongoDBBuilder_1.ICopyToMongoDBBuilder {
/**
* Initialises a new instance of the {@link CopyToMongoDBBuilder} class.
* @param {ProjectionId} _projectionId - The unique identifier of the projection to build for.
* @param {Constructor<T> | T} _readModelTypeOrInstance - The read model type.
*/
constructor(_projectionId, _readModelTypeOrInstance) {
super();
this._projectionId = _projectionId;
this._readModelTypeOrInstance = _readModelTypeOrInstance;
this._conversions = new Map();
this.inferCollectionNameFromType();
}
/** @inheritdoc */
toCollection(collectionName) {
this._collectionName = CollectionName_1.CollectionName.from(collectionName);
return this;
}
/** @inheritdoc */
withConversion(field, to) {
this._conversions.set(field, to);
return this;
}
/**
* Builds the {@link MongoDBCopies} specification configured by this builder.
* @param {IClientBuildResults} results - For keeping track of build results.
* @returns {MongoDBCopies} The built {@link MongoDBCopies} specification.
*/
build(results) {
if (this._collectionName === undefined) {
results.addFailure(`The MongoDB collection name cannot be inferred for projection ${this._projectionId}`, 'Please specify the collection name explicitly');
return undefined;
}
const [collectionNameIsValid, collectionNameValidationError] = this._collectionName.isValid();
if (!collectionNameIsValid) {
results.addFailure(`Cannot create MongoDB read model copies. ${collectionNameValidationError === null || collectionNameValidationError === void 0 ? void 0 : collectionNameValidationError.message}`);
return undefined;
}
return new MongoDBCopies_1.MongoDBCopies(true, this._collectionName, this.buildPropertyConversions());
}
inferCollectionNameFromType() {
if (this._readModelTypeOrInstance instanceof Function) {
this._collectionName = CollectionName_1.CollectionName.from(this._readModelTypeOrInstance.name);
}
}
buildPropertyConversions() {
const conversions = [];
for (const [field, conversionType] of this._conversions) {
const properties = field.split('.');
const conversion = this.makeConversionWithParents(conversions, properties);
conversion.convertTo = conversionType;
}
return this.convertPropertyConversions(conversions);
}
makeConversionWithParents(conversions, properties) {
const current = properties[0];
const remainder = properties.slice(1);
for (const conversion of conversions) {
if (conversion.property === current) {
if (remainder.length > 0) {
return this.makeConversionWithParents(conversion.children, remainder);
}
return conversion;
}
}
const conversion = { property: current, convertTo: Conversion_1.Conversion.None, children: [] };
conversions.push(conversion);
if (remainder.length > 0) {
return this.makeConversionWithParents(conversion.children, remainder);
}
return conversion;
}
convertPropertyConversions(conversions) {
return conversions.map(conversion => new PropertyConversion_1.PropertyConversion(ProjectionProperty_1.ProjectionProperty.from(conversion.property), conversion.convertTo, false, ProjectionProperty_1.ProjectionProperty.from(''), this.convertPropertyConversions(conversion.children)));
}
}
exports.CopyToMongoDBBuilder = CopyToMongoDBBuilder;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29weVRvTW9uZ29EQkJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiLi4vIiwic291cmNlcyI6WyJCdWlsZGVycy9Db3BpZXMvQ29weVRvTW9uZ29EQkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxxR0FBcUc7OztBQUtyRyx3RUFBcUU7QUFDckUsd0VBQXlGO0FBQ3pGLGdFQUE2RDtBQUM3RCxzRUFBbUU7QUFDbkUsZ0ZBQTZFO0FBRzdFLG1FQUFnRTtBQUloRTs7O0dBR0c7QUFDSCxNQUFhLG9CQUF3QixTQUFRLDZDQUF3QjtJQUlqRTs7OztPQUlHO0lBQ0gsWUFDcUIsYUFBMkIsRUFDM0Isd0JBQTRDO1FBRTdELEtBQUssRUFBRSxDQUFDO1FBSFMsa0JBQWEsR0FBYixhQUFhLENBQWM7UUFDM0IsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUFvQjtRQVRoRCxpQkFBWSxHQUE0QixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBWS9ELElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsWUFBWSxDQUFDLGNBQWtDO1FBQzNDLElBQUksQ0FBQyxlQUFlLEdBQUcsK0JBQWMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDM0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixjQUFjLENBQUMsS0FBd0IsRUFBRSxFQUFjO1FBQ25ELElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqQyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxPQUE0QjtRQUM5QixJQUFJLElBQUksQ0FBQyxlQUFlLEtBQUssU0FBUyxFQUFFO1lBQ3BDLE9BQU8sQ0FBQyxVQUFVLENBQUMsaUVBQWlFLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSwrQ0FBK0Ms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