n8n
Version:
n8n Workflow Automation Tool
249 lines • 12.6 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
const typedi_1 = require("typedi");
const typeorm_1 = require("@n8n/typeorm");
const uuid_1 = require("uuid");
const ActiveWorkflowManager_1 = require("../../../../ActiveWorkflowManager");
const config_1 = __importDefault(require("../../../../config"));
const WorkflowEntity_1 = require("../../../../databases/entities/WorkflowEntity");
const ExternalHooks_1 = require("../../../../ExternalHooks");
const WorkflowHelpers_1 = require("../../../../WorkflowHelpers");
const global_middleware_1 = require("../../shared/middlewares/global.middleware");
const pagination_service_1 = require("../../shared/services/pagination.service");
const workflows_service_1 = require("./workflows.service");
const workflow_service_1 = require("../../../../workflows/workflow.service");
const InternalHooks_1 = require("../../../../InternalHooks");
const workflowHistory_service_ee_1 = require("../../../../workflows/workflowHistory/workflowHistory.service.ee");
const sharedWorkflow_repository_1 = require("../../../../databases/repositories/sharedWorkflow.repository");
const tag_repository_1 = require("../../../../databases/repositories/tag.repository");
const workflow_repository_1 = require("../../../../databases/repositories/workflow.repository");
const project_repository_1 = require("../../../../databases/repositories/project.repository");
module.exports = {
createWorkflow: [
async (req, res) => {
const workflow = req.body;
workflow.active = false;
workflow.versionId = (0, uuid_1.v4)();
await (0, WorkflowHelpers_1.replaceInvalidCredentials)(workflow);
(0, WorkflowHelpers_1.addNodeIds)(workflow);
const project = await typedi_1.Container.get(project_repository_1.ProjectRepository).getPersonalProjectForUserOrFail(req.user.id);
const createdWorkflow = await (0, workflows_service_1.createWorkflow)(workflow, req.user, project, 'workflow:owner');
await typedi_1.Container.get(workflowHistory_service_ee_1.WorkflowHistoryService).saveVersion(req.user, createdWorkflow, createdWorkflow.id);
await typedi_1.Container.get(ExternalHooks_1.ExternalHooks).run('workflow.afterCreate', [createdWorkflow]);
void typedi_1.Container.get(InternalHooks_1.InternalHooks).onWorkflowCreated(req.user, createdWorkflow, project, true);
return res.json(createdWorkflow);
},
],
deleteWorkflow: [
(0, global_middleware_1.projectScope)('workflow:delete', 'workflow'),
async (req, res) => {
const { id: workflowId } = req.params;
const workflow = await typedi_1.Container.get(workflow_service_1.WorkflowService).delete(req.user, workflowId);
if (!workflow) {
return res.status(404).json({ message: 'Not Found' });
}
return res.json(workflow);
},
],
getWorkflow: [
(0, global_middleware_1.projectScope)('workflow:read', 'workflow'),
async (req, res) => {
const { id } = req.params;
const workflow = await typedi_1.Container.get(sharedWorkflow_repository_1.SharedWorkflowRepository).findWorkflowForUser(id, req.user, ['workflow:read'], { includeTags: !config_1.default.getEnv('workflowTagsDisabled') });
if (!workflow) {
return res.status(404).json({ message: 'Not Found' });
}
void typedi_1.Container.get(InternalHooks_1.InternalHooks).onUserRetrievedWorkflow({
user_id: req.user.id,
public_api: true,
});
return res.json(workflow);
},
],
getWorkflows: [
global_middleware_1.validCursor,
async (req, res) => {
const { offset = 0, limit = 100, active, tags, name } = req.query;
const where = {
...(active !== undefined && { active }),
...(name !== undefined && { name: (0, typeorm_1.Like)('%' + name.trim() + '%') }),
};
if (['global:owner', 'global:admin'].includes(req.user.role)) {
if (tags) {
const workflowIds = await typedi_1.Container.get(tag_repository_1.TagRepository).getWorkflowIdsViaTags((0, workflows_service_1.parseTagNames)(tags));
where.id = (0, typeorm_1.In)(workflowIds);
}
}
else {
const options = {};
if (tags) {
options.workflowIds = await typedi_1.Container.get(tag_repository_1.TagRepository).getWorkflowIdsViaTags((0, workflows_service_1.parseTagNames)(tags));
}
let workflows = await typedi_1.Container.get(sharedWorkflow_repository_1.SharedWorkflowRepository).findAllWorkflowsForUser(req.user, ['workflow:read']);
if (options.workflowIds) {
const workflowIds = options.workflowIds;
workflows = workflows.filter((wf) => workflowIds.includes(wf.id));
}
if (!workflows.length) {
return res.status(200).json({
data: [],
nextCursor: null,
});
}
const workflowsIds = workflows.map((wf) => wf.id);
where.id = (0, typeorm_1.In)(workflowsIds);
}
const [workflows, count] = await typedi_1.Container.get(workflow_repository_1.WorkflowRepository).findAndCount({
skip: offset,
take: limit,
where,
...(!config_1.default.getEnv('workflowTagsDisabled') && { relations: ['tags'] }),
});
void typedi_1.Container.get(InternalHooks_1.InternalHooks).onUserRetrievedAllWorkflows({
user_id: req.user.id,
public_api: true,
});
return res.json({
data: workflows,
nextCursor: (0, pagination_service_1.encodeNextCursor)({
offset,
limit,
numberOfTotalRecords: count,
}),
});
},
],
updateWorkflow: [
(0, global_middleware_1.projectScope)('workflow:update', 'workflow'),
async (req, res) => {
const { id } = req.params;
const updateData = new WorkflowEntity_1.WorkflowEntity();
Object.assign(updateData, req.body);
updateData.id = id;
updateData.versionId = (0, uuid_1.v4)();
const workflow = await typedi_1.Container.get(sharedWorkflow_repository_1.SharedWorkflowRepository).findWorkflowForUser(id, req.user, ['workflow:update']);
if (!workflow) {
return res.status(404).json({ message: 'Not Found' });
}
await (0, WorkflowHelpers_1.replaceInvalidCredentials)(updateData);
(0, WorkflowHelpers_1.addNodeIds)(updateData);
const workflowManager = typedi_1.Container.get(ActiveWorkflowManager_1.ActiveWorkflowManager);
if (workflow.active) {
await workflowManager.remove(id);
}
try {
await (0, workflows_service_1.updateWorkflow)(workflow.id, updateData);
}
catch (error) {
if (error instanceof Error) {
return res.status(400).json({ message: error.message });
}
}
if (workflow.active) {
try {
await workflowManager.add(workflow.id, 'update');
}
catch (error) {
if (error instanceof Error) {
return res.status(400).json({ message: error.message });
}
}
}
const updatedWorkflow = await (0, workflows_service_1.getWorkflowById)(workflow.id);
if (updatedWorkflow) {
await typedi_1.Container.get(workflowHistory_service_ee_1.WorkflowHistoryService).saveVersion(req.user, updatedWorkflow, workflow.id);
}
await typedi_1.Container.get(ExternalHooks_1.ExternalHooks).run('workflow.afterUpdate', [updateData]);
void typedi_1.Container.get(InternalHooks_1.InternalHooks).onWorkflowSaved(req.user, updateData, true);
return res.json(updatedWorkflow);
},
],
activateWorkflow: [
(0, global_middleware_1.projectScope)('workflow:update', 'workflow'),
async (req, res) => {
const { id } = req.params;
const workflow = await typedi_1.Container.get(sharedWorkflow_repository_1.SharedWorkflowRepository).findWorkflowForUser(id, req.user, ['workflow:update']);
if (!workflow) {
return res.status(404).json({ message: 'Not Found' });
}
if (!workflow.active) {
try {
await typedi_1.Container.get(ActiveWorkflowManager_1.ActiveWorkflowManager).add(workflow.id, 'activate');
}
catch (error) {
if (error instanceof Error) {
return res.status(400).json({ message: error.message });
}
}
await (0, workflows_service_1.setWorkflowAsActive)(workflow);
workflow.active = true;
return res.json(workflow);
}
return res.json(workflow);
},
],
deactivateWorkflow: [
(0, global_middleware_1.projectScope)('workflow:update', 'workflow'),
async (req, res) => {
const { id } = req.params;
const workflow = await typedi_1.Container.get(sharedWorkflow_repository_1.SharedWorkflowRepository).findWorkflowForUser(id, req.user, ['workflow:update']);
if (!workflow) {
return res.status(404).json({ message: 'Not Found' });
}
const activeWorkflowManager = typedi_1.Container.get(ActiveWorkflowManager_1.ActiveWorkflowManager);
if (workflow.active) {
await activeWorkflowManager.remove(workflow.id);
await (0, workflows_service_1.setWorkflowAsInactive)(workflow);
workflow.active = false;
return res.json(workflow);
}
return res.json(workflow);
},
],
getWorkflowTags: [
(0, global_middleware_1.projectScope)('workflow:read', 'workflow'),
async (req, res) => {
const { id } = req.params;
if (config_1.default.getEnv('workflowTagsDisabled')) {
return res.status(400).json({ message: 'Workflow Tags Disabled' });
}
const workflow = await typedi_1.Container.get(sharedWorkflow_repository_1.SharedWorkflowRepository).findWorkflowForUser(id, req.user, ['workflow:read']);
if (!workflow) {
return res.status(404).json({ message: 'Not Found' });
}
const tags = await (0, workflows_service_1.getWorkflowTags)(id);
return res.json(tags);
},
],
updateWorkflowTags: [
(0, global_middleware_1.projectScope)('workflow:update', 'workflow'),
async (req, res) => {
const { id } = req.params;
const newTags = req.body.map((newTag) => newTag.id);
if (config_1.default.getEnv('workflowTagsDisabled')) {
return res.status(400).json({ message: 'Workflow Tags Disabled' });
}
const sharedWorkflow = await typedi_1.Container.get(sharedWorkflow_repository_1.SharedWorkflowRepository).findWorkflowForUser(id, req.user, ['workflow:update']);
if (!sharedWorkflow) {
return res.status(404).json({ message: '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) {
return res.status(404).json({ message: 'Some tags not found' });
}
else {
throw error;
}
}
return res.json(tags);
},
],
};
//# sourceMappingURL=workflows.handler.js.map