UNPKG

@5minds/processcube_engine

Version:

The ProcessCube Engine. Stores and executes BPMNs.

212 lines • 10.7 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.CorrelationDatabaseAdapter = void 0; const inversify_1 = require("inversify"); const sequelize_1 = require("sequelize"); const processcube_engine_sdk_1 = require("@5minds/processcube_engine_sdk"); const BaseDatabaseAdapter_1 = require("./BaseDatabaseAdapter"); const Compression_1 = require("./Lib/Compression"); const FlowNodeInstanceFactory_1 = require("./Lib/FlowNodeInstanceFactory"); const SearchQueryBuilder_1 = require("./Lib/SearchQueryBuilder"); const SequelizeConnectionManager_1 = require("./Lib/SequelizeConnectionManager"); const index_1 = require("./Models/index"); let CorrelationDatabaseAdapter = class CorrelationDatabaseAdapter extends BaseDatabaseAdapter_1.DatabaseAdapter { static async deleteMetadataValueByFlowNodeInstanceIds(flowNodeInstanceIds, transaction) { await (0, SequelizeConnectionManager_1.executeWithRetry)(async () => { return index_1.CorrelationMetadataModel.destroy({ where: { flowNodeInstanceId: { [sequelize_1.Op.in]: flowNodeInstanceIds, }, }, transaction: transaction, }); }, `deleting metadata for flow node instances '${flowNodeInstanceIds}'`); } async initialize() { await super.initialize('database_adapter:correlations'); } async checkIfCorrelationExists(correlationId) { const query = { where: { correlationId: correlationId }, }; const correlation = await (0, SequelizeConnectionManager_1.executeWithRetry)(async () => index_1.CorrelationModel.findOne(query), `check if correlation with id '${correlationId}' exists`); return correlation != undefined; } async getAll(includeProcessInstances = false, offset, limit, sort, includeCount) { const options = { include: this.getIncludesForSelectQuery(includeProcessInstances), ...(0, SearchQueryBuilder_1.buildPagination)(offset, limit), order: [[sort?.sortBy ?? 'createdAt', sort?.sortDir ?? 'DESC']], }; if (!includeCount) { return this.getAllCorrelationsWithoutCount(options); } return this.getAllCorrelationsWithCount(options); } async getById(correlationId, includeProcessInstances = false) { const query = { where: { correlationId: correlationId }, include: this.getIncludesForSelectQuery(includeProcessInstances), }; const correlation = await (0, SequelizeConnectionManager_1.executeWithRetry)(async () => index_1.CorrelationModel.findOne(query), `get correlations by correlationId '${correlationId}'`); if (!correlation) { throw new processcube_engine_sdk_1.NotFoundError(`Correlation with ID \`${correlationId}\` not found.`); } const mappedCorrelation = await this.convertCorrelationToRuntimeObject(correlation); return mappedCorrelation; } async setMetadataValue(correlationId, metaDataKey, metaDataValue, flowNodeInstanceId) { return (0, SequelizeConnectionManager_1.executeWithRetry)(this.execSetMetadataValue.bind(this, correlationId, metaDataKey, metaDataValue, flowNodeInstanceId), `set metadata '${metaDataKey}' for correlation '${correlationId}'`); } async getAllCorrelationsWithCount(options) { const { count, rows } = await (0, SequelizeConnectionManager_1.executeWithRetry)(async () => index_1.CorrelationModel.findAndCountAll(options), 'get and count all correlations'); const mappedCorrelations = await Promise.all(rows.map(this.convertCorrelationToRuntimeObject.bind(this))); return { correlations: mappedCorrelations, totalCount: count, }; } async getAllCorrelationsWithoutCount(options) { const results = await (0, SequelizeConnectionManager_1.executeWithRetry)(async () => index_1.CorrelationModel.findAll(options), 'get all correlations without count'); const mappedCorrelations = await Promise.all(results.map(this.convertCorrelationToRuntimeObject.bind(this))); return { correlations: mappedCorrelations, totalCount: undefined, }; } async execSetMetadataValue(correlationId, metaDataKey, metaDataValue, flowNodeInstanceId) { const correlation = await index_1.CorrelationModel.findOne({ where: { correlationId: correlationId } }); if (!correlation) { throw new processcube_engine_sdk_1.NotFoundError(`Correlation with ID \`${correlationId}\` not found.`); } await index_1.CorrelationMetadataModel.create({ correlationId: correlationId, flowNodeInstanceId: flowNodeInstanceId, key: metaDataKey, value: metaDataValue, }); } getIncludesForSelectQuery(includeProcessInstances) { const includes = [ { model: index_1.CorrelationMetadataModel, attributes: ['key', 'value', 'createdAt'], required: false, }, ]; if (includeProcessInstances) { includes.push({ model: index_1.ProcessInstanceModel, required: false, include: [ { model: index_1.ProcessInstanceMetadataModel, attributes: ['key', 'value', 'createdAt'], required: false, }, { model: index_1.ProcessDefinitionModel, attributes: ['xml'], required: false, }, { model: index_1.FlowNodeInstanceModel, as: 'triggeredByFlowNodeInstance', required: false, }, ], order: [['createdAt', 'DESC']], }); } return includes; } async convertCorrelationToRuntimeObject(dataModel) { const correlation = { correlationId: dataModel.correlationId, metadata: {}, }; dataModel.correlationMetadata ?.sort((first, second) => { return first.createdAt > second.createdAt ? 1 : -1; }) .forEach((metaData) => { correlation.metadata[metaData.key] = metaData.value; }); correlation.processInstances = dataModel.processInstances ? await Promise.all(dataModel.processInstances.map((processInstance) => this.convertProcessInstanceToRuntimeObject(correlation, processInstance))) : undefined; return correlation; } async convertProcessInstanceToRuntimeObject(correlation, processInstanceModel) { let startToken; let endToken; if (processInstanceModel.startToken) { startToken = this.tryParse(processInstanceModel.startToken); } else if (processInstanceModel.startTokenCompressed) { startToken = await (0, Compression_1.decompressToken)(processInstanceModel.startTokenCompressed); } if (processInstanceModel.endToken) { endToken = this.tryParse(processInstanceModel.endToken); } else if (processInstanceModel.endTokenCompressed) { endToken = await (0, Compression_1.decompressToken)(processInstanceModel.endTokenCompressed); } const processInstance = { correlationId: processInstanceModel.correlationId, processInstanceId: processInstanceModel.processInstanceId, processDefinitionId: processInstanceModel.processDefinitionId, processModelId: processInstanceModel.processModelId, embeddedProcessModelId: processInstanceModel.embeddedProcessModelId, processModelName: processInstanceModel.processModelName, hash: processInstanceModel.processModelHash, parentProcessInstanceId: processInstanceModel.parentProcessInstanceId, xml: processInstanceModel.processDefinition?.xml, ownerId: processInstanceModel.ownerId, startedByRootAccessToken: processInstanceModel.startedByRootAccessToken, createdAt: processInstanceModel.createdAt, state: processInstanceModel.state, finishedAt: processInstanceModel.finishedAt, restartedAt: processInstanceModel.restartedAt, durationInMilliseconds: processInstanceModel.durationInMilliseconds ? parseInt(processInstanceModel.durationInMilliseconds) : 0, terminatedByUserId: processInstanceModel.terminatedByUserId, error: (0, processcube_engine_sdk_1.deserializeJson)(processInstanceModel.error), startEventId: processInstanceModel.startEventId, startEventType: processInstanceModel.startEventType, startToken: startToken, endEventId: processInstanceModel.endEventId, endEventType: processInstanceModel.endEventType, endToken: endToken, correlation: { correlationId: correlation.correlationId, metadata: correlation.metadata, }, metadata: {}, triggeredByFlowNodeInstance: await (0, FlowNodeInstanceFactory_1.createFlowNodeInstanceFromModel)(processInstanceModel.triggeredByFlowNodeInstance), }; processInstanceModel.processInstanceMetadata?.forEach((metaData) => { processInstance.metadata[metaData.key] = metaData.value; }); return processInstance; } tryParse(value) { try { return JSON.parse(value); } catch (error) { return value; } } }; exports.CorrelationDatabaseAdapter = CorrelationDatabaseAdapter; exports.CorrelationDatabaseAdapter = CorrelationDatabaseAdapter = __decorate([ (0, inversify_1.injectable)() ], CorrelationDatabaseAdapter); //# sourceMappingURL=CorrelationAdapter.js.map