UNPKG

@dolittle/sdk.projections

Version:

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

131 lines 11.6 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.ProjectionClassBuilder = void 0; const rudiments_1 = require("@dolittle/rudiments"); const sdk_artifacts_1 = require("@dolittle/sdk.artifacts"); const sdk_events_1 = require("@dolittle/sdk.events"); const DeleteReadModelInstance_1 = require("../DeleteReadModelInstance"); const Projection_1 = require("../Projection"); const convertToMongoDBDecorator_1 = require("./Copies/convertToMongoDBDecorator"); const copyProjectionToMongoDBDecorator_1 = require("./Copies/copyProjectionToMongoDBDecorator"); const ProjectionCopies_1 = require("../Copies/ProjectionCopies"); const ProjectionProperty_1 = require("../Copies/ProjectionProperty"); const MongoDBCopies_1 = require("../Copies/MongoDB/MongoDBCopies"); const PropertyConversion_1 = require("../Copies/MongoDB/PropertyConversion"); const onDecorator_1 = require("./onDecorator"); /** * Represents a builder for building a projection from a class. * @template T The type of the projection class. */ class ProjectionClassBuilder { /** * Initialises a new instance of the {@link FailureReason} class. * @param {ProjectionDecoratedType} type - The decorated projection type of the class. */ constructor(type) { this.type = type; } /** @inheritdoc */ equals(other) { if (this === other) return true; if (other instanceof ProjectionClassBuilder) { return this.type === other.type; } return false; } /** * 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) { results.addInformation(`Building projection ${this.type.projectionId} processing events in scope ${this.type.scopeId} from type ${this.type.type.name}`); const events = new sdk_events_1.EventTypeMap(); if (!this.tryAddAllOnMethods(events, this.type.type, eventTypes)) { results.addFailure(`Could not create projection ${this.type.type.name} because it contains invalid projection methods`, 'Maybe you have multiple @on methods handling the same event type?'); return; } const copies = this.buildCopies(results); if (copies === undefined) { return undefined; } return new Projection_1.Projection(this.type.projectionId, this.type.type, this.type.scopeId, events, copies, this.type.alias); } tryAddAllOnMethods(events, type, eventTypes) { let allMethodsValid = true; const methods = (0, onDecorator_1.getOnDecoratedMethods)(type); if (methods.length < 1) { allMethodsValid = false; return allMethodsValid; } for (const method of methods) { const [hasEventType, eventType] = this.tryGetEventTypeFromMethod(method, eventTypes); if (!hasEventType) { allMethodsValid = false; continue; } const onMethod = this.createOnMethod(method); const keySelector = method.keySelector; if (events.has(eventType)) { allMethodsValid = false; continue; } events.set(eventType, [onMethod, keySelector]); } return allMethodsValid; } tryGetEventTypeFromMethod(method, eventTypes) { if (this.eventTypeIsId(method.eventTypeOrId)) { return [ true, new sdk_events_1.EventType(sdk_events_1.EventTypeId.from(method.eventTypeOrId), method.generation ? sdk_artifacts_1.Generation.from(method.generation) : sdk_artifacts_1.Generation.first) ]; } else if (!eventTypes.hasFor(method.eventTypeOrId)) { return [false, undefined]; } else { return [true, eventTypes.getFor(method.eventTypeOrId)]; } } eventTypeIsId(eventTypeOrId) { return eventTypeOrId instanceof sdk_events_1.EventTypeId || eventTypeOrId instanceof rudiments_1.Guid || typeof eventTypeOrId === 'string'; } createOnMethod(method) { return async (instance, event, projectionContext) => { const result = await method.method.call(instance, event, projectionContext); if (result instanceof DeleteReadModelInstance_1.DeleteReadModelInstance) { return result; } return instance; }; } buildCopies(results) { const mongoDBCopies = this.buildMongoDBCopies(results); if (mongoDBCopies === undefined) { return undefined; } return new ProjectionCopies_1.ProjectionCopies(mongoDBCopies); } buildMongoDBCopies(results) { if (!(0, copyProjectionToMongoDBDecorator_1.isDecoratedCopyProjectionToMongoDB)(this.type.type)) { return MongoDBCopies_1.MongoDBCopies.default; } const decoratedType = (0, copyProjectionToMongoDBDecorator_1.getDecoratedCopyProjectionToMongoDB)(this.type.type); const collection = decoratedType.collection; const [collectionNameIsValid, collectionNameValidationError] = collection.isValid(); if (!collectionNameIsValid) { results.addFailure(`Cannot create MongoDB read model copies. ${collectionNameValidationError === null || collectionNameValidationError === void 0 ? void 0 : collectionNameValidationError.message}`); return undefined; } const decoratedProperties = (0, convertToMongoDBDecorator_1.getConvertToMongoDBDecoratedProperties)(this.type.type); const conversions = decoratedProperties.map(property => new PropertyConversion_1.PropertyConversion(property.property, property.conversion, false, ProjectionProperty_1.ProjectionProperty.from(''), [])); return new MongoDBCopies_1.MongoDBCopies(true, collection, conversions); } } exports.ProjectionClassBuilder = ProjectionClassBuilder; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvamVjdGlvbkNsYXNzQnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIuLi8iLCJzb3VyY2VzIjpbIkJ1aWxkZXJzL1Byb2plY3Rpb25DbGFzc0J1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxxR0FBcUc7OztBQUVyRyxtREFBdUQ7QUFHdkQsMkRBQXFEO0FBRXJELHFEQUEyRztBQUUzRyx3RUFBcUU7QUFHckUsOENBQTJDO0FBRTNDLGtGQUE0RjtBQUM1RixnR0FBb0k7QUFDcEksaUVBQThEO0FBQzlELHFFQUFrRTtBQUNsRSxtRUFBZ0U7QUFDaEUsNkVBQTBFO0FBRTFFLCtDQUFzRDtBQUd0RDs7O0dBR0c7QUFDSCxNQUFhLHNCQUFzQjtJQUMvQjs7O09BR0c7SUFDSCxZQUFxQixJQUE2QjtRQUE3QixTQUFJLEdBQUosSUFBSSxDQUF5QjtJQUNsRCxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLE1BQU0sQ0FBQyxLQUFVO1FBQ2IsSUFBSSxJQUFJLEtBQUssS0FBSztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRWhDLElBQUksS0FBSyxZQUFZLHNCQUFzQixFQUFFO1lBQ3pDLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsSUFBSSxDQUFDO1NBQ25DO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLFVBQXVCLEVBQUUsT0FBNEI7UUFDdkQsT0FBTyxDQUFDLGNBQWMsQ0FBQyx1QkFBdUIsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLCtCQUErQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sY0FBYyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRXpKLE1BQU0sTUFBTSxHQUFHLElBQUkseUJBQVksRUFBd0MsQ0FBQztRQUN4RSxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFB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