@5minds/processcube_engine
Version:
The ProcessCube Engine. Stores and executes BPMNs.
212 lines • 10.7 kB
JavaScript
;
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