n8n
Version:
n8n Workflow Automation Tool
116 lines • 6.25 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.FolderExporter = void 0;
const di_1 = require("@n8n/di");
const folder_finder_service_1 = require("../../../../services/folder-finder.service");
const workflow_finder_service_1 = require("../../../../workflows/workflow-finder.service");
const folder_serializer_1 = require("./folder.serializer");
const unique_filename_allocator_1 = require("../../io/unique-filename-allocator");
const package_export_errors_1 = require("../package-export.errors");
const requirements_types_1 = require("../requirements.types");
const workflow_exporter_1 = require("../workflow/workflow.exporter");
let FolderExporter = class FolderExporter {
constructor(folderFinder, folderSerializer, workflowFinder, workflowExporter) {
this.folderFinder = folderFinder;
this.folderSerializer = folderSerializer;
this.workflowFinder = workflowFinder;
this.workflowExporter = workflowExporter;
}
async export(request) {
const folders = await this.folderFinder.findFolderSubtreesForUser(request.folderIds, request.user, ['folder:read']);
await (0, package_export_errors_1.assertEveryRequestedEntityAccessible)('folder', request.folderIds, folders, async (ids) => await this.folderFinder.findExistingFolderIds(ids));
const { roots, childrenByParent } = this.buildForest(folders);
const workflowIdsByFolder = await this.workflowFinder.findWorkflowIdsByFolder(folders.map((folder) => folder.id));
const foldersDir = request.basePrefix ? `${request.basePrefix}/folders` : 'folders';
return await this.exportLevel(roots, foldersDir, null, {
childrenByParent,
workflowIdsByFolder,
request,
});
}
buildForest(folders) {
const idsInSet = new Set(folders.map((folder) => folder.id));
const roots = [];
const childrenByParent = new Map();
for (const folder of folders) {
const parentId = folder.parentFolderId;
if (parentId && idsInSet.has(parentId)) {
const siblings = childrenByParent.get(parentId) ?? [];
siblings.push(folder);
childrenByParent.set(parentId, siblings);
}
else {
roots.push(folder);
}
}
return { roots, childrenByParent };
}
async exportLevel(siblings, parentDir, effectiveParentId, context, reservedName) {
const allocator = new unique_filename_allocator_1.UniqueFilenameAllocator(parentDir, 'folder');
if (reservedName)
allocator.reserve(reservedName);
const results = [];
for (const folder of this.orderedByCreation(siblings)) {
const target = allocator.allocate(folder.name);
results.push(await this.exportFolder(folder, target, effectiveParentId, context));
}
return this.mergeFolderExportResults(results);
}
async exportFolder(folder, target, effectiveParentId, context) {
const { childrenByParent, workflowIdsByFolder, request } = context;
this.exportFolderShell(folder, target, effectiveParentId, request.writer);
const workflowIds = workflowIdsByFolder.get(folder.id) ?? [];
const contained = await this.exportContainedWorkflows(workflowIds, target, request);
const descendants = await this.exportLevel(childrenByParent.get(folder.id) ?? [], target, folder.id, context, workflowIds.length > 0 ? 'workflows' : undefined);
const own = {
entries: [{ id: folder.id, name: folder.name, target }],
workflowEntries: contained.entries,
requirements: contained.requirements,
};
return this.mergeFolderExportResults([own, descendants]);
}
exportFolderShell(folder, target, effectiveParentId, writer) {
const serialized = this.folderSerializer.serialize(folder, effectiveParentId);
writer.writeDirectory(target);
writer.writeFile(`${target}/folder.json`, JSON.stringify(serialized, null, '\t'));
}
async exportContainedWorkflows(workflowIds, basePrefix, request) {
if (workflowIds.length === 0) {
return { entries: [], requirements: (0, requirements_types_1.mergeRequirements)() };
}
return await this.workflowExporter.export({
user: request.user,
writer: request.writer,
workflowIds,
basePrefix,
});
}
mergeFolderExportResults(results) {
return {
entries: results.flatMap((result) => result.entries),
workflowEntries: results.flatMap((result) => result.workflowEntries),
requirements: (0, requirements_types_1.mergeRequirements)(...results.map((result) => result.requirements)),
};
}
orderedByCreation(folders) {
return [...folders].sort((a, b) => {
const byCreatedAt = a.createdAt.getTime() - b.createdAt.getTime();
return byCreatedAt !== 0 ? byCreatedAt : a.id.localeCompare(b.id);
});
}
};
exports.FolderExporter = FolderExporter;
exports.FolderExporter = FolderExporter = __decorate([
(0, di_1.Service)(),
__metadata("design:paramtypes", [folder_finder_service_1.FolderFinderService, folder_serializer_1.FolderSerializer, workflow_finder_service_1.WorkflowFinderService, workflow_exporter_1.WorkflowExporter])
], FolderExporter);
//# sourceMappingURL=folder.exporter.js.map