diff --git a/__tests__/__snapshots__/index.js.snap b/__tests__/__snapshots__/index.js.snap index 180895cd..47276ed3 100644 --- a/__tests__/__snapshots__/index.js.snap +++ b/__tests__/__snapshots__/index.js.snap @@ -69,6 +69,7 @@ Object { "dropAll": [Function], "getAchievementsDone": [Function], "getAchievementsInit": [Function], + "getAchievementsV3Done": [Function], "getActiveChallengesDone": [Function], "getActiveChallengesInit": [Function], "getFinancesDone": [Function], @@ -98,6 +99,7 @@ Object { "deleteWebLinkInit": [Function], "getAchievementsDone": [Function], "getAchievementsInit": [Function], + "getAchievementsV3Done": [Function], "getCredentialDone": [Function], "getCredentialInit": [Function], "getEmailPreferencesDone": [Function], @@ -206,14 +208,17 @@ Object { "countReset": [Function], "debug": [Function], "dir": [Function], + "dirxml": [Function], "error": [Function], "group": [Function], "groupCollapsed": [Function], "groupEnd": [Function], "info": [Function], "log": [Function], + "table": [Function], "time": [Function], "timeEnd": [Function], + "timeLog": [Function], "trace": [Function], "warn": [Function], }, diff --git a/__tests__/actions/__snapshots__/profile.js.snap b/__tests__/actions/__snapshots__/profile.js.snap index 3ae1356e..b784f238 100644 --- a/__tests__/actions/__snapshots__/profile.js.snap +++ b/__tests__/actions/__snapshots__/profile.js.snap @@ -14,6 +14,7 @@ Object { "deleteWebLinkInit": [Function], "getAchievementsDone": [Function], "getAchievementsInit": [Function], + "getAchievementsV3Done": [Function], "getCredentialDone": [Function], "getCredentialInit": [Function], "getEmailPreferencesDone": [Function], diff --git a/docs/actions.members.md b/docs/actions.members.md index 7a04f558..0a0e18e8 100644 --- a/docs/actions.members.md +++ b/docs/actions.members.md @@ -9,6 +9,7 @@ Actions related to members data. * [.dropAll()](#module_actions.members.dropAll) ⇒ Action * [.getAchievementsInit(handle, uuid)](#module_actions.members.getAchievementsInit) ⇒ Action * [.getAchievementsDone(handle, uuid)](#module_actions.members.getAchievementsDone) ⇒ Action + * [.getAchievementsV3Done(handle, uuid)](#module_actions.members.getAchievementsV3Done) ⇒ Action * [.getFinancesInit(handle, uuid)](#module_actions.members.getFinancesInit) ⇒ Action * [.getFinancesDone(handle, uuid, tokenV3)](#module_actions.members.getFinancesDone) ⇒ Action * [.getStatsInit(handle, uuid)](#module_actions.members.getStatsInit) ⇒ Action @@ -55,7 +56,19 @@ Creates an action that signals beginning of member achievements ### actions.members.getAchievementsDone(handle, uuid) ⇒ Action -Creates an action that loads member achievements. +Creates an action that loads member achievements from v2 API. + +**Kind**: static method of [actions.members](#module_actions.members) + +| Param | Type | Description | +| --- | --- | --- | +| handle | String | Member handle. | +| uuid | String | Loading operation | + + + +### actions.members.getAchievementsV3Done(handle, uuid) ⇒ Action +Creates an action that loads member achievements from v3 API. **Kind**: static method of [actions.members](#module_actions.members) diff --git a/docs/actions.profile.md b/docs/actions.profile.md index 528d0612..9129918d 100644 --- a/docs/actions.profile.md +++ b/docs/actions.profile.md @@ -14,6 +14,7 @@ Actions for interactions with profile details API. * [.clearProfile()](#module_actions.profile.clearProfile) ⇒ Action * [.getAchievementsInit()](#module_actions.profile.getAchievementsInit) ⇒ Action * [.getAchievementsDone(handle)](#module_actions.profile.getAchievementsDone) ⇒ Action + * [.getAchievementsV3Done(handle)](#module_actions.profile.getAchievementsV3Done) ⇒ Action * [.getExternalAccountsInit()](#module_actions.profile.getExternalAccountsInit) ⇒ Action * [.getExternalAccountsDone(handle)](#module_actions.profile.getExternalAccountsDone) ⇒ Action * [.getExternalLinksInit()](#module_actions.profile.getExternalLinksInit) ⇒ Action @@ -94,7 +95,7 @@ Creates an action that signals beginning of user achievements loading. ### actions.profile.getAchievementsDone(handle) ⇒ Action -Creates an action that loads user achievements. +Creates an action that loads user achievements from v2 API. **Kind**: static method of [actions.profile](#module_actions.profile) **Todo** @@ -106,6 +107,13 @@ Creates an action that loads user achievements. | --- | --- | --- | | handle | String | User handle. | + + +### actions.profile.getAchievementsV3Done(handle) ⇒ Action +Creates an action that loads user achievements from V3 API. + +**Kind**: static method of [actions.profile](#module_actions.profile) + ### actions.profile.getExternalAccountsInit() ⇒ Action diff --git a/docs/reducers.members.md b/docs/reducers.members.md index 4d75fcfc..56811eb3 100644 --- a/docs/reducers.members.md +++ b/docs/reducers.members.md @@ -17,6 +17,7 @@ Reducer for the Redux store segment that holds members data. * [~onDropAll()](#module_reducers.members..onDropAll) ⇒ Object * [~onGetAchievementsInit(state)](#module_reducers.members..onGetAchievementsInit) ⇒ Object * [~onGetAchievementsDone(state, error)](#module_reducers.members..onGetAchievementsDone) ⇒ Object + * [~onGetAchievementsV3Done(state, error)](#module_reducers.members..onGetAchievementsV3Done) ⇒ Object * [~onGetFinancesInit(state)](#module_reducers.members..onGetFinancesInit) ⇒ Object * [~onGetFinancesDone(state, action)](#module_reducers.members..onGetFinancesDone) ⇒ Object * [~onGetStatsInit(state, action)](#module_reducers.members..onGetStatsInit) ⇒ Object @@ -81,7 +82,23 @@ Inits the loading of member achievements. ### reducers.members~onGetAchievementsDone(state, error) ⇒ Object -Finalizes the loading of member achievements. +Finalizes the loading of member achievements from v2 API. + +**Kind**: inner method of [reducers.members](#module_reducers.members) +**Returns**: Object - New state. + +| Param | Type | +| --- | --- | +| state | Object | +| error | Object | +| payload.data | Array | +| payload.handle | String | +| payload.uuid | String | + + + +### reducers.members~onGetAchievementsV3Done(state, error) ⇒ Object +Finalizes the loading of member achievements from v3 API. **Kind**: inner method of [reducers.members](#module_reducers.members) **Returns**: Object - New state. diff --git a/docs/reducers.profile.md b/docs/reducers.profile.md index 43d9ad78..21ae1d12 100644 --- a/docs/reducers.profile.md +++ b/docs/reducers.profile.md @@ -14,6 +14,7 @@ Actions for interactions with profile details API. * [.clearProfile()](#module_actions.profile.clearProfile) ⇒ Action * [.getAchievementsInit()](#module_actions.profile.getAchievementsInit) ⇒ Action * [.getAchievementsDone(handle)](#module_actions.profile.getAchievementsDone) ⇒ Action + * [.getAchievementsV3Done(handle)](#module_actions.profile.getAchievementsV3Done) ⇒ Action * [.getExternalAccountsInit()](#module_actions.profile.getExternalAccountsInit) ⇒ Action * [.getExternalAccountsDone(handle)](#module_actions.profile.getExternalAccountsDone) ⇒ Action * [.getExternalLinksInit()](#module_actions.profile.getExternalLinksInit) ⇒ Action @@ -94,7 +95,22 @@ Creates an action that signals beginning of user achievements loading. ### actions.profile.getAchievementsDone(handle) ⇒ Action -Creates an action that loads user achievements. +Creates an action that loads user achievements from v2 API. + +**Kind**: static method of [actions.profile](#module_actions.profile) +**Todo** + +- [ ] This duplicates similar action in [actions.members.md](actions.members.md)! + + +| Param | Type | Description | +| --- | --- | --- | +| handle | String | User handle. | + + + +### actions.profile.getAchievementsV3Done(handle) ⇒ Action +Creates an action that loads user achievements from v3 API. **Kind**: static method of [actions.profile](#module_actions.profile) **Todo** diff --git a/docs/services.user.md b/docs/services.user.md index de282529..fc039b68 100644 --- a/docs/services.user.md +++ b/docs/services.user.md @@ -14,6 +14,7 @@ The User service provides functionality related to Topcoder user * [new User(tokenV3, tokenV2)](#new_module_services.user..User_new) * [.getAchievements(username)](#module_services.user..User+getAchievements) ⇒ Object * [.getUserPublic(username)](#module_services.user..User+getUserPublic) ⇒ Object + * [.getUserPublicV3(username)](#module_services.user..User+getUserPublicV3) ⇒ Object * [.getUser(username)](#module_services.user..User+getUser) ⇒ Promise * [.getEmailPreferences(userId)](#module_services.user..User+getEmailPreferences) ⇒ Promise * [.saveEmailPreferences(user, preferences)](#module_services.user..User+saveEmailPreferences) ⇒ Promise @@ -54,6 +55,7 @@ Service class. * [new User(tokenV3, tokenV2)](#new_module_services.user..User_new) * [.getAchievements(username)](#module_services.user..User+getAchievements) ⇒ Object * [.getUserPublic(username)](#module_services.user..User+getUserPublic) ⇒ Object + * [.getUserPublicV3(username)](#module_services.user..User+getUserPublicV3) ⇒ Object * [.getUser(username)](#module_services.user..User+getUser) ⇒ Promise * [.getEmailPreferences(userId)](#module_services.user..User+getEmailPreferences) ⇒ Promise * [.saveEmailPreferences(user, preferences)](#module_services.user..User+saveEmailPreferences) ⇒ Promise @@ -88,7 +90,18 @@ Gets user achievements. Does not need auth. #### user.getUserPublic(username) ⇒ Object -Gets public user info. Does not need auth. +Gets public user info from v2 API. Does not need auth. + +**Kind**: instance method of [User](#module_services.user..User) + +| Param | Type | +| --- | --- | +| username | String | + + + +#### user.getUserPublicV3(username) ⇒ Object +Gets public user info from v3 API. Does not need auth. **Kind**: instance method of [User](#module_services.user..User) diff --git a/docs/tc.md b/docs/tc.md index e1e92105..8e060798 100644 --- a/docs/tc.md +++ b/docs/tc.md @@ -21,7 +21,7 @@ Review Opportunity types ### tc.getApiResponsePayload(res) ⇒ Promise -Gets payload from a standard success response from TC API; or throws +Gets payload from a standard success response from TC v2 API; or throws an error in case of a failure response. **Kind**: static method of [tc](#module_tc) diff --git a/package-lock.json b/package-lock.json index 05183fd7..abdb3ada 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6849,8 +6849,7 @@ "ansi-regex": { "version": "2.1.1", "resolved": false, - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "optional": true + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "aproba": { "version": "1.2.0", @@ -6871,14 +6870,12 @@ "balanced-match": { "version": "1.0.0", "resolved": false, - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "optional": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "brace-expansion": { "version": "1.1.11", "resolved": false, "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -6893,20 +6890,17 @@ "code-point-at": { "version": "1.1.0", "resolved": false, - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "optional": true + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "concat-map": { "version": "0.0.1", "resolved": false, - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "optional": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "console-control-strings": { "version": "1.1.0", "resolved": false, - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "optional": true + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, "core-util-is": { "version": "1.0.2", @@ -7023,8 +7017,7 @@ "inherits": { "version": "2.0.3", "resolved": false, - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "optional": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ini": { "version": "1.3.5", @@ -7036,7 +7029,6 @@ "version": "1.0.0", "resolved": false, "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -7051,7 +7043,6 @@ "version": "3.0.4", "resolved": false, "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -7059,14 +7050,12 @@ "minimist": { "version": "0.0.8", "resolved": false, - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "optional": true + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "minipass": { "version": "2.2.4", "resolved": false, "integrity": "sha512-hzXIWWet/BzWhYs2b+u7dRHlruXhwdgvlTMDKC6Cb1U7ps6Ac6yQlR39xsbjWJE377YTCtKwIXIpJ5oP+j5y8g==", - "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -7085,7 +7074,6 @@ "version": "0.5.1", "resolved": false, "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "optional": true, "requires": { "minimist": "0.0.8" } @@ -7166,8 +7154,7 @@ "number-is-nan": { "version": "1.0.1", "resolved": false, - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "optional": true + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, "object-assign": { "version": "4.1.1", @@ -7179,7 +7166,6 @@ "version": "1.4.0", "resolved": false, "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "optional": true, "requires": { "wrappy": "1" } @@ -7265,8 +7251,7 @@ "safe-buffer": { "version": "5.1.1", "resolved": false, - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "optional": true + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" }, "safer-buffer": { "version": "2.1.2", @@ -7302,7 +7287,6 @@ "version": "1.0.2", "resolved": false, "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -7322,7 +7306,6 @@ "version": "3.0.1", "resolved": false, "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -7366,14 +7349,12 @@ "wrappy": { "version": "1.0.2", "resolved": false, - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "optional": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "yallist": { "version": "3.0.2", "resolved": false, - "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=", - "optional": true + "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=" } } }, diff --git a/src/actions/members.js b/src/actions/members.js index 34425a6d..38b25a1c 100644 --- a/src/actions/members.js +++ b/src/actions/members.js @@ -57,6 +57,23 @@ async function getAchievementsDone(handle, uuid) { return { data, handle, uuid }; } +/** + * @static + * @desc Creates an action that loads member achievements from v3 API. + * @param {String} handle Member handle. + * @param {String} uuid Loading operation + * @return {Action} + */ +async function getAchievementsV3Done(handle, uuid) { + let data; + try { + data = await getUserService().getAchievementsV3(handle); + } catch (e) { + data = []; + } + return { data, handle, uuid }; +} + /** * @static * @desc Creates an action that signals beginning of loading the member's @@ -344,6 +361,7 @@ export default createActions({ DROP_ALL: dropAll, GET_ACHIEVEMENTS_INIT: getAchievementsInit, GET_ACHIEVEMENTS_DONE: getAchievementsDone, + GET_ACHIEVEMENTS_V3_DONE: getAchievementsV3Done, GET_FINANCES_INIT: getFinancesInit, GET_FINANCES_DONE: getFinancesDone, GET_STATS_INIT: getStatsInit, diff --git a/src/actions/profile.js b/src/actions/profile.js index 3996263c..21643c99 100644 --- a/src/actions/profile.js +++ b/src/actions/profile.js @@ -31,7 +31,7 @@ function getAchievementsInit() {} /** * @static - * @desc Creates an action that loads user achievements. + * @desc Creates an action that loads user achievements from API v2. * @todo This duplicates similar action in {@link actions.members.md}! * @param {String} handle User handle. * @return {Action} @@ -40,6 +40,17 @@ function getAchievementsDone(handle) { return getUserService().getUserPublic(handle); } +/** + * @static + * @desc Creates an action that loads user achievements from API v3. + * @todo This duplicates similar action in {@link actions.members.md}! + * @param {String} handle User handle. + * @return {Action} + */ +function getAchievementsV3Done(handle) { + return getUserService().getUserPublicV3(handle); +} + /** * @static * @todo To be documented. @@ -450,6 +461,7 @@ export default createActions({ CLEAR_PROFILE: _.noop, GET_ACHIEVEMENTS_INIT: getAchievementsInit, GET_ACHIEVEMENTS_DONE: getAchievementsDone, + GET_ACHIEVEMENTS_V3_DONE: getAchievementsV3Done, GET_EXTERNAL_ACCOUNTS_INIT: getExternalAccountsInit, GET_EXTERNAL_ACCOUNTS_DONE: getExternalAccountsDone, GET_EXTERNAL_LINKS_INIT: getExternalLinksInit, diff --git a/src/actions/settings.js b/src/actions/settings.js index f0f506f3..7c538300 100644 --- a/src/actions/settings.js +++ b/src/actions/settings.js @@ -10,11 +10,10 @@ import { getService } from '../services/user-traits'; /** * @static * @desc Creates an action that loads user's all traits. - * @param {String} uuid Operation UUID. + * @param {String} handle the topcoder member handle * @param {String} tokenV3 v3 auth token. * @return {Action} */ - async function getAllUserTraits(handle, tokenV3) { const data = await getService(tokenV3).getAllUserTraits(handle); return { data, handle }; diff --git a/src/reducers/members.js b/src/reducers/members.js index f4cce8cf..23d0a08b 100644 --- a/src/reducers/members.js +++ b/src/reducers/members.js @@ -438,6 +438,7 @@ function create(initialState = {}) { [a.dropAll]: onDropAll, [a.getAchievementsInit]: onGetAchievementsInit, [a.getAchievementsDone]: onGetAchievementsDone, + [a.getAchievementsV3Done]: onGetAchievementsDone, [a.getFinancesInit]: onGetFinancesInit, [a.getFinancesDone]: onGetFinancesDone, [a.getStatsInit]: onGetStatsInit, diff --git a/src/reducers/profile.js b/src/reducers/profile.js index 1d7711a7..875dc582 100644 --- a/src/reducers/profile.js +++ b/src/reducers/profile.js @@ -29,6 +29,26 @@ function onGetAchievementsDone(state, { payload, error }) { }); } +/** + * Handles PROFILE/GET_ACHIEVEMENTS_V3_DONE action. + * @param {Object} state + * @param {Object} action Payload will be JSON from api call + * @return {Object} New state + */ +function onGetAchievementsV3Done(state, { payload, error }) { + if (error) { + return { ...state, loadingError: true }; + } + + return ({ + ...state, + achievements: payload.achievements || [], + copilot: payload.copilot, + country: payload.country, + loadingError: false, + }); +} + /** * Handles PROFILE/GET_EXTERNAL_ACCOUNTS_DONE action. * @param {Object} state @@ -490,6 +510,7 @@ function create(initialState) { [a.loadProfile]: (state, action) => ({ ...state, profileForHandle: action.payload }), [a.getAchievementsInit]: state => state, [a.getAchievementsDone]: onGetAchievementsDone, + [a.getAchievementsV3Done]: onGetAchievementsV3Done, [a.getExternalAccountsInit]: state => state, [a.getExternalAccountsDone]: onGetExternalAccountsDone, [a.getExternalLinksInit]: state => state, diff --git a/src/services/user.js b/src/services/user.js index 7da7f53b..802f5af3 100644 --- a/src/services/user.js +++ b/src/services/user.js @@ -141,6 +141,16 @@ class User { return res.json() || null; } + /** + * Gets public user info from v3 API. Does not need auth. + * @param {String} username + * @return {Object} + */ + async getUserPublicV3(username) { + const res = await this.private.api.get(`/members/${username}`); + return getApiResponsePayload(res); + } + /** * Gets user data object for the specified username. * diff --git a/src/utils/tc.js b/src/utils/tc.js index 16d47b3d..77fce85a 100644 --- a/src/utils/tc.js +++ b/src/utils/tc.js @@ -38,7 +38,6 @@ export async function getApiResponsePayload(res) { return x.content; } - /** * Gets payload from a standard success response from TC LOOKER API; or throws * an error in case of a failure response.