From 67dec83011b4e892eb70d76aa1763c2e05e69abd Mon Sep 17 00:00:00 2001
From: Julian Lam <julian@nodebb.org>
Date: Fri, 13 Apr 2018 12:18:02 -0400
Subject: [PATCH] profile export for #6441 + integration

---
 public/language/en-GB/user.json |  6 +++++-
 src/controllers/user.js         | 19 +++++++++++++++++++
 src/routes/api.js               |  1 +
 3 files changed, 25 insertions(+), 1 deletion(-)

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);