diff --git a/src/actions/members.js b/src/actions/members.js index 817ad5be..b1bbcbac 100644 --- a/src/actions/members.js +++ b/src/actions/members.js @@ -114,7 +114,7 @@ async function getStatsInit(handle, uuid) { * @static * @desc Create an action that loads member statistics. * @param {String} handle Member handle. - * @param {String} groupIds Group ids. + * @param {Array<String>|String} groupIds Group ids. * @param {String} uuid Operation UUID. * @param {String} tokenV3 v3 auth token. * @return {Action} diff --git a/src/actions/profile.js b/src/actions/profile.js index 5bcb4da6..f04f31f6 100644 --- a/src/actions/profile.js +++ b/src/actions/profile.js @@ -132,7 +132,7 @@ function getStatsInit() {} * @static * @desc Creates an action that loads member's stats. * @param {String} handle Member handle. - * @param {String} groupIds Group ids. + * @param {Array<String>|String} groupIds Group ids. * @return {Action} */ function getStatsDone(handle, groupIds) { diff --git a/src/services/members.js b/src/services/members.js index d1cd5b09..14cf932c 100644 --- a/src/services/members.js +++ b/src/services/members.js @@ -83,17 +83,30 @@ class MembersService { /** * Gets member statistics. * @param {String} handle - * @param {String} groupIds + * @param {Array<String>|String} groupIds * @return {Promise} Resolves to the stats object. */ async getStats(handle, groupIds) { - let res; - if (groupIds) { - res = await this.private.api.get(`/members/${handle}/stats?groupIds=${groupIds}`); - } else { - res = await this.private.api.get(`/members/${handle}/stats`); + if (!groupIds) { + const res = await this.private.api.get(`/members/${handle}/stats`); + return getApiResponsePayload(res); } - return getApiResponsePayload(res); + + const groupIdsArray = _.isArray(groupIds) ? groupIds : _.split(groupIds, ','); + const groupIdChunks = _.chunk(groupIdsArray, 50); + + const getStatRequests = _.map(groupIdChunks, async (groupIdChunk) => { + const res = await this.private.api.get(`/members/${handle}/stats?groupIds=${_.join(groupIdChunk)}`); + return getApiResponsePayload(res, false); + }); + const results = await Promise.all(getStatRequests); + + return _.uniqBy( + _.flatten( + _.filter(results, _.isArray), + ), + item => item.groupId, + ); } /**