Files
NodeBB/src/groups/create.js

93 lines
3.1 KiB
JavaScript
Raw Normal View History

2015-05-26 12:37:31 -04:00
'use strict';
2019-07-18 13:01:43 -04:00
const meta = require('../meta');
const plugins = require('../plugins');
const utils = require('../utils');
const db = require('../database');
2015-05-26 12:37:31 -04:00
module.exports = function (Groups) {
2019-07-18 13:01:43 -04:00
Groups.create = async function (data) {
const isSystem = isSystemGroup(data);
const timestamp = data.timestamp || Date.now();
let disableJoinRequests = parseInt(data.disableJoinRequests, 10) === 1 ? 1 : 0;
2016-11-11 12:17:12 +03:00
if (data.name === 'administrators') {
disableJoinRequests = 1;
}
const disableLeave = parseInt(data.disableLeave, 10) === 1 ? 1 : 0;
2019-07-18 13:01:43 -04:00
const isHidden = parseInt(data.hidden, 10) === 1;
validateGroupName(data.name);
const exists = await meta.userOrGroupExists(data.name);
if (exists) {
throw new Error('[[error:group-already-exists]]');
}
const memberCount = data.hasOwnProperty('ownerUid') ? 1 : 0;
2019-10-01 11:09:44 -04:00
const isPrivate = data.hasOwnProperty('private') && data.private !== undefined ? parseInt(data.private, 10) === 1 : true;
2019-07-18 13:01:43 -04:00
const groupData = {
name: data.name,
slug: utils.slugify(data.name),
createtime: timestamp,
userTitle: data.userTitle || data.name,
userTitleEnabled: parseInt(data.userTitleEnabled, 10) === 1 ? 1 : 0,
description: data.description || '',
memberCount: memberCount,
hidden: isHidden ? 1 : 0,
system: isSystem ? 1 : 0,
2019-10-01 11:09:44 -04:00
private: isPrivate ? 1 : 0,
2019-07-18 13:01:43 -04:00
disableJoinRequests: disableJoinRequests,
disableLeave: disableLeave,
2019-07-18 13:01:43 -04:00
};
plugins.fireHook('filter:group.create', { group: groupData, data: data });
await db.sortedSetAdd('groups:createtime', groupData.createtime, groupData.name);
await db.setObject('group:' + groupData.name, groupData);
if (data.hasOwnProperty('ownerUid')) {
await db.setAdd('group:' + groupData.name + ':owners', data.ownerUid);
await db.sortedSetAdd('group:' + groupData.name + ':members', timestamp, data.ownerUid);
groupData.ownerUid = data.ownerUid;
}
if (!isHidden && !isSystem) {
await db.sortedSetAddBulk([
['groups:visible:createtime', timestamp, groupData.name],
['groups:visible:memberCount', groupData.memberCount, groupData.name],
['groups:visible:name', 0, groupData.name.toLowerCase() + ':' + groupData.name],
]);
}
await db.setObjectField('groupslug:groupname', groupData.slug, groupData.name);
plugins.fireHook('action:group.create', { group: groupData });
return groupData;
2015-05-26 12:37:31 -04:00
};
2015-09-10 16:33:10 -04:00
2016-11-11 12:17:12 +03:00
function isSystemGroup(data) {
return data.system === true || parseInt(data.system, 10) === 1 ||
data.name === 'administrators' || data.name === 'registered-users' || data.name === 'Global Moderators' ||
Groups.isPrivilegeGroup(data.name);
2016-11-11 12:17:12 +03:00
}
2019-07-18 13:01:43 -04:00
function validateGroupName(name) {
2015-09-10 16:33:10 -04:00
if (!name) {
2019-07-18 13:01:43 -04:00
throw new Error('[[error:group-name-too-short]]');
2015-09-10 16:33:10 -04:00
}
if (!Groups.isPrivilegeGroup(name) && name.length > meta.config.maximumGroupNameLength) {
2019-07-18 13:01:43 -04:00
throw new Error('[[error:group-name-too-long]]');
2016-06-14 11:07:36 +03:00
}
2018-05-02 13:49:08 -04:00
if (name === 'guests' || (!Groups.isPrivilegeGroup(name) && name.includes(':'))) {
2019-07-18 13:01:43 -04:00
throw new Error('[[error:invalid-group-name]]');
2016-12-07 11:57:19 +03:00
}
2018-01-09 14:33:23 -05:00
if (name.includes('/') || !utils.slugify(name)) {
2019-07-18 13:01:43 -04:00
throw new Error('[[error:invalid-group-name]]');
2015-09-10 16:33:10 -04:00
}
}
2015-05-26 12:37:31 -04:00
};