From a563330136e4623ffd91d4a6aeca803d7be88f8b Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 6 Jul 2025 23:05:15 +0300 Subject: [PATCH] feat(import/zip): improve geomap compatibility --- .../src/services/import/samples/geomap.zip | Bin 0 -> 5413 bytes apps/server/src/services/import/zip.spec.ts | 13 +++++++++++ apps/server/src/services/import/zip.ts | 22 ++++++++++++++++++ 3 files changed, 35 insertions(+) create mode 100644 apps/server/src/services/import/samples/geomap.zip diff --git a/apps/server/src/services/import/samples/geomap.zip b/apps/server/src/services/import/samples/geomap.zip new file mode 100644 index 0000000000000000000000000000000000000000..6443c19971d292478defb975aefe4de8d42ea1b2 GIT binary patch literal 5413 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 literal 0 HcmV?d00001 diff --git a/apps/server/src/services/import/zip.spec.ts b/apps/server/src/services/import/zip.spec.ts index 4860f7b94..db2c7ba76 100644 --- a/apps/server/src/services/import/zip.spec.ts +++ b/apps/server/src/services/import/zip.spec.ts @@ -70,6 +70,19 @@ describe("processNoteContent", () => { expect(content).toContain(` { + const { importedNote } = await testImport("geomap.zip"); + expect(importedNote.type).toBe("book"); + expect(importedNote.mime).toBe(""); + expect(importedNote.getRelationValue("template")).toBe("_template_geo_map"); + + const attachment = importedNote.getAttachmentsByRole("viewConfig")[0]; + expect(attachment.title).toBe("geoMap.json"); + expect(attachment.mime).toBe("application/json"); + const content = attachment.getContent(); + expect(content).toStrictEqual(`{"view":{"center":{"lat":49.19598332223546,"lng":-2.1414576506668808},"zoom":12}}`); + }); }); function getNoteByTitlePath(parentNote: BNote, ...titlePath: string[]) { diff --git a/apps/server/src/services/import/zip.ts b/apps/server/src/services/import/zip.ts index 67deb1056..b2d83bdc6 100644 --- a/apps/server/src/services/import/zip.ts +++ b/apps/server/src/services/import/zip.ts @@ -502,6 +502,28 @@ async function importZip(taskContext: TaskContext, fileBuffer: Buffer, importRoo firstNote = firstNote || note; } } else { + if (detectedType as string === "geoMap") { + attributes.push({ + noteId, + type: "relation", + name: "template", + value: "_template_geo_map" + }); + + const attachment = new BAttachment({ + attachmentId: getNewAttachmentId(newEntityId()), + ownerId: noteId, + title: "geoMap.json", + role: "viewConfig", + mime: "application/json", + position: 0 + }); + + attachment.setContent(content, { forceSave: true }); + content = ""; + mime = ""; + } + ({ note } = noteService.createNewNote({ parentNoteId: parentNoteId, title: noteTitle || "",