@5minds/processcube_engine
Version:
The ProcessCube Engine. Stores and executes BPMNs.
179 lines • 8.74 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.DataObjectInstanceDatabaseAdapter = 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 SearchQueryBuilder_1 = require("./Lib/SearchQueryBuilder");
const SequelizeConnectionManager_1 = require("./Lib/SequelizeConnectionManager");
const index_1 = require("./Models/index");
let DataObjectInstanceDatabaseAdapter = class DataObjectInstanceDatabaseAdapter extends BaseDatabaseAdapter_1.DatabaseAdapter {
async initialize() {
await super.initialize('database_adapter:data_objects');
}
async storeValue(request) {
this.validateCreateRequest(request);
const valueToStore = request.value ?? {};
const encodedValue = !this.config.compressProcessTokens ? (0, processcube_engine_sdk_1.serializeJson)(valueToStore) : undefined;
const compressedValue = this.config.compressProcessTokens ? await (0, Compression_1.compressToken)(valueToStore) : undefined;
const createRequest = {
dataObjectId: request.dataObjectId,
processDefinitionId: request.processDefinitionId,
processModelId: request.processModelId,
embeddedProcessModelId: request.embeddedProcessModelId,
processInstanceId: request.processInstanceId,
flowNodeInstanceId: request.flowNodeInstanceId,
value: encodedValue,
valueCompressed: compressedValue,
};
return (0, SequelizeConnectionManager_1.executeWithRetry)(async () => {
await index_1.DataObjectModel.create(createRequest);
}, 'store data object value');
}
async query(query, offset = 0, limit = 0, sort, includeCount) {
const includeOnlyNonDeleted = { [sequelize_1.Op.or]: [{ '$processInstance.deleted$': false }, { '$processInstance.deleted$': { [sequelize_1.Op.is]: null } }] };
const hasQuery = Object.keys(query).length > 0;
const whereClause = hasQuery
? {
[sequelize_1.Op.and]: [includeOnlyNonDeleted, (0, SearchQueryBuilder_1.buildWhereClause)(query)],
}
: includeOnlyNonDeleted;
const options = {
where: whereClause,
include: [
{
model: index_1.ProcessInstanceModel,
as: 'processInstance',
attributes: ['deleted'],
required: false,
},
],
...(0, SearchQueryBuilder_1.buildPagination)(offset, limit),
order: [[sort?.sortBy ?? 'id', sort?.sortDir ?? 'DESC']],
};
if (!includeCount) {
return this.getDataObjectsWithoutCount(options);
}
return this.getDataObjectsWithCount(options);
}
async queryCount(query) {
return (0, SequelizeConnectionManager_1.executeWithRetry)(async () => index_1.DataObjectModel.count({
where: (0, SearchQueryBuilder_1.buildWhereClause)(query),
col: 'dataObjectId',
}), 'query data object count');
}
async deleteByProcessDefinitionId(processDefinitionId) {
return (0, SequelizeConnectionManager_1.executeWithRetry)(async () => index_1.DataObjectModel.destroy({
where: {
processDefinitionId: processDefinitionId,
},
}), `delete data objects for process definition id '${processDefinitionId}'`);
}
static async deleteByProcessDefinitionId(processDefinitionId, deleteTransaction) {
let dataObjectInstancesToRemove = await (0, SequelizeConnectionManager_1.executeWithRetry)(async () => index_1.DataObjectModel.count({
where: {
processDefinitionId: processDefinitionId,
},
transaction: deleteTransaction,
}), `get data object instances to remove for process definition id '${processDefinitionId}'`);
const deleteChunkSize = 1000;
while (dataObjectInstancesToRemove > 0) {
dataObjectInstancesToRemove -= deleteChunkSize;
await (0, SequelizeConnectionManager_1.executeWithRetry)(async () => index_1.DataObjectModel.destroy({
where: {
processDefinitionId: processDefinitionId,
},
limit: deleteChunkSize,
transaction: deleteTransaction,
}), `delete data objects for process definition id '${processDefinitionId}'`);
}
}
validateCreateRequest(request) {
const missingProperties = [];
if (!request.dataObjectId) {
missingProperties.push('dataObjectId');
}
if (!request.processInstanceId) {
missingProperties.push('processInstanceId');
}
if (!request.processDefinitionId) {
missingProperties.push('processDefinitionId');
}
if (!request.processModelId) {
missingProperties.push('processModelId');
}
if (!request.flowNodeInstanceId) {
missingProperties.push('flowNodeInstanceId');
}
if (!request.value) {
missingProperties.push('value');
}
if (missingProperties.length > 0) {
const createError = new processcube_engine_sdk_1.BadRequestError('Cannot write to DataObject: Create Request is missing some properties.');
createError.additionalInformation = {
missingProperties: missingProperties,
};
throw createError;
}
}
async getDataObjectsWithCount(options) {
const { count, rows } = await (0, SequelizeConnectionManager_1.executeWithRetry)(async () => index_1.DataObjectModel.findAndCountAll(options), 'query data objects');
const dataObjects = [];
for (const dataObject of rows) {
const runtimeDataObject = await this.convertToRuntimeDataObject(dataObject);
dataObjects.push(runtimeDataObject);
}
return {
dataObjectInstances: dataObjects,
totalCount: count,
};
}
async getDataObjectsWithoutCount(options) {
const rows = await (0, SequelizeConnectionManager_1.executeWithRetry)(async () => index_1.DataObjectModel.findAll(options), 'query data objects');
const dataObjects = [];
for (const dataObject of rows) {
const runtimeDataObject = await this.convertToRuntimeDataObject(dataObject);
dataObjects.push(runtimeDataObject);
}
return {
dataObjectInstances: dataObjects,
totalCount: undefined,
};
}
async convertToRuntimeDataObject(dataModel) {
const dataObject = {
dataObjectId: dataModel.dataObjectId,
processDefinitionId: dataModel.processDefinitionId,
processModelId: dataModel.processModelId,
embeddedProcessModelId: dataModel.embeddedProcessModelId,
processInstanceId: dataModel.processInstanceId,
flowNodeInstanceId: dataModel.flowNodeInstanceId,
value: await this.deserializeDataObjectValue(dataModel.value, dataModel.valueCompressed),
createdAt: dataModel.createdAt,
updatedAt: dataModel.updatedAt,
};
return dataObject;
}
async deserializeDataObjectValue(uncompressedValue, compressedValue) {
if (uncompressedValue) {
return (0, processcube_engine_sdk_1.deserializeJson)(uncompressedValue);
}
if (compressedValue) {
return (0, Compression_1.decompressToken)(compressedValue);
}
return {};
}
};
exports.DataObjectInstanceDatabaseAdapter = DataObjectInstanceDatabaseAdapter;
exports.DataObjectInstanceDatabaseAdapter = DataObjectInstanceDatabaseAdapter = __decorate([
(0, inversify_1.injectable)()
], DataObjectInstanceDatabaseAdapter);
//# sourceMappingURL=DataObjectInstanceAdapter.js.map