Skip to content

Commit ea88d07

Browse files
authored
Merge pull request #201 from nursoltan-s/issue-4557
fix my challenges page
2 parents 4238394 + ea649b2 commit ea88d07

File tree

4 files changed

+125
-0
lines changed

4 files changed

+125
-0
lines changed

__tests__/__snapshots__/index.js.snap

+2
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,8 @@ Object {
111111
"getSubtrackChallengesInit": [Function],
112112
"getUserMarathonDone": [Function],
113113
"getUserMarathonInit": [Function],
114+
"getUserResourcesDone": [Function],
115+
"getUserResourcesInit": [Function],
114116
"getUserSrmDone": [Function],
115117
"getUserSrmInit": [Function],
116118
},

src/actions/members.js

+26
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,30 @@ async function getUserMarathonDone(
357357
}));
358358
}
359359

360+
/**
361+
* @static
362+
* @desc Create an action that fetch user registered challenge's resources.
363+
* @param {String} memberId Member id.
364+
* @param {String} uuid Operation UUID.
365+
* @return {Action}
366+
*/
367+
async function getUserResourcesInit(memberId, uuid) {
368+
return { memberId, uuid };
369+
}
370+
371+
/**
372+
* @static
373+
* @desc Create an action that fetch user registered challenge's resources.
374+
* @param {String} handle Member handle.
375+
* @param {String} uuid Operation UUID.
376+
* @return {Action}
377+
*/
378+
async function getUserResourcesDone(memberId, tokenV3, uuid) {
379+
const resources = await getService(tokenV3).getUserResources(memberId);
380+
381+
return { resources, uuid };
382+
}
383+
360384
export default createActions({
361385
MEMBERS: {
362386
DROP: drop,
@@ -380,5 +404,7 @@ export default createActions({
380404
GET_USER_SRM_DONE: getUserSRMDone,
381405
GET_USER_MARATHON_INIT: getUserMarathonInit,
382406
GET_USER_MARATHON_DONE: getUserMarathonDone,
407+
GET_USER_RESOURCES_INIT: getUserResourcesInit,
408+
GET_USER_RESOURCES_DONE: getUserResourcesDone,
383409
},
384410
});

src/reducers/members.js

+39
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,43 @@ function onGetUserMarathonDone(state, { error, payload }) {
426426
};
427427
}
428428

429+
/**
430+
* Inits the loading of user challenge resources.
431+
* @param {Object} state
432+
* @param {Object} action
433+
* @return {Object} New state.
434+
*/
435+
function onGetUserResourcesInit(state, { payload }) {
436+
const { uuid } = payload;
437+
return {
438+
...state,
439+
userResources: { resources: [], loadingUserResources: uuid },
440+
};
441+
}
442+
443+
/**
444+
* Finalizes the loading of user challenge resources.
445+
* @param {Object} state
446+
* @param {Object} action
447+
* @return {Object} New state.
448+
*/
449+
function onGetUserResourcesDone(state, { error, payload }) {
450+
if (error) {
451+
logger.error('Failed to get user resources', payload);
452+
fireErrorMessage('Failed to get user resources', '');
453+
return state;
454+
}
455+
456+
const { uuid, resources } = payload;
457+
458+
if (uuid !== state.userResources.loadingUserResources) return state;
459+
460+
return {
461+
...state,
462+
userResources: { resources, loadingUserResources: '' },
463+
};
464+
}
465+
429466
/**
430467
* Creates a new Members reducer with the specified initial state.
431468
* @param {Object} initialState Optional. Initial state.
@@ -455,6 +492,8 @@ function create(initialState = {}) {
455492
[a.getUserSrmDone]: onGetUserSRMDone,
456493
[a.getUserMarathonInit]: onGetUserMarathonInit,
457494
[a.getUserMarathonDone]: onGetUserMarathonDone,
495+
[a.getUserResourcesInit]: onGetUserResourcesInit,
496+
[a.getUserResourcesDone]: onGetUserResourcesDone,
458497
}, initialState);
459498
}
460499

src/services/members.js

+58
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class MembersService {
2121
constructor(tokenV3) {
2222
this.private = {
2323
api: getApi('V3', tokenV3),
24+
apiV5: getApi('V5', tokenV3),
2425
tokenV3,
2526
};
2627
}
@@ -312,6 +313,63 @@ class MembersService {
312313
const res = await this.private.api.get(url);
313314
return getApiResponsePayload(res);
314315
}
316+
317+
/**
318+
* Fetch resources roles
319+
* @param {Array} memberId the member id
320+
*/
321+
async getResourceRoles() {
322+
const res = await this.private.apiV5.get('/resource-roles');
323+
const roles = await res.json();
324+
return roles;
325+
}
326+
327+
/**
328+
* Fetch user challenge resources
329+
* @param {Array} challengeId the challenge id
330+
*/
331+
async getChallengeResources(challengeId) {
332+
const url = `/resources?challengeId=${challengeId}`;
333+
let res = null;
334+
335+
try {
336+
res = await this.private.apiV5.get(url);
337+
} catch (error) {
338+
// logger.error('Failed to load challenge resource', error);
339+
}
340+
341+
return res.json();
342+
}
343+
344+
/**
345+
* Fetch user registered challenge's resources
346+
* @param {Array} memberId the member id
347+
*/
348+
async getUserResources(memberId) {
349+
const url = `/resources/${memberId}/challenges`;
350+
const res = await this.private.apiV5.get(url);
351+
const challenges = await res.json();
352+
const roles = await this.getResourceRoles();
353+
const calls = [];
354+
355+
challenges.forEach(async (ch) => {
356+
calls.push(this.getChallengeResources(ch));
357+
});
358+
359+
return Promise.all(calls).then((resources) => {
360+
const results = [];
361+
resources.forEach((resource) => {
362+
const userResource = _.find(resource, { memberId });
363+
if (userResource) {
364+
const challengeRole = _.find(roles, { id: userResource.roleId });
365+
const { name } = challengeRole || '';
366+
results.push({ id: userResource.challengeId, name });
367+
}
368+
});
369+
370+
return results;
371+
});
372+
}
315373
}
316374

317375
let lastInstance = null;

0 commit comments

Comments
 (0)