UNPKG

n8n

Version:

n8n Workflow Automation Tool

140 lines • 7.48 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; }; 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.WorkflowPackageImporter = void 0; const backend_common_1 = require("@n8n/backend-common"); const di_1 = require("@n8n/di"); const n8n_workflow_1 = require("n8n-workflow"); 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 import_orchestrator_1 = require("./import-orchestrator"); const import_result_1 = require("./import-result"); const import_telemetry_1 = require("./import-telemetry"); const n8n_package_parser_1 = require("./n8n-package-parser"); let WorkflowPackageImporter = class WorkflowPackageImporter { constructor(packageParser, importOrchestrator, projectService, folderService, eventService, licenseState) { this.packageParser = packageParser; this.importOrchestrator = importOrchestrator; this.projectService = projectService; this.folderService = folderService; this.eventService = eventService; this.licenseState = licenseState; } async import(request, reader, manifest) { const folders = await this.packageParser.getFolders(reader); if (folders.length > 0) { this.assertFoldersLicensed(); (0, import_result_1.assertPackageImportApiKeyScopes)(request.apiKeyScopes, ['folder:create', 'folder:update']); } const context = await this.findImportLocation(request.user, request.projectId, request.folderId, folders.length > 0); const workflows = await this.packageParser.getWorkflows(reader); const credentialRequest = { requirements: (0, import_result_1.identifyRequirements)(manifest.requirements?.credentials, workflows), matchingMode: request.credentialMatchingMode, missingMode: request.credentialMissingMode, credentialBindings: request.bindings?.credentials, }; const dataTableRequirements = (0, import_result_1.identifyRequirements)(manifest.requirements?.dataTables, workflows); if (dataTableRequirements?.length && request.dataTableMissingMode === 'create') { (0, import_result_1.assertPackageImportApiKeyScopes)(request.apiKeyScopes, ['dataTable:create']); } const dataTableRequest = { requirements: dataTableRequirements, packageDataTables: await this.packageParser.getDataTables(reader), matchingMode: request.dataTableMatchingMode, missingMode: request.dataTableMissingMode, schemaConflictPolicy: request.dataTableSchemaConflictPolicy, }; const variableRequest = { requirements: (0, import_result_1.identifyRequirements)(manifest.requirements?.variables, workflows), missingMode: request.variableMissingMode, }; const imported = await this.importOrchestrator.import({ context, folders, workflows, credentialRequest, dataTableRequest, variableRequest, options: request, }); (0, import_telemetry_1.emitPackageImportedEvent)(this.eventService, { request, manifest, scopes: [{ context, imported, credentialRequest, dataTableRequest, variableRequest }], }); return (0, import_result_1.buildImportResult)({ package: (0, import_result_1.toPackageSummary)(manifest), workflows: (0, import_result_1.toImportedWorkflowSummaries)(imported.workflowOutcomes, context.projectId), folders: imported.folderSummaries, projects: [], bindings: imported.bindings, credentials: { matched: imported.credentialResult.matched, stubbed: imported.credentialResult.stubbed, }, variables: { matched: imported.variablePlan.matched, missing: imported.variablePlan.missing.map(({ name }) => name), }, }); } assertFoldersLicensed() { if (!this.licenseState.isLicensed('feat:folders')) { throw new forbidden_error_1.ForbiddenError('Your license does not allow folders. Importing a package with folders requires a license that supports folders.'); } } async findImportLocation(user, projectId, folderId, needsFolderCreate) { const scopes = needsFolderCreate ? ['workflow:import', 'folder:create', 'folder:update'] : ['workflow:import']; const project = await this.resolveImportProject(user, projectId, scopes); await this.assertFolderExistsInProject(folderId, project.id); return { user, projectId: project.id, folderId: folderId ?? null }; } async resolveImportProject(user, projectId, scopes) { if (projectId === undefined) { const personalProject = await this.projectService.getPersonalProject(user); if (!personalProject) { throw new not_found_error_1.NotFoundError('Personal project not found'); } return personalProject; } const project = await this.projectService.getProjectWithScope(user, projectId, scopes); if (project) { return project; } if (!(await this.projectService.findProject(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 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.WorkflowPackageImporter = WorkflowPackageImporter; exports.WorkflowPackageImporter = WorkflowPackageImporter = __decorate([ (0, di_1.Service)(), __metadata("design:paramtypes", [n8n_package_parser_1.N8nPackageParser, import_orchestrator_1.ImportOrchestrator, project_service_ee_1.ProjectService, folder_service_1.FolderService, event_service_1.EventService, backend_common_1.LicenseState]) ], WorkflowPackageImporter); //# sourceMappingURL=workflow-package-importer.js.map