refactor: deprecate socket.emit('users.search') use api route

v1.18.x
Barış Soner Uşaklı 4 years ago
parent 083c74e059
commit 2279e37261

@ -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(data) {
}); var chatsListEl = $('[component="chat/search/list"]');
}
function displayResults(chatsListEl, data) {
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>

Loading…
Cancel
Save