mirror of
https://github.com/wassname/talk.git
synced 2026-06-29 02:00:29 +08:00
70 lines
1.5 KiB
JavaScript
70 lines
1.5 KiB
JavaScript
const DataLoader = require('dataloader');
|
|
|
|
const util = require('./util');
|
|
|
|
const UsersService = require('../../services/users');
|
|
const UserModel = require('../../models/user');
|
|
|
|
const genUserByIDs = (context, ids) => UsersService
|
|
.findByIdArray(ids)
|
|
.then(util.singleJoinBy(ids, 'id'));
|
|
|
|
/**
|
|
* Retrieves users based on the passed in query that is filtered by the
|
|
* current used passed in via the context.
|
|
* @param {Object} context graph context
|
|
* @param {Object} query query terms to apply to the users query
|
|
*/
|
|
const getUsersByQuery = ({user}, {ids, limit, cursor, statuses = null, sort}) => {
|
|
|
|
let users = UserModel.find();
|
|
|
|
if (ids) {
|
|
users = users.find({
|
|
id: {
|
|
$in: ids
|
|
}
|
|
});
|
|
}
|
|
|
|
if (statuses != null) {
|
|
users = users.where({
|
|
status: {
|
|
$in: statuses
|
|
}
|
|
});
|
|
}
|
|
|
|
if (cursor) {
|
|
if (sort === 'REVERSE_CHRONOLOGICAL') {
|
|
users = users.where({
|
|
created_at: {
|
|
$lt: cursor
|
|
}
|
|
});
|
|
} else {
|
|
users = users.where({
|
|
created_at: {
|
|
$gt: cursor
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
return users
|
|
.sort({created_at: sort === 'REVERSE_CHRONOLOGICAL' ? -1 : 1})
|
|
.limit(limit);
|
|
};
|
|
|
|
/**
|
|
* Creates a set of loaders based on a GraphQL context.
|
|
* @param {Object} context the context of the GraphQL request
|
|
* @return {Object} object of loaders
|
|
*/
|
|
module.exports = (context) => ({
|
|
Users: {
|
|
getByQuery: (query) => getUsersByQuery(context, query),
|
|
getByID: new DataLoader((ids) => genUserByIDs(context, ids))
|
|
}
|
|
});
|