You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
3.0 KiB
JavaScript
99 lines
3.0 KiB
JavaScript
'use strict';
|
|
|
|
const nconf = require('nconf');
|
|
const validator = require('validator');
|
|
|
|
const db = require('../../database');
|
|
const user = require('../../user');
|
|
const groups = require('../../groups');
|
|
const meta = require('../../meta');
|
|
const pagination = require('../../pagination');
|
|
const events = require('../../events');
|
|
const slugify = require('../../slugify');
|
|
|
|
const groupsController = module.exports;
|
|
|
|
groupsController.list = async function (req, res) {
|
|
const page = parseInt(req.query.page, 10) || 1;
|
|
const groupsPerPage = 20;
|
|
|
|
let groupNames = await getGroupNames();
|
|
const pageCount = Math.ceil(groupNames.length / groupsPerPage);
|
|
const start = (page - 1) * groupsPerPage;
|
|
const stop = start + groupsPerPage - 1;
|
|
groupNames = groupNames.slice(start, stop + 1);
|
|
|
|
const groupData = await groups.getGroupsData(groupNames);
|
|
res.render('admin/manage/groups', {
|
|
groups: groupData,
|
|
pagination: pagination.create(page, pageCount),
|
|
yourid: req.uid,
|
|
});
|
|
};
|
|
|
|
groupsController.get = async function (req, res, next) {
|
|
const slug = slugify(req.params.name);
|
|
const groupName = await groups.getGroupNameByGroupSlug(slug);
|
|
const [groupNames, group] = await Promise.all([
|
|
getGroupNames(),
|
|
groups.get(groupName, { uid: req.uid, truncateUserList: true, userListCount: 20 }),
|
|
]);
|
|
|
|
if (!group || groupName === groups.BANNED_USERS) {
|
|
return next();
|
|
}
|
|
group.isOwner = true;
|
|
|
|
const groupNameData = groupNames.map(name => ({
|
|
encodedName: encodeURIComponent(name),
|
|
displayName: validator.escape(String(name)),
|
|
selected: name === groupName,
|
|
}));
|
|
|
|
res.render('admin/manage/group', {
|
|
group: group,
|
|
groupNames: groupNameData,
|
|
allowPrivateGroups: meta.config.allowPrivateGroups,
|
|
maximumGroupNameLength: meta.config.maximumGroupNameLength,
|
|
maximumGroupTitleLength: meta.config.maximumGroupTitleLength,
|
|
});
|
|
};
|
|
|
|
async function getGroupNames() {
|
|
const groupNames = await db.getSortedSetRange('groups:createtime', 0, -1);
|
|
return groupNames.filter(name => (
|
|
name !== 'registered-users' &&
|
|
name !== 'verified-users' &&
|
|
name !== 'unverified-users' &&
|
|
name !== groups.BANNED_USERS &&
|
|
!groups.isPrivilegeGroup(name)
|
|
));
|
|
}
|
|
|
|
groupsController.getCSV = async function (req, res) {
|
|
const { referer } = req.headers;
|
|
|
|
if (!referer || !referer.replace(nconf.get('url'), '').startsWith('/admin/manage/groups')) {
|
|
return res.status(403).send('[[error:invalid-origin]]');
|
|
}
|
|
await events.log({
|
|
type: 'getGroupCSV',
|
|
uid: req.uid,
|
|
ip: req.ip,
|
|
group: req.params.groupname,
|
|
});
|
|
const groupName = req.params.groupname;
|
|
const members = (await groups.getMembersOfGroups([groupName]))[0];
|
|
const fields = ['email', 'username', 'uid'];
|
|
const userData = await user.getUsersFields(members, fields);
|
|
let csvContent = `${fields.join(',')}\n`;
|
|
csvContent += userData.reduce((memo, user) => {
|
|
memo += `${user.email},${user.username},${user.uid}\n`;
|
|
return memo;
|
|
}, '');
|
|
|
|
res.attachment(`${validator.escape(groupName)}_members.csv`);
|
|
res.setHeader('Content-Type', 'text/csv');
|
|
res.end(csvContent);
|
|
};
|