[IMPROVE] Sort Users List In Case Insensitive Manner (#20790)

pull/21071/head^2
Aditya Mitra 5 years ago committed by GitHub
parent 3d6cd21b23
commit 5392f0957d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 58
      app/api/server/lib/users.js
  2. 51
      app/api/server/v1/users.js

@ -28,3 +28,61 @@ export async function findUsersToAutocomplete({ uid, selector }) {
items: users,
};
}
/**
* Returns a new query object with the inclusive fields only
* @param {Object} query search query for matching rows
*/
export function getInclusiveFields(query) {
const newQuery = {};
for (const [key, value] of Object.entries(query)) {
if (value === 1) {
newQuery[key] = value;
}
}
return newQuery;
}
/**
* get the default fields if **fields** are empty (`{}`) or `undefined`/`null`
* @param {Object|null|undefined} fields the fields from parsed jsonQuery
*/
export function getNonEmptyFields(fields) {
const defaultFields = {
name: 1,
username: 1,
emails: 1,
roles: 1,
status: 1,
active: 1,
avatarETag: 1,
};
if (!fields || Object.keys(fields).length === 0) {
return defaultFields;
}
return { ...defaultFields, ...fields };
}
/**
* get the default query if **query** is empty (`{}`) or `undefined`/`null`
* @param {Object|null|undefined} query the query from parsed jsonQuery
*/
export function getNonEmptyQuery(query) {
const defaultQuery = {
$or: [
{ 'emails.address': { $regex: '', $options: 'i' } },
{ username: { $regex: '', $options: 'i' } },
{ name: { $regex: '', $options: 'i' } },
],
};
if (!query || Object.keys(query).length === 0) {
return defaultQuery;
}
return { ...defaultQuery, ...query };
}

@ -5,6 +5,7 @@ import _ from 'underscore';
import Busboy from 'busboy';
import { Users, Subscriptions } from '../../../models/server';
import { Users as UsersRaw } from '../../../models/server/raw';
import { hasPermission } from '../../../authorization';
import { settings } from '../../../settings';
import { getURL } from '../../../utils';
@ -19,7 +20,7 @@ import {
import { getFullUserDataByIdOrUsername } from '../../../lib/server/functions/getFullUserData';
import { API } from '../api';
import { setStatusText } from '../../../lib/server';
import { findUsersToAutocomplete } from '../lib/users';
import { findUsersToAutocomplete, getInclusiveFields, getNonEmptyFields, getNonEmptyQuery } from '../lib/users';
import { getUserForCheck, emailCheck } from '../../../2fa/server/code';
import { resetUserE2EEncriptionKey } from '../../../../server/lib/resetUserE2EKey';
import { setUserStatus } from '../../../../imports/users-presence/server/activeUsers';
@ -229,18 +230,52 @@ API.v1.addRoute('users.list', { authRequired: true }, {
const { offset, count } = this.getPaginationItems();
const { sort, fields, query } = this.parseJsonQuery();
const users = Users.find(query, {
sort: sort || { username: 1 },
skip: offset,
limit: count,
fields,
}).fetch();
const nonEmptyQuery = getNonEmptyQuery(query);
const nonEmptyFields = getNonEmptyFields(fields);
const inclusiveFields = getInclusiveFields(nonEmptyFields);
const actualSort = sort && sort.name ? { nameInsensitive: sort.name, ...sort } : sort || { username: 1 };
const result = Promise.await(
UsersRaw.col
.aggregate([
{
$match: nonEmptyQuery,
},
{
$project: inclusiveFields,
},
{
$addFields: {
nameInsensitive: {
$toLower: '$name',
},
},
},
{
$skip: offset,
},
{
$limit: count,
},
{
$facet: {
sortedResults: [{ $sort: actualSort }],
totalCount: [{ $count: 'value' }],
},
},
])
.toArray(),
);
const { sortedResults: users, totalCount } = result[0];
return API.v1.success({
users,
count: users.length,
offset,
total: Users.find(query).count(),
total: totalCount[0].value,
});
},
});

Loading…
Cancel
Save