mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-31 18:36:30 +01:00 
			
		
		
		
	export notes via ETAPI, #3012
This commit is contained in:
		| @@ -70,21 +70,22 @@ class Branch extends AbstractEntity { | ||||
|  | ||||
|         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') { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         const childNote = this.childNote; | ||||
|         const parentNote = this.parentNote; | ||||
|  | ||||
|         if (!childNote.parents.includes(parentNote)) { | ||||
|             childNote.parents.push(parentNote); | ||||
|         } | ||||
|  | ||||
|         if (!childNote.parentBranches.includes(this)) { | ||||
|             childNote.parentBranches.push(this); | ||||
|         } | ||||
|  | ||||
|         if (!parentNote.children.includes(childNote)) { | ||||
|             parentNote.children.push(childNote); | ||||
|         } | ||||
|   | ||||
| @@ -228,6 +228,38 @@ paths: | ||||
|             application/json: | ||||
|               schema: | ||||
|                 $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}: | ||||
|     parameters: | ||||
|       - name: branchId | ||||
|   | ||||
| @@ -7,6 +7,7 @@ const TaskContext = require("../services/task_context"); | ||||
| const v = require("./validators"); | ||||
| const searchService = require("../services/search/services/search"); | ||||
| const SearchContext = require("../services/search/search_context"); | ||||
| const zipExportService = require("../services/export/zip"); | ||||
|  | ||||
| function register(router) { | ||||
|     eu.route(router, 'get', '/etapi/notes', (req, res, next) => { | ||||
| @@ -123,6 +124,25 @@ function register(router) { | ||||
|  | ||||
|         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) { | ||||
|   | ||||
							
								
								
									
										37
									
								
								test-etapi/export-note-subtree.http
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								test-etapi/export-note-subtree.http
									
									
									
									
									
										Normal 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"); | ||||
| %} | ||||
		Reference in New Issue
	
	Block a user