From 3223e767875e5379c99ff58a562cb9c1a2641bdf Mon Sep 17 00:00:00 2001 From: zadam Date: Thu, 15 Jun 2023 23:21:40 +0200 Subject: [PATCH] etapi ZIP import --- src/etapi/etapi.openapi.yaml | 38 +++++++++++++++++++++++++++++------- src/etapi/notes.js | 15 ++++++++++++-- src/services/task_context.js | 2 +- test-etapi/import-zip.http | 12 ++++++++++++ 4 files changed, 57 insertions(+), 10 deletions(-) create mode 100644 test-etapi/import-zip.http diff --git a/src/etapi/etapi.openapi.yaml b/src/etapi/etapi.openapi.yaml index 754fb05b3..c510fa0d2 100644 --- a/src/etapi/etapi.openapi.yaml +++ b/src/etapi/etapi.openapi.yaml @@ -33,13 +33,7 @@ paths: content: application/json; charset=utf-8: schema: - properties: - note: - $ref: '#/components/schemas/Note' - description: Created note - branch: - $ref: '#/components/schemas/Branch' - description: Created branch + $ref: '#/components/schemas/NoteWithBranch' default: description: unexpected error content: @@ -291,6 +285,29 @@ paths: application/json; charset=utf-8: schema: $ref: '#/components/schemas/Error' + /notes/{noteId}/import: + parameters: + - name: noteId + in: path + required: true + schema: + $ref: '#/components/schemas/EntityId' + post: + description: Imports ZIP file into a given note. + operationId: importZip + responses: + '201': + description: note created + content: + application/json; charset=utf-8: + schema: + $ref: '#/components/schemas/NoteWithBranch' + default: + description: unexpected error + content: + application/json; charset=utf-8: + schema: + $ref: '#/components/schemas/Error' /notes/{noteId}/note-revision: parameters: - name: noteId @@ -852,6 +869,13 @@ components: utcDateModified: $ref: '#/components/schemas/UtcDateTime' readOnly: true + NoteWithBranch: + type: object + properties: + note: + $ref: '#/components/schemas/Note' + branch: + $ref: '#/components/schemas/Branch' Attribute: type: object description: Attribute (Label, Relation) is a key-value record attached to a note. diff --git a/src/etapi/notes.js b/src/etapi/notes.js index 683544fff..9d56cb966 100644 --- a/src/etapi/notes.js +++ b/src/etapi/notes.js @@ -8,6 +8,7 @@ const v = require("./validators"); const searchService = require("../services/search/services/search"); const SearchContext = require("../services/search/search_context"); const zipExportService = require("../services/export/zip"); +const zipImportService = require("../services/import/zip"); function register(router) { eu.route(router, 'get', '/etapi/notes', (req, res, next) => { @@ -141,11 +142,21 @@ function register(router) { // (e.g. branchIds are not seen in UI), that we export "note export" instead. const branch = note.getParentBranches()[0]; - console.log(note.getParentBranches()); - zipExportService.exportToZip(taskContext, branch, format, res); }); + eu.route(router, 'post' ,'/etapi/notes/:noteId/import', (req, res, next) => { + const note = eu.getAndCheckNote(req.params.noteId); + const taskContext = new TaskContext('no-progress-reporting'); + + zipImportService.importZip(taskContext, req.body, note).then(importedNote => { + res.status(201).json({ + note: mappers.mapNoteToPojo(importedNote), + branch: mappers.mapBranchToPojo(importedNote.getBranches()[0]), + }); + }); // we need better error handling here, async errors won't be properly processed. + }); + eu.route(router, 'post' ,'/etapi/notes/:noteId/note-revision', (req, res, next) => { const note = eu.getAndCheckNote(req.params.noteId); diff --git a/src/services/task_context.js b/src/services/task_context.js index 9aab9d43e..363bd3035 100644 --- a/src/services/task_context.js +++ b/src/services/task_context.js @@ -6,7 +6,7 @@ const ws = require('./ws'); const taskContexts = {}; class TaskContext { - constructor(taskId, taskType = null, data = null) { + constructor(taskId, taskType = null, data = {}) { this.taskId = taskId; this.taskType = taskType; this.data = data; diff --git a/test-etapi/import-zip.http b/test-etapi/import-zip.http new file mode 100644 index 000000000..e831a050a --- /dev/null +++ b/test-etapi/import-zip.http @@ -0,0 +1,12 @@ +POST {{triliumHost}}/etapi/notes/root/import +Authorization: {{authToken}} +Content-Type: application/octet-stream +Content-Transfer-Encoding: binary + +< ../db/demo.zip + +> {% + client.assert(response.status === 201); + client.assert(response.body.note.title == "Trilium Demo"); + client.assert(response.body.branch.parentNoteId == "root"); +%}