From 004cfe19658954627b7ac6e3118cffe8648a14e3 Mon Sep 17 00:00:00 2001 From: zadam Date: Mon, 12 Jun 2023 23:09:29 +0200 Subject: [PATCH] allow creating backups via ETAPI, #4014 --- src/etapi/backup.js | 14 ++++++++++++++ src/etapi/etapi.openapi.yaml | 25 ++++++++++++++++++++++++- src/routes/routes.js | 2 ++ test-etapi/create-backup.http | 4 ++++ 4 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 src/etapi/backup.js create mode 100644 test-etapi/create-backup.http diff --git a/src/etapi/backup.js b/src/etapi/backup.js new file mode 100644 index 000000000..8dc7f8ed1 --- /dev/null +++ b/src/etapi/backup.js @@ -0,0 +1,14 @@ +const eu = require("./etapi_utils"); +const backupService = require("../services/backup"); + +function register(router) { + eu.route(router, 'put', '/etapi/backup/:backupName', async (req, res, next) => { + await backupService.backupNow(req.params.backupName); + + res.sendStatus(204); + }); +} + +module.exports = { + register +}; diff --git a/src/etapi/etapi.openapi.yaml b/src/etapi/etapi.openapi.yaml index 7c41693d1..754fb05b3 100644 --- a/src/etapi/etapi.openapi.yaml +++ b/src/etapi/etapi.openapi.yaml @@ -700,7 +700,26 @@ paths: application/json; charset=utf-8: schema: $ref: '#/components/schemas/Error' - + /backup/{backupName}: + parameters: + - name: backupName + in: path + required: true + description: If the backupName is e.g. "now", then the backup will be written to "backup-now.db" file + schema: + $ref: '#/components/schemas/StringId' + put: + description: Create a database backup under a given name + operationId: createBackup + responses: + '204': + description: backup has been created + default: + description: unexpected error + content: + application/json; charset=utf-8: + schema: + $ref: '#/components/schemas/Error' components: securitySchemes: EtapiTokenAuth: @@ -880,6 +899,10 @@ components: type: string pattern: '[a-zA-Z0-9_]{4,32}' example: evnnmvHTCgIn + StringId: + type: string + pattern: '[a-zA-Z0-9_]{1,32}' + example: my_ID EntityIdList: type: array items: diff --git a/src/routes/routes.js b/src/routes/routes.js index a52a067f5..2989208b5 100644 --- a/src/routes/routes.js +++ b/src/routes/routes.js @@ -65,6 +65,7 @@ const etapiBranchRoutes = require('../etapi/branches'); const etapiNoteRoutes = require('../etapi/notes'); const etapiSpecialNoteRoutes = require('../etapi/special_notes'); const etapiSpecRoute = require('../etapi/spec'); +const etapiBackupRoute = require('../etapi/backup'); const csrfMiddleware = csurf({ cookie: true, @@ -315,6 +316,7 @@ function register(app) { etapiNoteRoutes.register(router); etapiSpecialNoteRoutes.register(router); etapiSpecRoute.register(router); + etapiBackupRoute.register(router); app.use('', router); } diff --git a/test-etapi/create-backup.http b/test-etapi/create-backup.http new file mode 100644 index 000000000..59ffbebc4 --- /dev/null +++ b/test-etapi/create-backup.http @@ -0,0 +1,4 @@ +PUT {{triliumHost}}/etapi/backup/etapi_test +Authorization: {{authToken}} + +> {% client.assert(response.status === 201); %}