mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-10-26 16:46:12 +01:00
refactor: deprecate socket.emit('users.search') use api route
This commit is contained in:
@@ -1,6 +1,9 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
define('forum/account/blocks', ['forum/account/header'], function (header) {
|
define('forum/account/blocks', [
|
||||||
|
'forum/account/header',
|
||||||
|
'api',
|
||||||
|
], function (header, api) {
|
||||||
var Blocks = {};
|
var Blocks = {};
|
||||||
|
|
||||||
Blocks.init = function () {
|
Blocks.init = function () {
|
||||||
@@ -9,9 +12,10 @@ define('forum/account/blocks', ['forum/account/header'], function (header) {
|
|||||||
$('#user-search').on('keyup', function () {
|
$('#user-search').on('keyup', function () {
|
||||||
var username = this.value;
|
var username = this.value;
|
||||||
|
|
||||||
socket.emit('user.search', {
|
api.get('/api/users', {
|
||||||
query: username,
|
query: username,
|
||||||
searchBy: 'username',
|
searchBy: 'username',
|
||||||
|
paginate: false,
|
||||||
}, function (err, data) {
|
}, function (err, data) {
|
||||||
if (err) {
|
if (err) {
|
||||||
return app.alertError(err.message);
|
return app.alertError(err.message);
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
|
||||||
define('forum/chats/search', ['components'], function (components) {
|
define('forum/chats/search', ['components', 'api'], function (components, api) {
|
||||||
var search = {};
|
var search = {};
|
||||||
|
|
||||||
search.init = function () {
|
search.init = function () {
|
||||||
@@ -19,26 +19,20 @@ define('forum/chats/search', ['components'], function (components) {
|
|||||||
|
|
||||||
function doSearch() {
|
function doSearch() {
|
||||||
var username = components.get('chat/search').val();
|
var username = components.get('chat/search').val();
|
||||||
var chatsListEl = $('[component="chat/search/list"]');
|
|
||||||
|
|
||||||
if (!username) {
|
if (!username) {
|
||||||
return chatsListEl.empty();
|
return $('[component="chat/search/list"]').empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
socket.emit('user.search', {
|
api.get('/api/users', {
|
||||||
query: username,
|
query: username,
|
||||||
searchBy: 'username',
|
searchBy: 'username',
|
||||||
paginate: false,
|
paginate: false,
|
||||||
}, function (err, data) {
|
}).then(displayResults)
|
||||||
if (err) {
|
.catch(app.alertError);
|
||||||
return app.alertError(err.message);
|
|
||||||
}
|
|
||||||
|
|
||||||
displayResults(chatsListEl, data);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function displayResults(chatsListEl, data) {
|
function displayResults(data) {
|
||||||
|
var chatsListEl = $('[component="chat/search/list"]');
|
||||||
chatsListEl.empty();
|
chatsListEl.empty();
|
||||||
|
|
||||||
data.users = data.users.filter(function (user) {
|
data.users = data.users.filter(function (user) {
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ define('forum/groups/memberlist', ['api'], function (api) {
|
|||||||
$(this).find('i').toggleClass('invisible');
|
$(this).find('i').toggleClass('invisible');
|
||||||
});
|
});
|
||||||
modal.find('input').on('keyup', function () {
|
modal.find('input').on('keyup', function () {
|
||||||
socket.emit('user.search', {
|
api.get('/api/users', {
|
||||||
query: $(this).val(),
|
query: $(this).val(),
|
||||||
paginate: false,
|
paginate: false,
|
||||||
}, function (err, result) {
|
}, function (err, result) {
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
|
||||||
define('forum/users', ['translator', 'benchpress'], function (translator, Benchpress) {
|
define('forum/users', [
|
||||||
|
'translator', 'benchpress', 'api',
|
||||||
|
], function (translator, Benchpress, api) {
|
||||||
var Users = {};
|
var Users = {};
|
||||||
|
|
||||||
var searchTimeoutID = 0;
|
var searchTimeoutID = 0;
|
||||||
@@ -95,12 +97,9 @@ define('forum/users', ['translator', 'benchpress'], function (translator, Benchp
|
|||||||
|
|
||||||
|
|
||||||
function loadPage(query) {
|
function loadPage(query) {
|
||||||
var qs = decodeURIComponent($.param(query));
|
api.get('/api/users', query)
|
||||||
$.get(config.relative_path + '/api/users?' + qs, renderSearchResults).fail(function (xhrErr) {
|
.then(renderSearchResults)
|
||||||
if (xhrErr && xhrErr.responseJSON && xhrErr.responseJSON.error) {
|
.catch(app.alertError);
|
||||||
app.alertError(xhrErr.responseJSON.error);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderSearchResults(data) {
|
function renderSearchResults(data) {
|
||||||
@@ -112,6 +111,7 @@ define('forum/users', ['translator', 'benchpress'], function (translator, Benchp
|
|||||||
data.users = data.users.slice(0, searchResultCount);
|
data.users = data.users.slice(0, searchResultCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
data.isAdminOrGlobalMod = app.user.isAdmin || app.user.isGlobalMod;
|
||||||
Benchpress.parse('users', 'users', data, function (html) {
|
Benchpress.parse('users', 'users', data, function (html) {
|
||||||
translator.translate(html, function (translated) {
|
translator.translate(html, function (translated) {
|
||||||
translated = $(translated);
|
translated = $(translated);
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
|
||||||
define('autocomplete', function () {
|
define('autocomplete', ['api'], function (api) {
|
||||||
var module = {};
|
var module = {};
|
||||||
|
|
||||||
module.user = function (input, params, onselect) {
|
module.user = function (input, params, onselect) {
|
||||||
@@ -23,7 +23,7 @@ define('autocomplete', function () {
|
|||||||
source: function (request, response) {
|
source: function (request, response) {
|
||||||
params.query = request.term;
|
params.query = request.term;
|
||||||
|
|
||||||
socket.emit('user.search', params, function (err, result) {
|
api.get('/api/users', params, function (err, result) {
|
||||||
if (err) {
|
if (err) {
|
||||||
return app.alertError(err.message);
|
return app.alertError(err.message);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -245,3 +245,29 @@ async function canDeleteUids(uids) {
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
usersAPI.search = async function (caller, data) {
|
||||||
|
const [allowed, isPrivileged] = await Promise.all([
|
||||||
|
privileges.global.can('search:users', caller.uid),
|
||||||
|
user.isPrivileged(caller.uid),
|
||||||
|
]);
|
||||||
|
let filters = data.filters || [];
|
||||||
|
filters = Array.isArray(filters) ? filters : [filters];
|
||||||
|
if (!allowed ||
|
||||||
|
((
|
||||||
|
data.searchBy === 'ip' ||
|
||||||
|
data.searchBy === 'email' ||
|
||||||
|
filters.includes('banned') ||
|
||||||
|
filters.includes('flagged')
|
||||||
|
) && !isPrivileged)
|
||||||
|
) {
|
||||||
|
throw new Error('[[error:no-privileges]]');
|
||||||
|
}
|
||||||
|
return await user.search({
|
||||||
|
query: data.query,
|
||||||
|
searchBy: data.searchBy || 'username',
|
||||||
|
page: data.page || 1,
|
||||||
|
sortBy: data.sortBy || 'lastonline',
|
||||||
|
filters: filters,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ async function getUsers(req, res) {
|
|||||||
postcount: 'users:postcount',
|
postcount: 'users:postcount',
|
||||||
reputation: 'users:reputation',
|
reputation: 'users:reputation',
|
||||||
joindate: 'users:joindate',
|
joindate: 'users:joindate',
|
||||||
online: 'users:online',
|
lastonline: 'users:online',
|
||||||
flags: 'users:flags',
|
flags: 'users:flags',
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ const db = require('../database');
|
|||||||
const pagination = require('../pagination');
|
const pagination = require('../pagination');
|
||||||
const privileges = require('../privileges');
|
const privileges = require('../privileges');
|
||||||
const helpers = require('./helpers');
|
const helpers = require('./helpers');
|
||||||
|
const api = require('../api');
|
||||||
|
|
||||||
const usersController = module.exports;
|
const usersController = module.exports;
|
||||||
|
|
||||||
@@ -31,35 +32,10 @@ usersController.index = async function (req, res, next) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
usersController.search = async function (req, res) {
|
usersController.search = async function (req, res) {
|
||||||
const [allowed, isPrivileged] = await Promise.all([
|
const searchData = await api.users.search(req, req.query);
|
||||||
privileges.global.can('search:users', req.uid),
|
|
||||||
user.isPrivileged(req.uid),
|
|
||||||
]);
|
|
||||||
let filters = req.query.filters || [];
|
|
||||||
filters = Array.isArray(filters) ? filters : [filters];
|
|
||||||
if (!allowed ||
|
|
||||||
((
|
|
||||||
req.query.searchBy === 'ip' ||
|
|
||||||
req.query.searchBy === 'email' ||
|
|
||||||
filters.includes('banned') ||
|
|
||||||
filters.includes('flagged')
|
|
||||||
) && !isPrivileged)
|
|
||||||
) {
|
|
||||||
throw new Error('[[error:no-privileges]]');
|
|
||||||
}
|
|
||||||
const [searchData, isAdminOrGlobalMod] = await Promise.all([
|
|
||||||
user.search({
|
|
||||||
query: req.query.query,
|
|
||||||
searchBy: req.query.searchBy || 'username',
|
|
||||||
page: req.query.page || 1,
|
|
||||||
sortBy: req.query.sortBy || 'joindate',
|
|
||||||
filters: filters,
|
|
||||||
}),
|
|
||||||
user.isAdminOrGlobalMod(req.uid),
|
|
||||||
]);
|
|
||||||
const section = req.query.section || 'joindate';
|
const section = req.query.section || 'joindate';
|
||||||
|
|
||||||
searchData.isAdminOrGlobalMod = isAdminOrGlobalMod;
|
|
||||||
searchData.pagination = pagination.create(req.query.page, searchData.pageCount, req.query);
|
searchData.pagination = pagination.create(req.query.page, searchData.pageCount, req.query);
|
||||||
searchData['section_' + section] = true;
|
searchData['section_' + section] = true;
|
||||||
searchData.displayUserSearch = true;
|
searchData.displayUserSearch = true;
|
||||||
|
|||||||
@@ -1,43 +1,17 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const user = require('../../user');
|
|
||||||
const pagination = require('../../pagination');
|
const pagination = require('../../pagination');
|
||||||
const privileges = require('../../privileges');
|
const api = require('../../api');
|
||||||
|
const sockets = require('..');
|
||||||
|
|
||||||
module.exports = function (SocketUser) {
|
module.exports = function (SocketUser) {
|
||||||
SocketUser.search = async function (socket, data) {
|
SocketUser.search = async function (socket, data) {
|
||||||
// TODO: depracate and use usersController.search
|
sockets.warnDeprecated(socket, 'GET /api/users');
|
||||||
if (!data) {
|
if (!data) {
|
||||||
throw new Error('[[error:invalid-data]]');
|
throw new Error('[[error:invalid-data]]');
|
||||||
}
|
}
|
||||||
const [allowed, isPrivileged] = await Promise.all([
|
const result = api.users.search(socket, data);
|
||||||
privileges.global.can('search:users', socket.uid),
|
|
||||||
user.isPrivileged(socket.uid),
|
|
||||||
]);
|
|
||||||
|
|
||||||
let filters = data.filters || [];
|
|
||||||
filters = Array.isArray(filters) ? filters : [filters];
|
|
||||||
if (!allowed ||
|
|
||||||
((
|
|
||||||
data.searchBy === 'ip' ||
|
|
||||||
data.searchBy === 'email' ||
|
|
||||||
filters.includes('banned') ||
|
|
||||||
filters.includes('flagged')
|
|
||||||
) && !isPrivileged)
|
|
||||||
) {
|
|
||||||
throw new Error('[[error:no-privileges]]');
|
|
||||||
}
|
|
||||||
const result = await user.search({
|
|
||||||
query: data.query,
|
|
||||||
page: data.page,
|
|
||||||
searchBy: data.searchBy,
|
|
||||||
sortBy: data.sortBy,
|
|
||||||
filters: data.filters,
|
|
||||||
paginate: data.paginate,
|
|
||||||
uid: socket.uid,
|
|
||||||
});
|
|
||||||
result.pagination = pagination.create(data.page, result.pageCount);
|
result.pagination = pagination.create(data.page, result.pageCount);
|
||||||
result['route_users:' + data.sortBy] = true;
|
|
||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -98,7 +98,7 @@
|
|||||||
<th data-sort="reputation" class="text-right pointer">[[admin/manage/users:users.reputation]] {{{if sort_reputation}}}<i class="fa fa-sort-{{{if reverse}}}down{{{else}}}up{{{end}}}">{{{end}}}</th>
|
<th data-sort="reputation" class="text-right pointer">[[admin/manage/users:users.reputation]] {{{if sort_reputation}}}<i class="fa fa-sort-{{{if reverse}}}down{{{else}}}up{{{end}}}">{{{end}}}</th>
|
||||||
<th data-sort="flags" class="text-right pointer">[[admin/manage/users:users.flags]] {{{if sort_flags}}}<i class="fa fa-sort-{{{if reverse}}}down{{{else}}}up{{{end}}}">{{{end}}}</th>
|
<th data-sort="flags" class="text-right pointer">[[admin/manage/users:users.flags]] {{{if sort_flags}}}<i class="fa fa-sort-{{{if reverse}}}down{{{else}}}up{{{end}}}">{{{end}}}</th>
|
||||||
<th data-sort="joindate" class="pointer">[[admin/manage/users:users.joined]] {{{if sort_joindate}}}<i class="fa fa-sort-{{{if reverse}}}down{{{else}}}up{{{end}}}">{{{end}}}</th>
|
<th data-sort="joindate" class="pointer">[[admin/manage/users:users.joined]] {{{if sort_joindate}}}<i class="fa fa-sort-{{{if reverse}}}down{{{else}}}up{{{end}}}">{{{end}}}</th>
|
||||||
<th data-sort="online" class="pointer">[[admin/manage/users:users.last-online]] {{{if sort_online}}}<i class="fa fa-sort-{{{if reverse}}}down{{{else}}}up{{{end}}}">{{{end}}}</th>
|
<th data-sort="lastonline" class="pointer">[[admin/manage/users:users.last-online]] {{{if sort_online}}}<i class="fa fa-sort-{{{if reverse}}}down{{{else}}}up{{{end}}}">{{{end}}}</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
|
|||||||
Reference in New Issue
Block a user