closes #3188, closes #3170

v1.18.x
Barış Soner Uşaklı 10 years ago
parent 05c5196965
commit 4420e7a9fc

@ -1,7 +1,7 @@
"use strict";
/* globals app, define, ajaxify, socket, bootbox, utils, templates */
define('forum/groups/list', function() {
define('forum/groups/list', ['forum/infinitescroll'], function(infinitescroll) {
var Groups = {};
Groups.init = function() {
@ -13,6 +13,8 @@ define('forum/groups/list', function() {
ajaxify.go('groups/' + groupSlug);
});
infinitescroll.init(Groups.loadMoreGroups);
// Group creation
$('button[data-action="new"]').on('click', function() {
bootbox.prompt('Group Name:', function(name) {
@ -29,13 +31,41 @@ define('forum/groups/list', function() {
}
});
});
var params = utils.params();
$('#search-sort').val(params.sort || 'alpha');
// Group searching
$('#search-text').on('keyup', Groups.search);
$('#search-button').on('click', Groups.search);
$('#search-sort').on('change', Groups.search);
$('#search-sort').on('change', function() {
ajaxify.go('groups?sort=' + $('#search-sort').val());
});
};
Groups.loadMoreGroups = function(direction) {
if (direction < 0) {
return;
}
infinitescroll.loadMore('groups.loadMore', {
sort: $('#search-sort').val(),
after: $('[component="groups/container"]').attr('data-nextstart')
}, function(data, done) {
console.log(data);
if (data && data.groups.length) {
templates.parse('partials/groups/list', {
groups: data.groups
}, function(html) {
$('#groups-list').append(html);
done();
});
} else {
done();
}
$('[component="groups/container"]').attr('data-nextstart', data.nextStart);
});
}
Groups.search = function() {
var groupsEl = $('#groups-list'),
queryEl = $('#search-text'),
@ -44,8 +74,6 @@ define('forum/groups/list', function() {
socket.emit('groups.search', {
query: queryEl.val(),
options: {
expand: true,
truncateUserList: true,
sort: sortEl.val()
}
}, function(err, groups) {

@ -397,11 +397,15 @@ adminController.extend.rewards = function(req, res, next) {
};
adminController.groups.get = function(req, res, next) {
groups.list(req.uid, 0, -1, function(err, groups) {
groups.getGroupsFromSet('groups:createtime', req.uid, 0, -1, function(err, groups) {
if (err) {
return next(err);
}
groups = groups.filter(function(group) {
return group && group.name.indexOf(':privileges:') === -1 && group.name !== 'registered-users';
});
res.render('admin/manage/groups', {
groups: groups,
yourid: req.user.uid

@ -2,25 +2,42 @@
var async = require('async'),
nconf = require('nconf'),
db = require('../database'),
meta = require('../meta'),
groups = require('../groups'),
user = require('../user'),
helpers = require('./helpers'),
pagination = require('../pagination'),
groupsController = {};
groupsController.list = function(req, res, next) {
groups.list(req.uid, 0, -1, function(err, groups) {
var sort = req.query.sort || 'alpha';
groupsController.getGroupsFromSet(req.uid, sort, 0, 8, function(err, data) {
if (err) {
return next(err);
}
res.render('groups/list', data);
});
};
groups = groups.filter(function(group) {
return group && !group.hidden && !group.system;
});
groupsController.getGroupsFromSet = function(uid, sort, start, stop, callback) {
var set = 'groups:visible:name';
if (sort === 'count') {
set = 'groups:visible:memberCount';
} else if (sort === 'date') {
set = 'groups:visible:createtime';
}
groups.getGroupsFromSet(set, uid, start, stop, function(err, groups) {
if (err) {
return callback(err);
}
res.render('groups/list', {
callback(null, {
groups: groups,
allowGroupCreation: parseInt(meta.config.allowGroupCreation, 10) === 1
allowGroupCreation: parseInt(meta.config.allowGroupCreation, 10) === 1,
nextStart: stop + 1
});
});
};

@ -57,15 +57,28 @@ var async = require('async'),
return ephemeralGroups;
};
Groups.list = function(uid, start, stop, callback) {
db.getSortedSetRevRange('groups:createtime', start, stop, function (err, groupNames) {
Groups.getGroupsFromSet = function(set, uid, start, stop, callback) {
var method;
var args;
if (set === 'groups:visible:name') {
method = db.getSortedSetRangeByLex;
args = [set, '-', '+', start, stop - start + 1, done];
} else {
method = db.getSortedSetRevRange;
args = [set, start, stop, done];
}
method.apply(null, args);
function done(err, groupNames) {
if (err) {
return callback(err);
}
groupNames = groupNames.filter(function(groupName) {
return groupName && groupName.indexOf(':privileges:') === -1 && groupName !== 'registered-users' && groupName !== 'guests';
});
if (set === 'groups:visible:name') {
groupNames = groupNames.map(function(name) {
return name.split(':')[1];
});
}
async.parallel({
groups: function(next) {
@ -89,7 +102,7 @@ var async = require('async'),
callback(null, data.groups);
});
});
}
};
Groups.getGroups = function(start, stop, callback) {

@ -49,6 +49,12 @@ module.exports = function(Groups) {
groupData.ownerUid = data.ownerUid;
}
if (!data.hidden && !system) {
tasks.push(async.apply(db.sortedSetAdd, 'groups:visible:createtime', timestamp, data.name));
tasks.push(async.apply(db.sortedSetAdd, 'groups:visible:memberCount', memberCount, data.name));
tasks.push(async.apply(db.sortedSetAdd, 'groups:visible:name', 0, data.name.toLowerCase() + ':' + data.name));
}
if (!data.hidden) {
tasks.push(async.apply(db.setObjectField, 'groupslug:groupname', slug, data.name));
}

@ -21,6 +21,9 @@ module.exports = function(Groups) {
async.parallel([
async.apply(db.delete, 'group:' + groupName),
async.apply(db.sortedSetRemove, 'groups:createtime', groupName),
async.apply(db.sortedSetRemove, 'groups:visible:createtime', groupName),
async.apply(db.sortedSetRemove, 'groups:visible:memberCount', groupName),
async.apply(db.sortedSetRemove, 'groups:visible:name', groupName.toLowerCase() + ':' + groupName),
async.apply(db.delete, 'group:' + groupName + ':members'),
async.apply(db.delete, 'group:' + groupName + ':pending'),
async.apply(db.delete, 'group:' + groupName + ':invited'),

@ -9,7 +9,7 @@ var async = require('async'),
plugins = require('../plugins'),
utils = require('../../public/src/utils'),
db = require('./../database'),
db = require('../database'),
uploadsController = require('../controllers/uploads');
@ -46,6 +46,7 @@ module.exports = function(Groups) {
async.series([
async.apply(updatePrivacy, groupName, values.private),
async.apply(updateVisibility, groupName, values.hidden),
async.apply(db.setObject, 'group:' + groupName, payload),
async.apply(renameGroup, groupName, values.name)
], function(err) {
@ -62,6 +63,27 @@ module.exports = function(Groups) {
});
};
function updateVisibility(groupName, hidden, callback) {
if (hidden) {
async.parallel([
async.apply(db.sortedSetRemove, 'groups:visible:createtime', groupName),
async.apply(db.sortedSetRemove, 'groups:visible:memberCount', groupName),
async.apply(db.sortedSetRemove, 'groups:visible:name', groupName.toLowerCase() + ':' + groupName)
], callback);
} else {
db.getObjectFields('group:' + groupName, ['createtime', 'memberCount'], function(err, groupData) {
if (err) {
return callback(err);
}
async.parallel([
async.apply(db.sortedSetAdd, 'groups:visible:createtime', groupData.createtime, groupName),
async.apply(db.sortedSetAdd, 'groups:visible:memberCount', groupData.memberCount, groupName),
async.apply(db.sortedSetAdd, 'groups:visible:name', 0, groupName.toLowerCase() + ':' + groupName)
], callback);
});
}
}
Groups.hide = function(groupName, callback) {
callback = callback || function() {};
db.setObjectField('group:' + groupName, 'hidden', 1, callback);
@ -195,7 +217,11 @@ module.exports = function(Groups) {
async.apply(db.rename, 'group:' + oldName + ':owners', 'group:' + newName + ':owners'),
async.apply(db.rename, 'group:' + oldName + ':pending', 'group:' + newName + ':pending'),
async.apply(db.rename, 'group:' + oldName + ':invited', 'group:' + newName + ':invited'),
async.apply(renameGroupMember, 'groups:createtime', oldName, newName),
async.apply(renameGroupMember, 'groups:visible:createtime', oldName, newName),
async.apply(renameGroupMember, 'groups:visible:memberCount', oldName, newName),
async.apply(renameGroupMember, 'groups:visible:name', oldName.toLowerCase() + ':' + oldName, newName.toLowerCase() + ':' + newName),
function(next) {
plugins.fireHook('action:group.rename', {
old: oldName,

@ -1,10 +1,11 @@
"use strict";
var groups = require('../groups'),
var async = require('async'),
groups = require('../groups'),
meta = require('../meta'),
user = require('../user'),
async = require('async'),
groupsController = require('../controllers/groups'),
SocketGroups = {};
@ -181,7 +182,26 @@ SocketGroups.search = function(socket, data, callback) {
return callback(null, []);
}
groups.search(data.query || '', data.options || {}, callback);
if (!data.query) {
var groupsPerPage = 9;
groupsController.getGroupsFromSet(socket.uid, data.options.sort, 0, groupsPerPage - 1, function(err, data) {
callback(err, !err ? data.groups : null);
});
return;
}
groups.search(data.query, data.options || {}, callback);
};
SocketGroups.loadMore = function(socket, data, callback) {
if (!data || !data.sort || !data.after) {
return callback();
}
var groupsPerPage = 9;
var start = parseInt(data.after);
var stop = start + groupsPerPage - 1;
groupsController.getGroupsFromSet(socket.uid, data.sort, start, stop, callback);
};
SocketGroups.searchMembers = function(socket, data, callback) {

@ -21,7 +21,7 @@ var db = require('./database'),
schemaDate, thisSchemaDate,
// IMPORTANT: REMEMBER TO UPDATE VALUE OF latestSchema
latestSchema = Date.UTC(2015, 4, 20);
latestSchema = Date.UTC(2015, 5, 2);
Upgrade.check = function(callback) {
db.get('schemaDate', function(err, value) {
@ -377,8 +377,52 @@ Upgrade.upgrade = function(callback) {
winston.info('[2015/05/20] Adding username:sorted and email:sorted skipped');
next();
}
},
function(next) {
thisSchemaDate = Date.UTC(2015, 5, 2);
if (schemaDate < thisSchemaDate) {
updatesMade = true;
winston.info('[2015/06/02] Creating group sorted sets');
db.getSortedSetRange('groups:createtime', 0, -1, function(err, groupNames) {
if (err) {
return callback(err);
}
async.eachLimit(groupNames, 500, function(groupName, next) {
if (!groupName) {
return next();
}
db.getObjectFields('group:' + groupName, ['hidden', 'system', 'createtime', 'memberCount'], function(err, groupData) {
if (err) {
return next(err);
}
if (parseInt(groupData.hidden, 10) === 1 || parseInt(groupData.system, 10) === 1) {
return next();
}
async.parallel([
async.apply(db.sortedSetAdd, 'groups:visible:createtime', groupData.createtime, groupName),
async.apply(db.sortedSetAdd, 'groups:visible:memberCount', groupData.memberCount, groupName),
async.apply(db.sortedSetAdd, 'groups:visible:name', 0, groupName.toLowerCase() + ':' + groupName)
], next);
});
}, function(err) {
if (err) {
return next(err);
}
winston.info('[2015/06/02] Creating group sorted sets done');
Upgrade.update(thisSchemaDate, next);
});
});
} else {
winston.info('[2015/06/02] Creating group sorted sets skipped');
next();
}
}
// Add new schema updates here
// IMPORTANT: REMEMBER TO UPDATE VALUE OF latestSchema IN LINE 24!!!
], function(err) {

Loading…
Cancel
Save