From 12705932e3b591a2d4afd1ff1f14fd63399b473a Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Tue, 12 Jan 2016 18:00:03 +0100 Subject: [PATCH] abstract common logic in members controller --- website/src/controllers/api-v3/members.js | 107 +++++++++------------- 1 file changed, 45 insertions(+), 62 deletions(-) diff --git a/website/src/controllers/api-v3/members.js b/website/src/controllers/api-v3/members.js index 7bc719d7d4..3d36a63cda 100644 --- a/website/src/controllers/api-v3/members.js +++ b/website/src/controllers/api-v3/members.js @@ -12,7 +12,6 @@ import { let api = {}; -// TODO allow only to select nameFields instead of all publicFields? /** * @api {get} /members/:memberId Get a member profile * @apiVersion 3.0.0 @@ -46,24 +45,14 @@ api.getMember = { }, }; -// TODO allow to get more members' fields (the same as in api.getMember) for parties? -/** - * @api {get} /groups/:groupId/members Get members for a groups 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. - * @apiVersion 3.0.0 - * @apiName GetMembersForGroup - * @apiGroup Member - * - * @apiParam {UUID} groupId The group 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 {boolean} includeAllPublicFields Query parameter avalaible only when fetching a party. If === `true` then all public fields for members will be returned (liek when making a request for a single member) - * - * @apiSuccess {array} members An array of members, sorted by _id - */ -api.getMembersForGroup = { - method: 'GET', - url: '/groups/:groupId/members', - middlewares: [authWithHeaders(), cron], - async handler (req, res) { +// Return a request handler for getMembersForGroup / getInvitesForGroup +// type is `invites` or `members` +function handleGetMembersInvitesForGroup (type) { + if (type !== 'members' && type !== 'invites') { + throw new Error('Type must be "invites" or "members"'); + } + + return async function getMembersOrInvitesForGroup (req, res) { req.checkParams('groupId', res.t('groupIdRequired')).notEmpty(); req.checkQuery('lastId').optional().notEmpty().isUUID(); @@ -80,30 +69,56 @@ api.getMembersForGroup = { let query = {}; let fields = nameFields; - if (group.type === 'guild') { - query.guilds = group._id; - } else { - query['party._id'] = group._id; // group._id and not groupId because groupId could be === 'party' + if (type === 'members') { + if (group.type === 'guild') { + query.guilds = group._id; + } else { + query['party._id'] = group._id; // group._id and not groupId because groupId could be === 'party' - if (req.query.includeAllPublicFields === 'true') { - fields = memberFields; + if (req.query.includeAllPublicFields === 'true') { + fields = memberFields; + } + } + } else { + if (group.type === 'guild') { // eslint-disable-line no-lonely-if + query['invitations.guilds.id'] = group._id; + } else { + query['invitations.party.id'] = group._id; // group._id and not groupId because groupId could be === 'party' } } if (lastId) query._id = {$gt: lastId}; - let members = await User + let users = await User .find(query) .sortBy({_id: 1}) .limit(30) .select(fields) .exec(); - res.respond(200, members); - }, + res.respond(200, users); + }; +} + +/** + * @api {get} /groups/:groupId/members Get members for a groups 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. + * @apiVersion 3.0.0 + * @apiName GetMembersForGroup + * @apiGroup Member + * + * @apiParam {UUID} groupId The group 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 {boolean} includeAllPublicFields Query parameter avalaible only when fetching a party. If === `true` then all public fields for members will be returned (liek when making a request for a single member) + * + * @apiSuccess {array} members An array of members, sorted by _id + */ +api.getMembersForGroup = { + method: 'GET', + url: '/groups/:groupId/members', + middlewares: [authWithHeaders(), cron], + handler: handleGetMembersInvitesForGroup('members'), }; -// TODO very similar to getInvitesForGroup might be worth abstracting some logic /** * @api {get} /groups/:groupId/invites Get invites for a groups with a limit of 30 member per request. To get all invites run requests against this routes (updating the lastId query parameter) until you get less than 30 results. * @apiVersion 3.0.0 @@ -119,39 +134,7 @@ api.getInvitesForGroup = { method: 'GET', url: '/groups/:groupId/invites', middlewares: [authWithHeaders(), cron], - async handler (req, res) { - req.checkParams('groupId', res.t('groupIdRequired')).notEmpty(); - req.checkQuery('lastId').optional().notEmpty().isUUID(); - - let validationErrors = req.validationErrors(); - if (validationErrors) throw validationErrors; - - let groupId = req.params.groupId; - let lastId = req.query.lastId; - let user = res.locals.user; - - let group = await Group.getGroup(user, groupId, '_id type'); - if (!group) throw new NotFound(res.t('groupNotFound')); - - let query = {}; - - if (group.type === 'guild') { - query['invitations.guilds.id'] = group._id; - } else { - query['invitations.party.id'] = group._id; // group._id and not groupId because groupId could be === 'party' - } - - if (lastId) query._id = {$gt: lastId}; - - let invites = await User - .find(query) - .sortBy({_id: 1}) - .limit(30) - .select(nameFields) - .exec(); - - res.respond(200, invites); - }, + handler: handleGetMembersInvitesForGroup('invites'), }; export default api;