n8n
Version:
n8n Workflow Automation Tool
140 lines • 7.48 kB
JavaScript
;
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