export notes via ETAPI, #3012

This commit is contained in:
zadam 2022-07-24 21:30:29 +02:00
parent 5444cc2009
commit 80887fd3c1
4 changed files with 95 additions and 5 deletions

View File

@ -70,21 +70,22 @@ class Branch extends AbstractEntity {
this.becca.childParentToBranch[`${this.noteId}-${this.parentNoteId}`] = this; this.becca.childParentToBranch[`${this.noteId}-${this.parentNoteId}`] = this;
const childNote = this.childNote;
if (!childNote.parentBranches.includes(this)) {
childNote.parentBranches.push(this);
}
if (this.branchId === 'root') { if (this.branchId === 'root') {
return; return;
} }
const childNote = this.childNote;
const parentNote = this.parentNote; const parentNote = this.parentNote;
if (!childNote.parents.includes(parentNote)) { if (!childNote.parents.includes(parentNote)) {
childNote.parents.push(parentNote); childNote.parents.push(parentNote);
} }
if (!childNote.parentBranches.includes(this)) {
childNote.parentBranches.push(this);
}
if (!parentNote.children.includes(childNote)) { if (!parentNote.children.includes(childNote)) {
parentNote.children.push(childNote); parentNote.children.push(childNote);
} }

View File

@ -228,6 +228,38 @@ paths:
application/json: application/json:
schema: schema:
$ref: '#/components/schemas/Error' $ref: '#/components/schemas/Error'
/notes/{noteId}/export:
parameters:
- name: noteId
in: path
required: true
schema:
$ref: '#/components/schemas/EntityId'
- name: format
in: query
required: false
schema:
enum:
- html
- markdown
default: html
get:
description: Exports ZIP file export of a given note subtree. To export whole document, use "root" for noteId
operationId: exportNoteSubtree
responses:
'200':
description: export ZIP file
content:
application/zip:
schema:
type: string
format: binary
default:
description: unexpected error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
/branches/{branchId}: /branches/{branchId}:
parameters: parameters:
- name: branchId - name: branchId

View File

@ -7,6 +7,7 @@ const TaskContext = require("../services/task_context");
const v = require("./validators"); const v = require("./validators");
const searchService = require("../services/search/services/search"); const searchService = require("../services/search/services/search");
const SearchContext = require("../services/search/search_context"); const SearchContext = require("../services/search/search_context");
const zipExportService = require("../services/export/zip");
function register(router) { function register(router) {
eu.route(router, 'get', '/etapi/notes', (req, res, next) => { eu.route(router, 'get', '/etapi/notes', (req, res, next) => {
@ -123,6 +124,25 @@ function register(router) {
return res.sendStatus(204); return res.sendStatus(204);
}); });
eu.route(router, 'get' ,'/etapi/notes/:noteId/export', (req, res, next) => {
const note = eu.getAndCheckNote(req.params.noteId);
const format = req.query.format || "html";
if (!["html", "markdown"].includes(format)) {
throw new eu.EtapiError(400, "UNRECOGNIZED_EXPORT_FORMAT", `Unrecognized export format '${format}', supported values are 'html' (default) or 'markdown'`);
}
const taskContext = new TaskContext('no-progress-reporting');
// technically a branch is being exported (includes prefix), but it's such a minor difference yet usability pain
// (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);
});
} }
function parseSearchParams(req) { function parseSearchParams(req) {

View File

@ -0,0 +1,37 @@
GET {{triliumHost}}/etapi/notes/root/export
Authorization: {{authToken}}
> {%
client.assert(response.status === 200);
client.assert(response.headers.valueOf("Content-Type") == "application/zip");
%}
###
GET {{triliumHost}}/etapi/notes/root/export?format=html
Authorization: {{authToken}}
> {%
client.assert(response.status === 200);
client.assert(response.headers.valueOf("Content-Type") == "application/zip");
%}
###
GET {{triliumHost}}/etapi/notes/root/export?format=markdown
Authorization: {{authToken}}
> {%
client.assert(response.status === 200);
client.assert(response.headers.valueOf("Content-Type") == "application/zip");
%}
###
GET {{triliumHost}}/etapi/notes/root/export?format=wrong
Authorization: {{authToken}}
> {%
client.assert(response.status === 400);
client.assert(response.body.code === "UNRECOGNIZED_EXPORT_FORMAT");
%}