n8n
Version:
n8n Workflow Automation Tool
206 lines • 9.51 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
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;
};
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ImportPipeline = void 0;
const config_1 = require("@n8n/config");
const db_1 = require("@n8n/db");
const di_1 = require("@n8n/di");
const n8n_workflow_1 = require("n8n-workflow");
const zod_1 = require("zod");
const bad_request_error_1 = require("../../../errors/response-errors/bad-request.error");
const forbidden_error_1 = require("../../../errors/response-errors/forbidden.error");
const not_found_error_1 = require("../../../errors/response-errors/not-found.error");
const event_service_1 = require("../../../events/event.service");
const folder_service_1 = require("../../../services/folder.service");
const project_service_ee_1 = require("../../../services/project.service.ee");
const WorkflowHelpers = __importStar(require("../../../workflow-helpers"));
const workflow_creation_service_1 = require("../../../workflows/workflow-creation.service");
const workflow_serializer_1 = require("../entities/workflow/workflow.serializer");
const tar_package_reader_1 = require("../io/tar/tar-package-reader");
const manifest_schema_1 = require("../spec/manifest.schema");
const MEGABYTE_IN_BYTES = 1024 * 1024;
let ImportPipeline = class ImportPipeline {
constructor(workflowSerializer, workflowCreationService, globalConfig, projectRepository, projectService, folderService, eventService) {
this.workflowSerializer = workflowSerializer;
this.workflowCreationService = workflowCreationService;
this.projectRepository = projectRepository;
this.projectService = projectService;
this.folderService = folderService;
this.eventService = eventService;
this.maxUncompressedPackageBytes = globalConfig.endpoints.payloadSizeMax * MEGABYTE_IN_BYTES;
}
async run(request) {
const reader = new tar_package_reader_1.TarPackageReader(request.packageBuffer, this.maxUncompressedPackageBytes);
const manifest = await this.loadPackageManifest(reader);
const { target } = await this.resolveTarget(request.user, request.projectId, request.folderId);
const prepared = await this.prepareWorkflows(manifest.workflows ?? [], reader);
const created = [];
for (const { entity, sourceId } of prepared) {
const saved = await this.workflowCreationService.createWorkflow(request.user, entity, {
projectId: target.projectId,
parentFolderId: target.folderId ?? undefined,
publicApi: true,
source: 'import',
sourceWorkflowId: sourceId,
});
created.push(saved);
}
this.eventService.emit('workflows-imported', {
user: request.user,
projectId: target.projectId,
workflowIds: created.map((w) => w.id),
packageSourceId: manifest.sourceId,
packageVersion: manifest.packageFormatVersion,
});
return {
package: {
sourceN8nVersion: manifest.sourceN8nVersion,
sourceId: manifest.sourceId,
exportedAt: manifest.exportedAt,
},
workflows: created.map((w) => ({
sourceId: w.sourceWorkflowId ?? '',
localId: w.id,
name: w.name,
projectId: target.projectId,
parentFolderId: w.parentFolder?.id ?? null,
activeVersionId: w.activeVersionId ?? null,
})),
};
}
async loadPackageManifest(reader) {
try {
const rawManifest = await reader.readManifest();
return manifest_schema_1.packageManifestSchema.parse(rawManifest);
}
catch (error) {
if (error instanceof bad_request_error_1.BadRequestError)
throw error;
if (error instanceof zod_1.ZodError) {
throw new bad_request_error_1.BadRequestError('Package manifest failed validation');
}
throw new bad_request_error_1.BadRequestError('Failed to read package manifest');
}
}
async prepareWorkflows(entries, reader) {
const prepared = [];
for (const entry of entries) {
const path = `${entry.target}/workflow.json`;
let content;
try {
content = await reader.readFile(path);
}
catch (cause) {
throw new n8n_workflow_1.UserError(`Package manifest references a missing workflow file at ${path}.`, {
cause,
});
}
const wire = (0, n8n_workflow_1.jsonParse)(content.toString('utf-8'), {
errorMessage: `Package workflow file at ${path} is not valid JSON.`,
});
let entity;
try {
const partial = this.workflowSerializer.deserialize(wire);
entity = Object.assign(new db_1.WorkflowEntity(), partial);
}
catch (cause) {
if (cause instanceof zod_1.ZodError) {
throw new n8n_workflow_1.UserError(`Package workflow file at ${path} failed schema validation.`, {
cause,
});
}
throw cause;
}
WorkflowHelpers.validateWorkflowStructure(entity);
prepared.push({ entity, sourceId: entry.id });
}
return prepared;
}
async resolveTarget(user, projectId, folderId) {
const project = await this.resolveImportProject(user, projectId);
await this.assertFolderExistsInProject(folderId, project.id);
return {
project,
target: { projectId: project.id, folderId: folderId ?? null },
};
}
async resolveImportProject(user, projectId) {
if (projectId === undefined) {
return await this.projectRepository.getPersonalProjectForUserOrFail(user.id);
}
const project = await this.projectService.getProjectWithScope(user, projectId, [
'workflow:import',
]);
if (project) {
return project;
}
if (!(await this.projectRepository.existsBy({ id: projectId }))) {
throw new not_found_error_1.NotFoundError(`Project not found: ${projectId}`);
}
throw new forbidden_error_1.ForbiddenError('You do not have permission to import workflows into this project.');
}
async assertFolderExistsInProject(folderId, projectId) {
if (folderId === undefined) {
return;
}
try {
await this.folderService.findFolderInProjectOrFail(folderId, projectId);
}
catch (cause) {
throw new n8n_workflow_1.UserError(`Folder not found in target project: ${folderId}`, { cause });
}
}
};
exports.ImportPipeline = ImportPipeline;
exports.ImportPipeline = ImportPipeline = __decorate([
(0, di_1.Service)(),
__metadata("design:paramtypes", [workflow_serializer_1.WorkflowSerializer,
workflow_creation_service_1.WorkflowCreationService,
config_1.GlobalConfig,
db_1.ProjectRepository,
project_service_ee_1.ProjectService,
folder_service_1.FolderService,
event_service_1.EventService])
], ImportPipeline);
//# sourceMappingURL=import-pipeline.js.map