mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-11-02 12:05:57 +01:00
search group members
This commit is contained in:
@@ -1096,4 +1096,67 @@ var async = require('async'),
|
|||||||
next(null, groups);
|
next(null, groups);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Groups.searchMembers = function(data, callback) {
|
||||||
|
|
||||||
|
function userInGroup(userGroups) {
|
||||||
|
for(var i=0; i<userGroups.length; ++i) {
|
||||||
|
if (userGroups[i].name === data.groupName) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
var searchResult;
|
||||||
|
var pagination;
|
||||||
|
|
||||||
|
if (!data.query) {
|
||||||
|
async.waterfall([
|
||||||
|
function(next) {
|
||||||
|
user.getUidsFromSet('group:' + data.groupName + ':members', 0, -1, next);
|
||||||
|
},
|
||||||
|
function(uids, next) {
|
||||||
|
pagination = user.paginate(1, uids);
|
||||||
|
|
||||||
|
uids = pagination.data;
|
||||||
|
user.getUsers(uids, data.uid, next);
|
||||||
|
},
|
||||||
|
function(users, next) {
|
||||||
|
next(null, {
|
||||||
|
users: users,
|
||||||
|
pagination: pagination.pagination
|
||||||
|
});
|
||||||
|
}
|
||||||
|
], callback);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
async.waterfall([
|
||||||
|
function(next) {
|
||||||
|
data.paginate = false;
|
||||||
|
user.search(data, next);
|
||||||
|
},
|
||||||
|
function(_searchResult, next) {
|
||||||
|
searchResult = _searchResult;
|
||||||
|
var uids = searchResult.users.map(function(user) {
|
||||||
|
return user && user.uid;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!uids.length) {
|
||||||
|
return callback(null, searchResult);
|
||||||
|
}
|
||||||
|
Groups.getUserGroups(uids, next);
|
||||||
|
},
|
||||||
|
function(groups, next) {
|
||||||
|
searchResult.users = searchResult.users.filter(function(user, index) {
|
||||||
|
return user && userInGroup(groups[index]);
|
||||||
|
});
|
||||||
|
|
||||||
|
pagination = user.paginate(data.page, searchResult.users);
|
||||||
|
searchResult.pagination = pagination.pagination;
|
||||||
|
searchResult.users = pagination.data;
|
||||||
|
next(null, searchResult);
|
||||||
|
}
|
||||||
|
], callback);
|
||||||
|
};
|
||||||
|
|
||||||
}(module.exports));
|
}(module.exports));
|
||||||
|
|||||||
@@ -184,6 +184,15 @@ SocketGroups.search = function(socket, data, callback) {
|
|||||||
groups.search(data.query || '', data.options || {}, callback);
|
groups.search(data.query || '', data.options || {}, callback);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
SocketGroups.searchMembers = function(socket, data, callback) {
|
||||||
|
if (!data) {
|
||||||
|
return callback(null, []);
|
||||||
|
}
|
||||||
|
|
||||||
|
data.uid = socket.uid;
|
||||||
|
groups.searchMembers(data, callback);
|
||||||
|
};
|
||||||
|
|
||||||
SocketGroups.kick = function(socket, data, callback) {
|
SocketGroups.kick = function(socket, data, callback) {
|
||||||
if (!data) {
|
if (!data) {
|
||||||
return callback(new Error('[[error:invalid-data]]'));
|
return callback(new Error('[[error:invalid-data]]'));
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ module.exports = function(User) {
|
|||||||
var startsWith = data.hasOwnProperty('startsWith') ? data.startsWith : true;
|
var startsWith = data.hasOwnProperty('startsWith') ? data.startsWith : true;
|
||||||
var page = data.page || 1;
|
var page = data.page || 1;
|
||||||
var uid = data.uid || 0;
|
var uid = data.uid || 0;
|
||||||
|
var paginate = data.hasOwnProperty('paginate') ? data.paginate : true;
|
||||||
|
|
||||||
if (searchBy.indexOf('ip') !== -1) {
|
if (searchBy.indexOf('ip') !== -1) {
|
||||||
return searchByIP(query, uid, callback);
|
return searchByIP(query, uid, callback);
|
||||||
@@ -25,42 +26,50 @@ module.exports = function(User) {
|
|||||||
return searchBy + ':uid';
|
return searchBy + ':uid';
|
||||||
});
|
});
|
||||||
|
|
||||||
var resultsPerPage = parseInt(meta.config.userSearchResultsPerPage, 10) || 20;
|
|
||||||
var start = Math.max(0, page - 1) * resultsPerPage;
|
|
||||||
var end = start + resultsPerPage;
|
|
||||||
var pageCount = 1;
|
|
||||||
var matchCount = 0;
|
|
||||||
var filterBy = Array.isArray(data.filterBy) ? data.filterBy : [];
|
var filterBy = Array.isArray(data.filterBy) ? data.filterBy : [];
|
||||||
|
|
||||||
|
var searchResult = {};
|
||||||
async.waterfall([
|
async.waterfall([
|
||||||
function(next) {
|
function(next) {
|
||||||
findUids(query, keys, startsWith, next);
|
findUids(query, keys, startsWith, next);
|
||||||
},
|
},
|
||||||
function(uids, next) {
|
function(uids, next) {
|
||||||
|
|
||||||
filterAndSortUids(uids, filterBy, data.sortBy, next);
|
filterAndSortUids(uids, filterBy, data.sortBy, next);
|
||||||
},
|
},
|
||||||
function(uids, next) {
|
function(uids, next) {
|
||||||
matchCount = uids.length;
|
searchResult.matchCount = uids.length;
|
||||||
uids = uids.slice(start, end);
|
|
||||||
|
if (paginate) {
|
||||||
|
var pagination = user.paginate(page, uids);
|
||||||
|
uids = pagination.data;
|
||||||
|
searchResult.pagination = pagination.pagination;
|
||||||
|
}
|
||||||
|
|
||||||
User.getUsers(uids, uid, next);
|
User.getUsers(uids, uid, next);
|
||||||
},
|
},
|
||||||
function(userData, next) {
|
function(userData, next) {
|
||||||
var data = {
|
searchResult.timing = (process.elapsedTimeSince(startTime) / 1000).toFixed(2);
|
||||||
timing: (process.elapsedTimeSince(startTime) / 1000).toFixed(2),
|
searchResult.users = userData;
|
||||||
users: userData,
|
|
||||||
matchCount: matchCount
|
|
||||||
};
|
|
||||||
|
|
||||||
var currentPage = Math.max(1, Math.ceil((start + 1) / resultsPerPage));
|
next(null, searchResult);
|
||||||
pageCount = Math.ceil(matchCount / resultsPerPage);
|
|
||||||
data.pagination = pagination.create(currentPage, pageCount);
|
|
||||||
|
|
||||||
next(null, data);
|
|
||||||
}
|
}
|
||||||
], callback);
|
], callback);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
User.paginate = function(page, data) {
|
||||||
|
var resultsPerPage = parseInt(meta.config.userSearchResultsPerPage, 10) || 20;
|
||||||
|
var start = Math.max(0, page - 1) * resultsPerPage;
|
||||||
|
var end = start + resultsPerPage;
|
||||||
|
var pageCount = Math.ceil(data.length / resultsPerPage);
|
||||||
|
var currentPage = Math.max(1, Math.ceil((start + 1) / resultsPerPage));
|
||||||
|
|
||||||
|
return {
|
||||||
|
pagination: pagination.create(currentPage, pageCount),
|
||||||
|
data: data.slice(start, end)
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
function findUids(query, keys, startsWith, callback) {
|
function findUids(query, keys, startsWith, callback) {
|
||||||
db.getObjects(keys, function(err, hashes) {
|
db.getObjects(keys, function(err, hashes) {
|
||||||
if (err || !hashes) {
|
if (err || !hashes) {
|
||||||
|
|||||||
Reference in New Issue
Block a user