Skip to content

Commit b66d987

Browse files
Merge pull request #283 from topcoder-platform/develop
Release 2020/11/10 - Stats History API V4
2 parents bd0b4d3 + 7512db6 commit b66d987

File tree

3 files changed

+96
-3
lines changed

3 files changed

+96
-3
lines changed

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
"lint:js": "./node_modules/.bin/eslint --ext .js,.jsx .",
3232
"test": "npm run lint && npm run jest"
3333
},
34-
"version": "1.1.1",
34+
"version": "1.1.2",
3535
"dependencies": {
3636
"auth0-js": "^6.8.4",
3737
"config": "^3.2.0",

src/actions/members.js

+76-2
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ async function getActiveChallengesInit(handle, uuid) {
143143
* @param {String} tokenV3
144144
* @returns {Object} Payload
145145
*/
146+
/* eslint-disable no-unused-vars */
146147
async function getActiveChallengesDone(handle, uuid, tokenV3) {
147148
const filter = { status: 'Active' };
148149
const service = getChallengesService(tokenV3);
@@ -168,6 +169,38 @@ async function getActiveChallengesDone(handle, uuid, tokenV3) {
168169

169170
return { handle, challenges, uuid };
170171
}
172+
/* eslint-enable no-unused-vars */
173+
174+
/**
175+
* @static
176+
* @desc Payload creator for the action that loads the member active challenges from v4 api.
177+
* @param {String} handle
178+
* @param {String} uuid
179+
* @param {String} tokenV3
180+
* @returns {Object} Payload
181+
*/
182+
async function getActiveChallengesV4Done(handle, uuid, tokenV3) {
183+
const filter = { status: 'Active' };
184+
const service = getChallengesService(tokenV3);
185+
186+
function getAll(getter, page = 0, prev = null) {
187+
const PAGE_SIZE = 50;
188+
return getter({
189+
limit: PAGE_SIZE,
190+
offset: page * PAGE_SIZE,
191+
}).then(({ challenges: chunk }) => {
192+
if (!chunk.length) return prev || [];
193+
return getAll(getter, 1 + page, prev ? prev.concat(chunk) : chunk);
194+
});
195+
}
196+
const calls = [
197+
getAll(params => service.getUserChallengesV4(handle, filter, params)),
198+
];
199+
200+
const [challenges] = await Promise.all(calls);
201+
202+
return { handle, challenges, uuid };
203+
}
171204

172205
/**
173206
* @static
@@ -243,6 +276,7 @@ async function getSubtrackChallengesInit(handle, uuid) {
243276
* @param {Boolean} whether to refresh.
244277
* @return {Action}
245278
*/
279+
/* eslint-disable no-unused-vars */
246280
async function getSubtrackChallengesDone(
247281
uuid, handle, tokenV3, track, subTrack, pageNum, pageSize,
248282
refresh, userId,
@@ -268,6 +302,46 @@ async function getSubtrackChallengesDone(
268302
handle,
269303
}));
270304
}
305+
/* eslint-enable no-unused-vars */
306+
307+
/**
308+
* @static
309+
* @desc Create an action that loads the member subtrack challenges from v4 api.
310+
* @param {String} uuid Operation UUID.
311+
* @param {String} handle Member handle.
312+
* @param {String} tokenV3 v3 auth token.
313+
* @param {String} track Main track name.
314+
* @param {String} subTrack Subtrack name.
315+
* @param {Number} start page.
316+
* @param {Number} page size.
317+
* @param {Boolean} whether to refresh.
318+
* @return {Action}
319+
*/
320+
async function getSubtrackChallengesV4Done(
321+
uuid, handle, tokenV3, track, subTrack, pageNum, pageSize,
322+
refresh,
323+
) {
324+
const filter = {
325+
status: 'Completed',
326+
hasUserSubmittedForReview: 'true',
327+
track,
328+
subTrack,
329+
};
330+
331+
const params = {};
332+
params.orderBy = 'submissionEndDate desc';
333+
params.limit = pageSize;
334+
params.offset = (pageNum - 1) * pageSize; // pageNum - 1 to match with v4 offset
335+
336+
const service = getChallengesService(tokenV3);
337+
return service.getUserChallengesV4(handle, filter, params)
338+
.then(res => ({
339+
uuid,
340+
challenges: res.challenges,
341+
refresh,
342+
handle,
343+
}));
344+
}
271345

272346
/**
273347
* @static
@@ -399,9 +473,9 @@ export default createActions({
399473
GET_STATS_DISTRIBUTION_INIT: getStatsDistributionInit,
400474
GET_STATS_DISTRIBUTION_DONE: getStatsDistributionDone,
401475
GET_ACTIVE_CHALLENGES_INIT: getActiveChallengesInit,
402-
GET_ACTIVE_CHALLENGES_DONE: getActiveChallengesDone,
476+
GET_ACTIVE_CHALLENGES_DONE: getActiveChallengesV4Done,
403477
GET_SUBTRACK_CHALLENGES_INIT: getSubtrackChallengesInit,
404-
GET_SUBTRACK_CHALLENGES_DONE: getSubtrackChallengesDone,
478+
GET_SUBTRACK_CHALLENGES_DONE: getSubtrackChallengesV4Done,
405479
GET_USER_SRM_INIT: getUserSRMInit,
406480
GET_USER_SRM_DONE: getUserSRMDone,
407481
GET_USER_MARATHON_INIT: getUserMarathonInit,

src/services/challenges.js

+19
Original file line numberDiff line numberDiff line change
@@ -572,6 +572,25 @@ class ChallengesService {
572572
};
573573
}
574574

575+
/**
576+
* Gets challenges of the specified user from v4 api.
577+
* @param {String} username User name whose challenges we want to fetch.
578+
* @return {Promise} Resolves to the api response.
579+
*/
580+
async getUserChallengesV4(username, filters, params) {
581+
const endpoint = `/members/${username.toLowerCase()}/challenges/`;
582+
const query = {
583+
filter: qs.stringify(filters, { encode: false }),
584+
...params,
585+
};
586+
const url = `${endpoint}?${qs.stringify(query)}`;
587+
const res = await this.private.api.get(url).then(checkError);
588+
return {
589+
challenges: res.content || [],
590+
totalCount: res.metadata.totalCount,
591+
};
592+
}
593+
575594
/**
576595
* Gets user resources.
577596
* @param {String} userId User id whose challenges we want to fetch.

0 commit comments

Comments
 (0)