|
|
@ -1,9 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
'use strict';
|
|
|
|
'use strict';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const fs = require('fs');
|
|
|
|
|
|
|
|
const path = require('path');
|
|
|
|
const winston = require('winston');
|
|
|
|
const winston = require('winston');
|
|
|
|
const validator = require('validator');
|
|
|
|
const validator = require('validator');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const { baseDir } = require('../constants').paths;
|
|
|
|
const db = require('../database');
|
|
|
|
const db = require('../database');
|
|
|
|
const plugins = require('../plugins');
|
|
|
|
const plugins = require('../plugins');
|
|
|
|
const batch = require('../batch');
|
|
|
|
const batch = require('../batch');
|
|
|
@ -36,11 +39,35 @@ module.exports = function (User) {
|
|
|
|
await batch.processSortedSet('users:joindate', async (uids) => {
|
|
|
|
await batch.processSortedSet('users:joindate', async (uids) => {
|
|
|
|
const usersData = await User.getUsersFields(uids, data.fields);
|
|
|
|
const usersData = await User.getUsersFields(uids, data.fields);
|
|
|
|
csvContent += usersData.reduce((memo, user) => {
|
|
|
|
csvContent += usersData.reduce((memo, user) => {
|
|
|
|
memo += user.email + ',' + user.username + ',' + user.uid + '\n';
|
|
|
|
memo += data.fields.map(field => user[field]).join(',') + '\n';
|
|
|
|
return memo;
|
|
|
|
return memo;
|
|
|
|
}, '');
|
|
|
|
}, '');
|
|
|
|
}, {});
|
|
|
|
}, {});
|
|
|
|
|
|
|
|
|
|
|
|
return csvContent;
|
|
|
|
return csvContent;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
User.exportUsersCSV = async function () {
|
|
|
|
|
|
|
|
winston.verbose('[user/exportUsersCSV] Exporting User CSV data');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const data = await plugins.hooks.fire('filter:user.csvFields', { fields: ['email', 'username', 'uid'] });
|
|
|
|
|
|
|
|
const fd = await fs.promises.open(
|
|
|
|
|
|
|
|
path.join(baseDir, 'build/export', 'users.csv'),
|
|
|
|
|
|
|
|
'w'
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
fs.promises.appendFile(fd, data.fields.join(',') + '\n');
|
|
|
|
|
|
|
|
await batch.processSortedSet('users:joindate', async (uids) => {
|
|
|
|
|
|
|
|
const usersData = await User.getUsersFields(uids, data.fields.slice());
|
|
|
|
|
|
|
|
let line = '';
|
|
|
|
|
|
|
|
usersData.forEach(function (user) {
|
|
|
|
|
|
|
|
line += data.fields.map(field => user[field]).join(',') + '\n';
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
await fs.promises.appendFile(fd, line);
|
|
|
|
|
|
|
|
}, {
|
|
|
|
|
|
|
|
batch: 5000,
|
|
|
|
|
|
|
|
interval: 250,
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
await fd.close();
|
|
|
|
|
|
|
|
};
|
|
|
|
};
|
|
|
|
};
|
|
|
|