Files
NodeBB/src/groups/data.js

108 lines
3.2 KiB
JavaScript
Raw Normal View History

2017-03-01 22:42:10 +03:00
'use strict';
var async = require('async');
var validator = require('validator');
var db = require('../database');
var plugins = require('../plugins');
var utils = require('../utils');
2017-03-01 22:42:10 +03:00
2018-10-23 08:28:59 -04:00
const intFields = [
'createtime', 'memberCount', 'hidden', 'system', 'private',
'userTitleEnabled', 'disableJoinRequests',
];
2017-03-01 22:42:10 +03:00
module.exports = function (Groups) {
2018-10-23 08:28:59 -04:00
Groups.getGroupsFields = function (groupNames, fields, callback) {
2017-03-01 22:42:10 +03:00
if (!Array.isArray(groupNames) || !groupNames.length) {
return callback(null, []);
}
var ephemeralIdx = groupNames.reduce(function (memo, cur, idx) {
if (Groups.ephemeralGroups.includes(cur)) {
2017-03-01 22:42:10 +03:00
memo.push(idx);
}
return memo;
}, []);
async.waterfall([
function (next) {
2018-10-23 08:28:59 -04:00
const keys = groupNames.map(groupName => 'group:' + groupName);
if (fields.length) {
db.getObjectsFields(keys, fields, next);
2018-10-23 08:28:59 -04:00
} else {
db.getObjects(keys, next);
}
2017-03-01 22:42:10 +03:00
},
function (groupData, next) {
if (ephemeralIdx.length) {
ephemeralIdx.forEach(function (idx) {
groupData[idx] = Groups.getEphemeralGroup(groupNames[idx]);
});
}
2018-10-25 19:58:01 -04:00
groupData.forEach(group => modifyGroup(group, fields));
2017-03-01 22:42:10 +03:00
plugins.fireHook('filter:groups.get', { groups: groupData }, next);
},
function (results, next) {
next(null, results.groups);
},
], callback);
};
2018-10-23 08:28:59 -04:00
Groups.getGroupsData = function (groupNames, callback) {
Groups.getGroupsFields(groupNames, [], callback);
};
2017-03-01 22:42:10 +03:00
Groups.getGroupData = function (groupName, callback) {
Groups.getGroupsData([groupName], function (err, groupsData) {
callback(err, Array.isArray(groupsData) && groupsData[0] ? groupsData[0] : null);
});
};
Groups.getGroupFields = function (groupName, fields, callback) {
Groups.getGroupsFields([groupName], fields, function (err, groups) {
2017-03-01 22:42:10 +03:00
callback(err, groups ? groups[0] : null);
});
};
Groups.setGroupField = function (groupName, field, value, callback) {
async.waterfall([
function (next) {
db.setObjectField('group:' + groupName, field, value, next);
},
function (next) {
plugins.fireHook('action:group.set', { field: field, value: value, type: 'set' });
next();
},
], callback);
};
};
2018-10-23 08:28:59 -04:00
2018-10-25 19:58:01 -04:00
function modifyGroup(group, fields) {
2018-10-23 08:28:59 -04:00
if (group) {
2018-10-25 19:58:01 -04:00
db.parseIntFields(group, intFields, fields);
2018-10-23 08:28:59 -04:00
escapeGroupData(group);
group.userTitleEnabled = ([null, undefined].includes(group.userTitleEnabled)) ? 1 : group.userTitleEnabled;
group.labelColor = validator.escape(String(group.labelColor || '#000000'));
group.icon = validator.escape(String(group.icon || ''));
group.createtimeISO = utils.toISOString(group.createtime);
group.private = ([null, undefined].includes(group.private)) ? 1 : group.private;
group['cover:url'] = group['cover:url'] || require('../coverPhoto').getDefaultGroupCover(group.name);
group['cover:thumb:url'] = group['cover:thumb:url'] || group['cover:url'];
group['cover:position'] = validator.escape(String(group['cover:position'] || '50% 50%'));
}
}
function escapeGroupData(group) {
if (group) {
group.nameEncoded = encodeURIComponent(group.name);
group.displayName = validator.escape(String(group.name));
group.description = validator.escape(String(group.description || ''));
group.userTitle = validator.escape(String(group.userTitle || '')) || group.displayName;
}
}