summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSheogorath2018-05-26 02:53:21 +0200
committerSheogorath2018-05-26 03:12:21 +0200
commitbcbb8c67c9f8092643c318140f6613324f306bd2 (patch)
treef7de8e6a641d9a369555ac741735c0248afba0c0
parent70df29790a83db4abb40ed1e16cb05a3aa760672 (diff)
Add note export function
This function is the first step to get out data following GDPR about the transportability of data. Details: https://gdpr-info.eu/art-20-gdpr/ Signed-off-by: Sheogorath <sheogorath@shivering-isles.com>
Diffstat (limited to '')
-rw-r--r--lib/web/userRouter.js56
1 files changed, 56 insertions, 0 deletions
diff --git a/lib/web/userRouter.js b/lib/web/userRouter.js
index 6832d901..db786d53 100644
--- a/lib/web/userRouter.js
+++ b/lib/web/userRouter.js
@@ -1,5 +1,7 @@
'use strict'
+const archiver = require('archiver')
+const async = require('async')
const Router = require('express').Router
const response = require('../response')
@@ -64,6 +66,60 @@ UserRouter.get('/me/delete/:token?', function (req, res) {
}
})
+// export the data of the authenticated user
+UserRouter.get('/me/export', function (req, res) {
+ if (req.isAuthenticated()) {
+ // let output = fs.createWriteStream(__dirname + '/example.zip');
+ let archive = archiver('zip', {
+ zlib: { level: 3 } // Sets the compression level.
+ })
+ res.setHeader('Content-Type', 'application/zip')
+ res.attachment('archive.zip')
+ archive.pipe(res)
+ archive.on('error', function (err) {
+ logger.error('export user data failed: ' + err)
+ return response.errorInternalError(res)
+ })
+ models.User.findOne({
+ where: {
+ id: req.user.id
+ }
+ }).then(function (user) {
+ models.Note.findAll({
+ where: {
+ ownerId: user.id
+ }
+ }).then(function (notes) {
+ let list = []
+ async.each(notes, function (note, callback) {
+ let title
+ let extension = ''
+ do {
+ title = note.title + extension
+ extension++
+ } while (list.indexOf(title) !== -1)
+
+ list.push(title)
+ logger.debug('Write: ' + title + '.md')
+ archive.append(Buffer.from(note.content), { name: title + '.md', date: note.lastchangeAt })
+ callback(null, null)
+ }, function (err) {
+ if (err) {
+ return response.errorInternalError(res)
+ }
+
+ archive.finalize()
+ })
+ })
+ }).catch(function (err) {
+ logger.error('export user data failed: ' + err)
+ return response.errorInternalError(res)
+ })
+ } else {
+ return response.errorForbidden(res)
+ }
+})
+
UserRouter.get('/user/:username/avatar.svg', function (req, res, next) {
res.setHeader('Content-Type', 'image/svg+xml')
res.setHeader('Cache-Control', 'public, max-age=86400')