stash
This commit is contained in:
99
server/commands/documentBatchImporter.js
Normal file
99
server/commands/documentBatchImporter.js
Normal file
@ -0,0 +1,99 @@
|
||||
// @flow
|
||||
import fs from "fs";
|
||||
import File from "formidable/lib/file";
|
||||
import JSZip from "jszip";
|
||||
import { Collection, User } from "../models";
|
||||
import documentCreator from "./documentCreator";
|
||||
import documentImporter from "./documentImporter";
|
||||
|
||||
export default async function documentBatchImporter({
|
||||
file,
|
||||
type,
|
||||
user,
|
||||
ip,
|
||||
}: {
|
||||
file: File,
|
||||
user: User,
|
||||
type: "outline",
|
||||
ip: string,
|
||||
}) {
|
||||
const zipData = await fs.promises.readFile(file.path, "utf8");
|
||||
const zip = await JSZip.loadAsync(zipData);
|
||||
|
||||
async function ingestDocuments(
|
||||
zip: JSZip,
|
||||
collectionId: string,
|
||||
parentDocumentId?: string
|
||||
) {
|
||||
const documents = [];
|
||||
|
||||
// TODO: attachments
|
||||
|
||||
// 2 passes, one for documents and then second for their nested documents
|
||||
zip.forEach(async function (filePath, item) {
|
||||
if (item.dir) return;
|
||||
|
||||
const fileData = await item.async("blob");
|
||||
const file = new File([fileData], item.name);
|
||||
|
||||
const { text, title } = await documentImporter({
|
||||
file,
|
||||
user,
|
||||
ip,
|
||||
});
|
||||
|
||||
const document = await documentCreator({
|
||||
title,
|
||||
text,
|
||||
publish: true,
|
||||
collectionId,
|
||||
parentDocumentId,
|
||||
user,
|
||||
ip,
|
||||
});
|
||||
|
||||
// Keep track of which documents have been created
|
||||
documents.push(document);
|
||||
});
|
||||
|
||||
zip.forEach(async function (filePath, item) {
|
||||
// treat items in here as nested documents
|
||||
if (!item.dir) return;
|
||||
if (item.name === "uploads") return;
|
||||
|
||||
const document = documents.find((doc) => doc.title === item.name);
|
||||
if (!document) {
|
||||
console.log(
|
||||
`Couldn't find a matching parent document for folder ${item.name}`
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
// ensure document is created first, get parentDocumentId
|
||||
await ingestDocuments(zip.folder(filePath), collectionId, document.id);
|
||||
});
|
||||
}
|
||||
|
||||
zip.forEach(async function (folderPath, item) {
|
||||
// all top level items must be directories representing collections
|
||||
console.log("iterating over", folderPath);
|
||||
|
||||
// treat this as a collection
|
||||
if (item.dir) {
|
||||
// create collection if a collection with this name doesn't exist
|
||||
const [collection, isCreated] = await Collection.findOrCreate({
|
||||
where: {
|
||||
teamId: user.teamId,
|
||||
name: item.name,
|
||||
},
|
||||
defaults: {
|
||||
private: false,
|
||||
},
|
||||
});
|
||||
|
||||
console.log(`Collection ${item.name} ${isCreated ? "created" : "found"}`);
|
||||
|
||||
await ingestDocuments(zip.folder(folderPath), collection.id);
|
||||
}
|
||||
});
|
||||
}
|
Reference in New Issue
Block a user