1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | 1× 1× 1× 25× 25× 25× 25× 25× 25× 25× 25× 25× 25× 25× 25× 25× 25× 25× 3× 3× 3× 25× 25× 25× 25× 1× 25× 25× 25× | 'use strict'; var async = require('async'), meta = require('../meta'), plugins = require('../plugins'), utils = require('../../public/src/utils'), db = require('../database'); module.exports = function(Groups) { Groups.create = function(data, callback) { var system = data.system === true || parseInt(data.system, 10) === 1 || data.name === 'administrators' || data.name === 'registered-users' || data.name === 'Global Moderators' || Groups.isPrivilegeGroup(data.name); var groupData; var timestamp = data.timestamp || Date.now(); async.waterfall([ function (next) { validateGroupName(data.name, next); }, function (next) { meta.userOrGroupExists(data.name, next); }, function (exists, next) { Iif (exists) { return next(new Error('[[error:group-already-exists]]')); } var memberCount = data.hasOwnProperty('ownerUid') ? 1 : 0; var isPrivate = data.hasOwnProperty('private') ? parseInt(data.private, 10) : 1; var slug = utils.slugify(data.name); groupData = { name: data.name, slug: slug, createtime: timestamp, userTitle: data.userTitle || data.name, description: data.description || '', memberCount: memberCount, deleted: 0, hidden: parseInt(data.hidden, 10) === 1 ? 1 : 0, system: system ? 1 : 0, private: isPrivate, disableJoinRequests: parseInt(data.disableJoinRequests, 10) === 1 ? 1 : 0 }; plugins.fireHook('filter:group.create', {group: groupData, data: data}, next); }, function (results, next) { var tasks = [ async.apply(db.sortedSetAdd, 'groups:createtime', groupData.createtime, groupData.name), async.apply(db.setObject, 'group:' + groupData.name, groupData) ]; Iif (data.hasOwnProperty('ownerUid')) { tasks.push(async.apply(db.setAdd, 'group:' + groupData.name + ':owners', data.ownerUid)); tasks.push(async.apply(db.sortedSetAdd, 'group:' + groupData.name + ':members', timestamp, data.ownerUid)); groupData.ownerUid = data.ownerUid; } if (!data.hidden && !system) { tasks.push(async.apply(db.sortedSetAdd, 'groups:visible:createtime', timestamp, groupData.name)); tasks.push(async.apply(db.sortedSetAdd, 'groups:visible:memberCount', groupData.memberCount, groupData.name)); tasks.push(async.apply(db.sortedSetAdd, 'groups:visible:name', 0, groupData.name.toLowerCase() + ':' + groupData.name)); } tasks.push(async.apply(db.setObjectField, 'groupslug:groupname', groupData.slug, groupData.name)); async.series(tasks, next); }, function (results, next) { plugins.fireHook('action:group.create', groupData); next(null, groupData); } ], callback); }; function validateGroupName(name, callback) { Iif (!name) { return callback(new Error('[[error:group-name-too-short]]')); } Iif (name.indexOf('/') !== -1) { return callback(new Error('[[error:invalid-group-name]]')); } callback(); } }; |