mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-11-11 00:15:46 +01:00
posts export endpoint for GDPR, re: #6441
This commit is contained in:
@@ -1,9 +1,12 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var async = require('async');
|
var async = require('async');
|
||||||
|
var converter = require('json-2-csv');
|
||||||
|
|
||||||
var user = require('../user');
|
var user = require('../user');
|
||||||
var meta = require('../meta');
|
var meta = require('../meta');
|
||||||
|
var posts = require('../posts');
|
||||||
|
var batch = require('../batch');
|
||||||
var accountHelpers = require('./accounts/helpers');
|
var accountHelpers = require('./accounts/helpers');
|
||||||
|
|
||||||
var userController = module.exports;
|
var userController = module.exports;
|
||||||
@@ -97,3 +100,36 @@ userController.getUserDataByUID = function (callerUid, uid, callback) {
|
|||||||
callback(null, results.userData);
|
callback(null, results.userData);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
userController.exportPosts = function (req, res, next) {
|
||||||
|
async.waterfall([
|
||||||
|
function (next) {
|
||||||
|
var payload = [];
|
||||||
|
batch.processSortedSet('uid:' + req.params.uid + ':posts', function (pids, next) {
|
||||||
|
async.map(pids, posts.getPostData, function (err, posts) {
|
||||||
|
if (err) {
|
||||||
|
return next(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert newlines in content
|
||||||
|
posts = posts.map(function (post) {
|
||||||
|
post.content = '"' + post.content.replace(/\n/g, '\\n').replace(/"/g, '\\"') + '"';
|
||||||
|
return post;
|
||||||
|
});
|
||||||
|
|
||||||
|
payload = payload.concat(posts);
|
||||||
|
next();
|
||||||
|
});
|
||||||
|
}, function (err) {
|
||||||
|
next(err, payload);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
async.apply(converter.json2csv),
|
||||||
|
], function (err, csv) {
|
||||||
|
if (err) {
|
||||||
|
return next(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
res.set('Content-Type', 'text/csv').set('Content-Disposition', 'attachment; filename="' + req.params.uid + '_posts.csv"').send(csv);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|||||||
@@ -15,6 +15,8 @@ module.exports = function (app, middleware, controllers) {
|
|||||||
router.get('/user/username/:username', middleware.checkGlobalPrivacySettings, controllers.user.getUserByUsername);
|
router.get('/user/username/:username', middleware.checkGlobalPrivacySettings, controllers.user.getUserByUsername);
|
||||||
router.get('/user/email/:email', middleware.checkGlobalPrivacySettings, controllers.user.getUserByEmail);
|
router.get('/user/email/:email', middleware.checkGlobalPrivacySettings, controllers.user.getUserByEmail);
|
||||||
|
|
||||||
|
router.get('/user/uid/:uid/export/posts', middleware.checkAccountPermissions, controllers.user.exportPosts);
|
||||||
|
|
||||||
router.get('/:type/pid/:id', controllers.api.getObject);
|
router.get('/:type/pid/:id', controllers.api.getObject);
|
||||||
router.get('/:type/tid/:id', controllers.api.getObject);
|
router.get('/:type/tid/:id', controllers.api.getObject);
|
||||||
router.get('/:type/cid/:id', controllers.api.getObject);
|
router.get('/:type/cid/:id', controllers.api.getObject);
|
||||||
|
|||||||
Reference in New Issue
Block a user