diff --git a/src/actions/members.js b/src/actions/members.js index 4cc23a1c..817ad5be 100644 --- a/src/actions/members.js +++ b/src/actions/members.js @@ -143,6 +143,7 @@ async function getActiveChallengesInit(handle, uuid) { * @param {String} tokenV3 * @returns {Object} Payload */ +/* eslint-disable no-unused-vars */ async function getActiveChallengesDone(handle, uuid, tokenV3) { const filter = { status: 'Active' }; const service = getChallengesService(tokenV3); @@ -168,6 +169,38 @@ async function getActiveChallengesDone(handle, uuid, tokenV3) { return { handle, challenges, uuid }; } +/* eslint-enable no-unused-vars */ + +/** + * @static + * @desc Payload creator for the action that loads the member active challenges from v4 api. + * @param {String} handle + * @param {String} uuid + * @param {String} tokenV3 + * @returns {Object} Payload + */ +async function getActiveChallengesV4Done(handle, uuid, tokenV3) { + const filter = { status: 'Active' }; + const service = getChallengesService(tokenV3); + + function getAll(getter, page = 0, prev = null) { + const PAGE_SIZE = 50; + return getter({ + limit: PAGE_SIZE, + offset: page * PAGE_SIZE, + }).then(({ challenges: chunk }) => { + if (!chunk.length) return prev || []; + return getAll(getter, 1 + page, prev ? prev.concat(chunk) : chunk); + }); + } + const calls = [ + getAll(params => service.getUserChallengesV4(handle, filter, params)), + ]; + + const [challenges] = await Promise.all(calls); + + return { handle, challenges, uuid }; +} /** * @static @@ -243,6 +276,7 @@ async function getSubtrackChallengesInit(handle, uuid) { * @param {Boolean} whether to refresh. * @return {Action} */ +/* eslint-disable no-unused-vars */ async function getSubtrackChallengesDone( uuid, handle, tokenV3, track, subTrack, pageNum, pageSize, refresh, userId, @@ -268,6 +302,46 @@ async function getSubtrackChallengesDone( handle, })); } +/* eslint-enable no-unused-vars */ + +/** + * @static + * @desc Create an action that loads the member subtrack challenges from v4 api. + * @param {String} uuid Operation UUID. + * @param {String} handle Member handle. + * @param {String} tokenV3 v3 auth token. + * @param {String} track Main track name. + * @param {String} subTrack Subtrack name. + * @param {Number} start page. + * @param {Number} page size. + * @param {Boolean} whether to refresh. + * @return {Action} + */ +async function getSubtrackChallengesV4Done( + uuid, handle, tokenV3, track, subTrack, pageNum, pageSize, + refresh, +) { + const filter = { + status: 'Completed', + hasUserSubmittedForReview: 'true', + track, + subTrack, + }; + + const params = {}; + params.orderBy = 'submissionEndDate desc'; + params.limit = pageSize; + params.offset = (pageNum - 1) * pageSize; // pageNum - 1 to match with v4 offset + + const service = getChallengesService(tokenV3); + return service.getUserChallengesV4(handle, filter, params) + .then(res => ({ + uuid, + challenges: res.challenges, + refresh, + handle, + })); +} /** * @static @@ -399,9 +473,9 @@ export default createActions({ GET_STATS_DISTRIBUTION_INIT: getStatsDistributionInit, GET_STATS_DISTRIBUTION_DONE: getStatsDistributionDone, GET_ACTIVE_CHALLENGES_INIT: getActiveChallengesInit, - GET_ACTIVE_CHALLENGES_DONE: getActiveChallengesDone, + GET_ACTIVE_CHALLENGES_DONE: getActiveChallengesV4Done, GET_SUBTRACK_CHALLENGES_INIT: getSubtrackChallengesInit, - GET_SUBTRACK_CHALLENGES_DONE: getSubtrackChallengesDone, + GET_SUBTRACK_CHALLENGES_DONE: getSubtrackChallengesV4Done, GET_USER_SRM_INIT: getUserSRMInit, GET_USER_SRM_DONE: getUserSRMDone, GET_USER_MARATHON_INIT: getUserMarathonInit, diff --git a/src/services/challenges.js b/src/services/challenges.js index e232274b..1aa7b98e 100644 --- a/src/services/challenges.js +++ b/src/services/challenges.js @@ -572,6 +572,25 @@ class ChallengesService { }; } + /** + * Gets challenges of the specified user from v4 api. + * @param {String} username User name whose challenges we want to fetch. + * @return {Promise} Resolves to the api response. + */ + async getUserChallengesV4(username, filters, params) { + const endpoint = `/members/${username.toLowerCase()}/challenges/`; + const query = { + filter: qs.stringify(filters, { encode: false }), + ...params, + }; + const url = `${endpoint}?${qs.stringify(query)}`; + const res = await this.private.api.get(url).then(checkError); + return { + challenges: res.content || [], + totalCount: res.metadata.totalCount, + }; + } + /** * Gets user resources. * @param {String} userId User id whose challenges we want to fetch.