UNPKG

@nocobase/plugin-workflow

Version:

A powerful BPM tool that provides foundational support for business automation, with the capability to extend unlimited triggers and nodes.

189 lines (187 loc) • 6.35 kB
/** * This file is part of the NocoBase (R) project. * Copyright (c) 2020-2024 NocoBase Co., Ltd. * Authors: NocoBase Team. * * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License. * For more information, please refer to: https://www.nocobase.com/agreement. */ var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var workflows_exports = {}; __export(workflows_exports, { destroy: () => destroy, execute: () => execute, revision: () => revision, sync: () => sync, update: () => update }); module.exports = __toCommonJS(workflows_exports); var import_actions = __toESM(require("@nocobase/actions")); var import_database = require("@nocobase/database"); var import_Plugin = __toESM(require("../Plugin")); async function update(context, next) { const repository = import_actions.utils.getRepositoryFromParams(context); const { filterByTk, values } = context.action.params; context.action.mergeParams({ whitelist: ["title", "description", "enabled", "triggerTitle", "config", "options", "categories"] }); if (Object.keys(values).includes("config")) { const workflow = await repository.findOne({ filterByTk, appends: ["versionStats"] }); if (workflow.versionStats.executed > 0) { return context.throw(400, "config of executed workflow can not be updated"); } } return import_actions.default.update(context, next); } async function destroy(context, next) { const repository = import_actions.utils.getRepositoryFromParams(context); const { filterByTk, filter } = context.action.params; await context.db.sequelize.transaction(async (transaction) => { const items = await repository.find({ filterByTk, filter, fields: ["id", "key", "current"], transaction }); const ids = new Set(items.map((item) => item.id)); const keysSet = new Set(items.filter((item) => item.current).map((item) => item.key)); const revisions = await repository.find({ filter: { key: Array.from(keysSet), current: { [import_database.Op.not]: true } }, fields: ["id"], transaction }); revisions.forEach((item) => ids.add(item.id)); const deleted = await repository.destroy({ filterByTk: Array.from(ids), individualHooks: true, transaction }); const StatsRepo = context.db.getRepository("workflowStats"); await StatsRepo.destroy({ filter: { key: Array.from(keysSet) }, transaction }); context.body = deleted; }); next(); } async function revision(context, next) { const repository = import_actions.utils.getRepositoryFromParams(context); const { filterByTk, filter = {}, values = {} } = context.action.params; context.body = await repository.revision({ filterByTk, filter, values, context }); await next(); } async function sync(context, next) { const plugin = context.app.getPlugin(import_Plugin.default); const repository = import_actions.utils.getRepositoryFromParams(context); const { filterByTk, filter = {} } = context.action.params; const workflows = await repository.find({ filterByTk, filter }); workflows.forEach((workflow) => { plugin.toggle(workflow, false); plugin.toggle(workflow); }); context.status = 204; await next(); } async function execute(context, next) { const plugin = context.app.pm.get(import_Plugin.default); const { filterByTk, values, autoRevision } = context.action.params; if (!values) { return context.throw(400, "values is required"); } if (!filterByTk) { return context.throw(400, "filterByTk is required"); } const id = Number.parseInt(filterByTk, 10); if (Number.isNaN(id)) { return context.throw(400, "filterByTk is invalid"); } const repository = import_actions.utils.getRepositoryFromParams(context); const workflow = plugin.enabledCache.get(id) || await repository.findOne({ filterByTk }); if (!workflow) { return context.throw(404, "workflow not found"); } const { executed } = workflow; let processor; try { processor = await plugin.execute(workflow, values, { manually: true }); if (!processor) { return context.throw(400, "workflow not triggered"); } } catch (ex) { return context.throw(400, ex.message); } context.action.mergeParams({ filter: { key: workflow.key } }); let newVersion; if (executed == 0 && autoRevision) { newVersion = await repository.revision({ filterByTk: workflow.id, filter: { key: workflow.key }, values: { current: workflow.current, enabled: workflow.enabled }, context }); } context.body = { execution: { id: processor.execution.id, status: processor.execution.status }, newVersionId: newVersion == null ? void 0 : newVersion.id }; return next(); } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { destroy, execute, revision, sync, update });