@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
JavaScript
;
// 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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