|
|
|
'use strict';
|
|
|
|
|
|
|
|
var async = require('async'),
|
|
|
|
db = require('../database'),
|
|
|
|
plugins = require('../plugins');
|
|
|
|
|
|
|
|
module.exports = function (Groups) {
|
|
|
|
|
|
|
|
Groups.ownership = {};
|
|
|
|
|
|
|
|
Groups.ownership.isOwner = function (uid, groupName, callback) {
|
|
|
|
if (!uid) {
|
|
|
|
return callback(null, false);
|
|
|
|
}
|
|
|
|
db.isSetMember('group:' + groupName + ':owners', uid, callback);
|
|
|
|
};
|
|
|
|
|
|
|
|
Groups.ownership.isOwners = function (uids, groupName, callback) {
|
|
|
|
if (!Array.isArray(uids)) {
|
|
|
|
return callback(null, []);
|
|
|
|
}
|
|
|
|
|
|
|
|
db.isSetMembers('group:' + groupName + ':owners', uids, callback);
|
|
|
|
};
|
|
|
|
|
|
|
|
Groups.ownership.grant = function (toUid, groupName, callback) {
|
|
|
|
// Note: No ownership checking is done here on purpose!
|
|
|
|
async.waterfall([
|
|
|
|
function (next) {
|
|
|
|
db.setAdd('group:' + groupName + ':owners', toUid, next);
|
|
|
|
},
|
|
|
|
function (next) {
|
|
|
|
plugins.fireHook('action:group.grantOwnership', {uid: toUid, groupName: groupName});
|
|
|
|
next();
|
|
|
|
},
|
|
|
|
], callback);
|
|
|
|
};
|
|
|
|
|
|
|
|
Groups.ownership.rescind = function (toUid, groupName, callback) {
|
|
|
|
// Note: No ownership checking is done here on purpose!
|
|
|
|
|
|
|
|
// If the owners set only contains one member, error out!
|
|
|
|
async.waterfall([
|
|
|
|
function (next) {
|
|
|
|
db.setCount('group:' + groupName + ':owners', next);
|
|
|
|
},
|
|
|
|
function (numOwners, next) {
|
|
|
|
if (numOwners <= 1) {
|
|
|
|
return next(new Error('[[error:group-needs-owner]]'));
|
|
|
|
}
|
|
|
|
db.setRemove('group:' + groupName + ':owners', toUid, next);
|
|
|
|
},
|
|
|
|
function (next) {
|
|
|
|
plugins.fireHook('action:group.rescindOwnership', {uid: toUid, groupName: groupName});
|
|
|
|
next();
|
|
|
|
},
|
|
|
|
], callback);
|
|
|
|
};
|
|
|
|
};
|