diff --git a/public/language/en-GB/user.json b/public/language/en-GB/user.json index 073dd3b38f..9a886ff821 100644 --- a/public/language/en-GB/user.json +++ b/public/language/en-GB/user.json @@ -179,5 +179,9 @@ "consent.right_to_erasure": "You have the Right to Erasure", "consent.right_to_erasure_description": "At any time, you are able to revoke your consent to data collection and/or processing by deleting your account.", "consent.right_to_data_portability": "You have the Right to Data Portability", - "consent.right_to_data_portability_description": "You may request from us a machine-readable export of any collected data about you and your account. You can do so by clicking the appropriate button below." + "consent.right_to_data_portability_description": "You may request from us a machine-readable export of any collected data about you and your account. You can do so by clicking the appropriate button below.", + + "consent.export_profile": "Export Your Profile (.csv)", + "consent.export_uploads": "Export Uploaded Content (.zip)", + "consent.export_posts": "Export Posts (.csv)" } diff --git a/src/controllers/user.js b/src/controllers/user.js index f1cc35e126..515fe7555d 100644 --- a/src/controllers/user.js +++ b/src/controllers/user.js @@ -7,6 +7,7 @@ var winston = require('winston'); var converter = require('json-2-csv'); var archiver = require('archiver'); +var db = require('../database'); var user = require('../user'); var meta = require('../meta'); var posts = require('../posts'); @@ -219,3 +220,21 @@ userController.exportUploads = function (req, res, next) { archive.finalize(); }); }; + +userController.exportProfile = function (req, res, next) { + async.waterfall([ + async.apply(db.getObjects.bind(db), ['user:1', 'user:1:settings']), + function (objects, next) { + Object.assign(objects[0], objects[1]); + delete objects[0].password; + + converter.json2csv(objects[0], next); + }, + ], function (err, csv) { + if (err) { + return next(err); + } + + res.set('Content-Type', 'text/csv').set('Content-Disposition', 'attachment; filename="' + req.params.uid + '_profile.csv"').send(csv); + }); +}; diff --git a/src/routes/api.js b/src/routes/api.js index cbd6972ef6..6d06a2f93e 100644 --- a/src/routes/api.js +++ b/src/routes/api.js @@ -17,6 +17,7 @@ module.exports = function (app, middleware, controllers) { router.get('/user/uid/:uid/export/posts', middleware.checkAccountPermissions, controllers.user.exportPosts); router.get('/user/uid/:uid/export/uploads', middleware.checkAccountPermissions, controllers.user.exportUploads); + router.get('/user/uid/:uid/export/profile', middleware.checkAccountPermissions, controllers.user.exportProfile); router.get('/:type/pid/:id', controllers.api.getObject); router.get('/:type/tid/:id', controllers.api.getObject);