UNPKG

@5minds/processcube_engine

Version:

The ProcessCube Engine. Stores and executes BPMNs.

179 lines • 8.74 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.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