UNPKG

n8n

Version:

n8n Workflow Automation Tool

333 lines 14.6 kB
"use strict"; const config_1 = require("@n8n/config"); const db_1 = require("@n8n/db"); const di_1 = require("@n8n/di"); const typeorm_1 = require("@n8n/typeorm"); const zod_1 = require("zod"); const bad_request_error_1 = require("../../../../errors/response-errors/bad-request.error"); const not_found_error_1 = require("../../../../errors/response-errors/not-found.error"); const event_service_1 = require("../../../../events/event.service"); const workflow_finder_service_1 = require("../../../../workflows/workflow-finder.service"); const workflow_history_service_1 = require("../../../../workflows/workflow-history/workflow-history.service"); const workflow_service_1 = require("../../../../workflows/workflow.service"); const workflow_service_ee_1 = require("../../../../workflows/workflow.service.ee"); const workflows_service_1 = require("./workflows.service"); const global_middleware_1 = require("../../shared/middlewares/global.middleware"); const pagination_service_1 = require("../../shared/services/pagination.service"); const handleError = (error) => { if (error instanceof not_found_error_1.NotFoundError) { throw error; } if (error instanceof Error) { throw new bad_request_error_1.BadRequestError(error.message); } throw error; }; const workflowHandlers = { createWorkflow: [ (0, global_middleware_1.publicApiScope)('workflow:create'), async (req, res) => { const createdWorkflow = await (0, workflows_service_1.createWorkflow)(req.user, req.body); return res.json(createdWorkflow); }, ], transferWorkflow: [ (0, global_middleware_1.publicApiScope)('workflow:move'), (0, global_middleware_1.projectScope)('workflow:move', 'workflow'), async (req, res) => { const { id: workflowId } = req.params; const body = zod_1.z.object({ destinationProjectId: zod_1.z.string() }).parse(req.body); await di_1.Container.get(workflow_service_ee_1.EnterpriseWorkflowService).transferWorkflow(req.user, workflowId, body.destinationProjectId); return res.status(204).send(); }, ], deleteWorkflow: [ (0, global_middleware_1.publicApiScope)('workflow:delete'), (0, global_middleware_1.projectScope)('workflow:delete', 'workflow'), async (req, res) => { const { id: workflowId } = req.params; const workflow = await di_1.Container.get(workflow_service_1.WorkflowService).delete(req.user, workflowId, true); if (!workflow) { throw new not_found_error_1.NotFoundError('Not Found'); } return res.json(workflow); }, ], getWorkflow: [ (0, global_middleware_1.publicApiScope)('workflow:read'), (0, global_middleware_1.projectScope)('workflow:read', 'workflow'), async (req, res) => { const { id } = req.params; const { excludePinnedData = false } = req.query; const workflow = await di_1.Container.get(workflow_finder_service_1.WorkflowFinderService).findWorkflowForUser(id, req.user, ['workflow:read'], { includeTags: !di_1.Container.get(config_1.GlobalConfig).tags.disabled, includeActiveVersion: true, }); if (!workflow) { throw new not_found_error_1.NotFoundError('Not Found'); } if (excludePinnedData) { delete workflow.pinData; } di_1.Container.get(event_service_1.EventService).emit('user-retrieved-workflow', { userId: req.user.id, publicApi: true, }); return res.json(workflow); }, ], getWorkflowVersion: [ (0, global_middleware_1.publicApiScope)('workflow:read'), (0, global_middleware_1.projectScope)('workflow:read', 'workflow'), async (req, res) => { const { id: workflowId, versionId } = req.params; try { const version = await di_1.Container.get(workflow_history_service_1.WorkflowHistoryService).getVersion(req.user, workflowId, versionId, { includePublishHistory: false }); di_1.Container.get(event_service_1.EventService).emit('user-retrieved-workflow-version', { userId: req.user.id, publicApi: true, }); const { autosaved, ...versionWithoutInternalFields } = version; return res.json(versionWithoutInternalFields); } catch { throw new not_found_error_1.NotFoundError('Version not found'); } }, ], getWorkflows: [ (0, global_middleware_1.publicApiScope)('workflow:list'), global_middleware_1.validCursor, async (req, res) => { const { offset = 0, limit = 100, excludePinnedData = false, active, tags, name, projectId, } = req.query; const where = { ...(name !== undefined && { name: (0, typeorm_1.Like)('%' + name.trim() + '%') }), }; if (active !== undefined) { if (active) { where.activeVersionId = (0, typeorm_1.Not)((0, typeorm_1.IsNull)()); } else { where.activeVersionId = (0, typeorm_1.IsNull)(); } } if (['global:owner', 'global:admin'].includes(req.user.role.slug)) { if (tags) { const workflowIds = await di_1.Container.get(db_1.TagRepository).getWorkflowIdsViaTags((0, workflows_service_1.parseTagNames)(tags)); where.id = (0, typeorm_1.In)(workflowIds); } if (projectId) { const workflowIds = await di_1.Container.get(workflow_finder_service_1.WorkflowFinderService).findAllWorkflowIdsForUser(req.user, ['workflow:read'], undefined, projectId); if (workflowIds.length === 0) { return res.status(200).json({ data: [], nextCursor: null, }); } where.id = (0, typeorm_1.In)(workflowIds); } } else { const options = {}; if (tags) { options.workflowIds = await di_1.Container.get(db_1.TagRepository).getWorkflowIdsViaTags((0, workflows_service_1.parseTagNames)(tags)); } let workflowIds = await di_1.Container.get(workflow_finder_service_1.WorkflowFinderService).findAllWorkflowIdsForUser(req.user, ['workflow:read'], undefined, projectId); if (options.workflowIds) { workflowIds = options.workflowIds.filter((id) => workflowIds.includes(id)); } if (!workflowIds.length) { return res.status(200).json({ data: [], nextCursor: null, }); } where.id = (0, typeorm_1.In)(workflowIds); } const selectFields = [ 'id', 'name', 'active', 'activeVersionId', 'createdAt', 'updatedAt', 'isArchived', 'nodes', 'connections', 'settings', 'staticData', 'meta', 'versionId', 'triggerCount', 'shared', ]; if (!excludePinnedData) { selectFields.push('pinData'); } const relations = ['shared', 'activeVersion']; if (!di_1.Container.get(config_1.GlobalConfig).tags.disabled) { relations.push('tags'); } const [workflows, count] = await di_1.Container.get(db_1.WorkflowRepository).findAndCount({ skip: offset, take: limit, select: selectFields, relations, where, }); if (excludePinnedData) { workflows.forEach((workflow) => { delete workflow.pinData; }); } di_1.Container.get(event_service_1.EventService).emit('user-retrieved-all-workflows', { userId: req.user.id, publicApi: true, }); return res.json({ data: workflows, nextCursor: (0, pagination_service_1.encodeNextCursor)({ offset, limit, numberOfTotalRecords: count, }), }); }, ], updateWorkflow: [ (0, global_middleware_1.publicApiScope)('workflow:update'), (0, global_middleware_1.projectScope)('workflow:update', 'workflow'), async (req, res) => { const { id } = req.params; const updateData = new db_1.WorkflowEntity(); Object.assign(updateData, req.body); try { const updatedWorkflow = await di_1.Container.get(workflow_service_1.WorkflowService).update(req.user, updateData, id, { forceSave: true, publicApi: true, publishIfActive: true, source: 'api', }); return res.json(updatedWorkflow); } catch (error) { return handleError(error); } }, ], activateWorkflow: [ (0, global_middleware_1.publicApiScope)('workflow:activate'), (0, global_middleware_1.projectScope)('workflow:publish', 'workflow'), async (req, res) => { const { id } = req.params; const { versionId, name, description } = req.body; try { const workflow = await di_1.Container.get(workflow_service_1.WorkflowService).activateWorkflow(req.user, id, { versionId, name, description, source: 'api', }); return res.json(workflow); } catch (error) { return handleError(error); } }, ], deactivateWorkflow: [ (0, global_middleware_1.publicApiScope)('workflow:deactivate'), (0, global_middleware_1.projectScope)('workflow:unpublish', 'workflow'), async (req, res) => { const { id } = req.params; try { const workflow = await di_1.Container.get(workflow_service_1.WorkflowService).deactivateWorkflow(req.user, id, { source: 'api', }); return res.json(workflow); } catch (error) { return handleError(error); } }, ], getWorkflowTags: [ (0, global_middleware_1.publicApiScope)('workflowTags:list'), (0, global_middleware_1.projectScope)('workflow:read', 'workflow'), async (req, res) => { const { id } = req.params; if (di_1.Container.get(config_1.GlobalConfig).tags.disabled) { throw new bad_request_error_1.BadRequestError('Workflow Tags Disabled'); } const workflow = await di_1.Container.get(workflow_finder_service_1.WorkflowFinderService).findWorkflowForUser(id, req.user, ['workflow:read']); if (!workflow) { throw new not_found_error_1.NotFoundError('Not Found'); } const tags = await (0, workflows_service_1.getWorkflowTags)(id); return res.json(tags); }, ], updateWorkflowTags: [ (0, global_middleware_1.publicApiScope)('workflowTags:update'), (0, global_middleware_1.projectScope)('workflow:update', 'workflow'), async (req, res) => { const { id } = req.params; const newTags = req.body.map((newTag) => newTag.id); if (di_1.Container.get(config_1.GlobalConfig).tags.disabled) { throw new bad_request_error_1.BadRequestError('Workflow Tags Disabled'); } const sharedWorkflow = await di_1.Container.get(workflow_finder_service_1.WorkflowFinderService).findWorkflowForUser(id, req.user, ['workflow:update']); if (!sharedWorkflow) { throw new not_found_error_1.NotFoundError('Not Found'); } let tags; try { await (0, workflows_service_1.updateTags)(id, newTags); tags = await (0, workflows_service_1.getWorkflowTags)(id); } catch (error) { if (error instanceof typeorm_1.QueryFailedError) { throw new not_found_error_1.NotFoundError('Some tags not found'); } return handleError(error); } return res.json(tags); }, ], archiveWorkflow: [ (0, global_middleware_1.publicApiScope)('workflow:delete'), (0, global_middleware_1.projectScope)('workflow:delete', 'workflow'), async (req, res) => { const { id } = req.params; try { const workflow = await di_1.Container.get(workflow_service_1.WorkflowService).archiveForPublicApi(req.user, id); if (!workflow) { throw new not_found_error_1.NotFoundError('Workflow not found'); } return res.json(workflow); } catch (error) { return handleError(error); } }, ], unarchiveWorkflow: [ (0, global_middleware_1.publicApiScope)('workflow:delete'), (0, global_middleware_1.projectScope)('workflow:delete', 'workflow'), async (req, res) => { const { id } = req.params; try { const workflow = await di_1.Container.get(workflow_service_1.WorkflowService).unarchiveForPublicApi(req.user, id); if (!workflow) { throw new not_found_error_1.NotFoundError('Workflow not found'); } return res.json(workflow); } catch (error) { return handleError(error); } }, ], }; module.exports = workflowHandlers; //# sourceMappingURL=workflows.handler.js.map