feat(members): add ability to return all members

This commit is contained in:
Matteo Pagliazzi
2016-05-25 12:36:52 +02:00
parent a771c43989
commit adce786ae2
3 changed files with 72 additions and 5 deletions

View File

@@ -69,7 +69,25 @@ describe('GET /challenges/:challengeId/members', () => {
expect(res[0].profile).to.have.all.keys(['name']); expect(res[0].profile).to.have.all.keys(['name']);
}); });
it('returns only first 30 members', async () => { it('returns only first 30 members if req.query.includeAllMembers is not true', async () => {
let group = await generateGroup(user, {type: 'party', name: generateUUID()});
let challenge = await generateChallenge(user, group);
let usersToGenerate = [];
for (let i = 0; i < 31; i++) {
usersToGenerate.push(generateUser({challenges: [challenge._id]}));
}
await Promise.all(usersToGenerate);
let res = await user.get(`/challenges/${challenge._id}/members?includeAllMembers=not-true`);
expect(res.length).to.equal(30);
res.forEach(member => {
expect(member).to.have.all.keys(['_id', 'id', 'profile']);
expect(member.profile).to.have.all.keys(['name']);
});
});
it('returns only first 30 members if req.query.includeAllMembers is not defined', async () => {
let group = await generateGroup(user, {type: 'party', name: generateUUID()}); let group = await generateGroup(user, {type: 'party', name: generateUUID()});
let challenge = await generateChallenge(user, group); let challenge = await generateChallenge(user, group);
@@ -87,6 +105,24 @@ describe('GET /challenges/:challengeId/members', () => {
}); });
}); });
it('returns all members if req.query.includeAllMembers is true', async () => {
let group = await generateGroup(user, {type: 'party', name: generateUUID()});
let challenge = await generateChallenge(user, group);
let usersToGenerate = [];
for (let i = 0; i < 31; i++) {
usersToGenerate.push(generateUser({challenges: [challenge._id]}));
}
await Promise.all(usersToGenerate);
let res = await user.get(`/challenges/${challenge._id}/members?includeAllMembers=true`);
expect(res.length).to.equal(32);
res.forEach(member => {
expect(member).to.have.all.keys(['_id', 'id', 'profile']);
expect(member.profile).to.have.all.keys(['name']);
});
});
it('supports using req.query.lastId to get more members', async () => { it('supports using req.query.lastId to get more members', async () => {
let group = await generateGroup(user, {type: 'party', name: generateUUID()}); let group = await generateGroup(user, {type: 'party', name: generateUUID()});
let challenge = await generateChallenge(user, group); let challenge = await generateChallenge(user, group);

View File

@@ -74,6 +74,23 @@ describe('GET /groups/:groupId/members', () => {
}); });
}); });
it('returns only first 30 members even when ?includeAllMembers=true', async () => {
let group = await generateGroup(user, {type: 'party', name: generateUUID()});
let usersToGenerate = [];
for (let i = 0; i < 31; i++) {
usersToGenerate.push(generateUser({party: {_id: group._id}}));
}
await Promise.all(usersToGenerate);
let res = await user.get('/groups/party/members?includeAllMembers=true');
expect(res.length).to.equal(30);
res.forEach(member => {
expect(member).to.have.all.keys(['_id', 'id', 'profile']);
expect(member.profile).to.have.all.keys(['name']);
});
});
it('supports using req.query.lastId to get more members', async () => { it('supports using req.query.lastId to get more members', async () => {
let leader = await generateUser({balance: 4}); let leader = await generateUser({balance: 4});
let group = await generateGroup(leader, {type: 'guild', privacy: 'public', name: generateUUID()}); let group = await generateGroup(leader, {type: 'guild', privacy: 'public', name: generateUUID()});

View File

@@ -85,7 +85,13 @@ function _getMembersForItem (type) {
// optionalMembership is set to true because even if you're not member of the group you may be able to access the challenge // optionalMembership is set to true because even if you're not member of the group you may be able to access the challenge
// for example if you've been booted from it, are the leader or a site admin // for example if you've been booted from it, are the leader or a site admin
group = await Group.getGroup({user, groupId: challenge.group, fields: '_id type privacy', optionalMembership: true}); group = await Group.getGroup({
user,
groupId: challenge.group,
fields: '_id type privacy',
optionalMembership: true,
});
if (!group || !challenge.canView(user, group)) throw new NotFound(res.t('challengeNotFound')); if (!group || !challenge.canView(user, group)) throw new NotFound(res.t('challengeNotFound'));
} else { } else {
group = await Group.getGroup({user, groupId, fields: '_id type'}); group = await Group.getGroup({user, groupId, fields: '_id type'});
@@ -117,10 +123,17 @@ function _getMembersForItem (type) {
if (lastId) query._id = {$gt: lastId}; if (lastId) query._id = {$gt: lastId};
let limit = 30;
// Allow for all challenges members to be returned
if (type === 'challenge-members' && req.query.includeAllMembers === 'true') {
limit = 0; // no limit
}
let members = await User let members = await User
.find(query) .find(query)
.sort({_id: 1}) .sort({_id: 1})
.limit(30) .limit(limit)
.select(fields) .select(fields)
.exec(); .exec();
@@ -170,14 +183,15 @@ api.getInvitesForGroup = {
/** /**
* @api {get} /api/v3/challenges/:challengeId/members Get members for a challenge * @api {get} /api/v3/challenges/:challengeId/members Get members for a challenge
* @apiDescription With a limit of 30 member per request. To get all members run requests against this routes (updating the lastId query parameter) until you get less than 30 results. * @apiDescription With a limit of 30 member per request. To get all members run requests against this routes (updating the lastId query parameter) until you get less than 30 results. You can also use ?includeAllMembers=true but it's slow and discouraged.
* @apiVersion 3.0.0 * @apiVersion 3.0.0
* @apiName GetMembersForChallenge * @apiName GetMembersForChallenge
* @apiGroup Member * @apiGroup Member
* *
* @apiParam {UUID} challengeId The challenge id * @apiParam {UUID} challengeId The challenge id
* @apiParam {UUID} lastId Query parameter to specify the last member returned in a previous request to this route and get the next batch of results * @apiParam {UUID} lastId Query parameter to specify the last member returned in a previous request to this route and get the next batch of results
* * @apiParam {string} includeAllMembers Query parameter - If 'true' all challenge members are returned
* @apiSuccess {array} data An array of members, sorted by _id * @apiSuccess {array} data An array of members, sorted by _id
*/ */
api.getMembersForChallenge = { api.getMembersForChallenge = {