UNPKG

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