fix: Handle public attachments in Markdown export, closes #6161

This commit is contained in:
Tom Moor
2023-11-16 22:09:51 -05:00
parent 6177d6f3cb
commit 7b4bedae59
4 changed files with 49 additions and 8 deletions

View File

@@ -16,7 +16,7 @@ describe("ImportMarkdownZipTask", () => {
"..", "..",
"test", "test",
"fixtures", "fixtures",
"outline.zip" "outline-markdown.zip"
), ),
cleanup: async () => {}, cleanup: async () => {},
}; };
@@ -36,6 +36,37 @@ describe("ImportMarkdownZipTask", () => {
expect(response.attachments.size).toEqual(6); expect(response.attachments.size).toEqual(6);
}, 10000); }, 10000);
it("should import the documents, public attachments", async () => {
const fileOperation = await buildFileOperation();
Object.defineProperty(fileOperation, "handle", {
get() {
return {
path: path.resolve(
__dirname,
"..",
"..",
"test",
"fixtures",
"outline-markdown-public.zip"
),
cleanup: async () => {},
};
},
});
jest.spyOn(FileOperation, "findByPk").mockResolvedValue(fileOperation);
const props = {
fileOperationId: fileOperation.id,
};
const task = new ImportMarkdownZipTask();
const response = await task.perform(props);
expect(response.collections.size).toEqual(1);
expect(response.documents.size).toEqual(2);
expect(response.attachments.size).toEqual(1);
}, 10000);
it("should throw an error with corrupt zip", async () => { it("should throw an error with corrupt zip", async () => {
const fileOperation = await buildFileOperation(); const fileOperation = await buildFileOperation();
Object.defineProperty(fileOperation, "handle", { Object.defineProperty(fileOperation, "handle", {

View File

@@ -5,6 +5,7 @@ import { v4 as uuidv4 } from "uuid";
import documentImporter from "@server/commands/documentImporter"; import documentImporter from "@server/commands/documentImporter";
import Logger from "@server/logging/Logger"; import Logger from "@server/logging/Logger";
import { FileOperation, User } from "@server/models"; import { FileOperation, User } from "@server/models";
import { Buckets } from "@server/models/helpers/AttachmentHelper";
import ImportHelper, { FileTreeNode } from "@server/utils/ImportHelper"; import ImportHelper, { FileTreeNode } from "@server/utils/ImportHelper";
import ImportTask, { StructuredImportData } from "./ImportTask"; import ImportTask, { StructuredImportData } from "./ImportTask";
@@ -51,8 +52,11 @@ export default class ImportMarkdownZipTask extends ImportTask {
children.map(async (child) => { children.map(async (child) => {
// special case for folders of attachments // special case for folders of attachments
if ( if (
child.name === "uploads" || child.name === Buckets.uploads ||
(child.children.length > 0 && child.path.includes("/uploads/")) child.name === Buckets.public ||
(child.children.length > 0 &&
(child.path.includes(`/${Buckets.public}/`) ||
child.path.includes(`/${Buckets.uploads}/`)))
) { ) {
return parseNodeChildren(child.children, collectionId); return parseNodeChildren(child.children, collectionId);
} }
@@ -60,7 +64,11 @@ export default class ImportMarkdownZipTask extends ImportTask {
const id = uuidv4(); const id = uuidv4();
// this is an attachment // this is an attachment
if (child.path.includes("/uploads/") && child.children.length === 0) { if (
child.children.length === 0 &&
(child.path.includes(`/${Buckets.uploads}/`) ||
child.path.includes(`/${Buckets.public}/`))
) {
output.attachments.push({ output.attachments.push({
id, id,
name: child.name, name: child.name,
@@ -145,10 +153,12 @@ export default class ImportMarkdownZipTask extends ImportTask {
// Pull the collection and subdirectory out of the path name, upload // Pull the collection and subdirectory out of the path name, upload
// folders in an export are relative to the document itself // folders in an export are relative to the document itself
const normalizedAttachmentPath = encodedPath.replace( const normalizedAttachmentPath = encodedPath
/(.*)uploads\//, .replace(
"uploads/" new RegExp(`(.*)/${Buckets.uploads}/`),
); `${Buckets.uploads}/`
)
.replace(new RegExp(`(.*)/${Buckets.public}/`), `${Buckets.public}/`);
const reference = `<<${attachment.id}>>`; const reference = `<<${attachment.id}>>`;
document.text = document.text document.text = document.text

Binary file not shown.