diff --git a/.circleci/config.yml b/.circleci/config.yml index 0e161844..e8eac28e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -28,7 +28,7 @@ jobs: - attach_workspace: at: . - run: echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc - - run: npm publish + - run: npm publish --tag test-release # dont change anything workflows: version: 2 diff --git a/__tests__/__snapshots__/index.js.snap b/__tests__/__snapshots__/index.js.snap index 337071e0..283e8d01 100644 --- a/__tests__/__snapshots__/index.js.snap +++ b/__tests__/__snapshots__/index.js.snap @@ -12,6 +12,8 @@ Object { "challenge": Object { "dropCheckpoints": [Function], "dropResults": [Function], + "fetchChallengeStatisticsDone": [Function], + "fetchChallengeStatisticsInit": [Function], "fetchCheckpointsDone": [Function], "fetchCheckpointsInit": [Function], "getActiveChallengesCountDone": [Function], diff --git a/__tests__/reducers/__snapshots__/challenge.js.snap b/__tests__/reducers/__snapshots__/challenge.js.snap index 009e5691..e744b7c2 100644 --- a/__tests__/reducers/__snapshots__/challenge.js.snap +++ b/__tests__/reducers/__snapshots__/challenge.js.snap @@ -15,6 +15,7 @@ Object { "registering": false, "results": null, "resultsLoadedForChallengeId": "", + "statisticsData": null, "submissionInformation": null, "unregistering": false, "updatingChallengeUuid": "", @@ -40,6 +41,7 @@ Object { "registering": false, "results": null, "resultsLoadedForChallengeId": "", + "statisticsData": null, "submissionInformation": null, "unregistering": false, "updatingChallengeUuid": "", @@ -65,6 +67,7 @@ Object { "registering": false, "results": null, "resultsLoadedForChallengeId": "", + "statisticsData": null, "submissionInformation": null, "unregistering": false, "updatingChallengeUuid": "", @@ -87,6 +90,7 @@ Object { "registering": false, "results": null, "resultsLoadedForChallengeId": "", + "statisticsData": null, "submissionInformation": null, "unregistering": false, "updatingChallengeUuid": "", @@ -118,6 +122,7 @@ Object { "registering": false, "results": null, "resultsLoadedForChallengeId": "", + "statisticsData": null, "submissionInformation": null, "unregistering": false, "updatingChallengeUuid": "", @@ -151,6 +156,7 @@ Object { "registering": false, "results": null, "resultsLoadedForChallengeId": "", + "statisticsData": null, "submissionInformation": null, "unregistering": false, "updatingChallengeUuid": "", @@ -182,6 +188,7 @@ Object { "registering": false, "results": null, "resultsLoadedForChallengeId": "", + "statisticsData": null, "submissionInformation": null, "unregistering": false, "updatingChallengeUuid": "", @@ -211,6 +218,7 @@ Object { "registering": false, "results": null, "resultsLoadedForChallengeId": "", + "statisticsData": null, "submissionInformation": null, "unregistering": false, "updatingChallengeUuid": "", @@ -243,6 +251,7 @@ Object { "registering": false, "results": null, "resultsLoadedForChallengeId": "", + "statisticsData": null, "submissionInformation": null, "unregistering": false, "updatingChallengeUuid": "", @@ -276,6 +285,7 @@ Object { "registering": false, "results": null, "resultsLoadedForChallengeId": "", + "statisticsData": null, "submissionInformation": null, "unregistering": false, "updatingChallengeUuid": "", @@ -309,6 +319,7 @@ Object { "registering": false, "results": null, "resultsLoadedForChallengeId": "", + "statisticsData": null, "submissionInformation": null, "unregistering": false, "updatingChallengeUuid": "", @@ -342,6 +353,7 @@ Object { "registering": false, "results": null, "resultsLoadedForChallengeId": "", + "statisticsData": null, "submissionInformation": null, "unregistering": false, "updatingChallengeUuid": "", @@ -375,6 +387,7 @@ Object { "registering": false, "results": null, "resultsLoadedForChallengeId": "", + "statisticsData": null, "submissionInformation": null, "unregistering": false, "updatingChallengeUuid": "", @@ -406,6 +419,7 @@ Object { "registering": false, "results": null, "resultsLoadedForChallengeId": "", + "statisticsData": null, "submissionInformation": null, "unregistering": false, "updatingChallengeUuid": "", @@ -439,6 +453,7 @@ Object { "registering": false, "results": null, "resultsLoadedForChallengeId": "", + "statisticsData": null, "submissionInformation": null, "unregistering": false, "updatingChallengeUuid": "", @@ -470,6 +485,7 @@ Object { "registering": false, "results": null, "resultsLoadedForChallengeId": "", + "statisticsData": null, "submissionInformation": null, "unregistering": false, "updatingChallengeUuid": "", @@ -499,6 +515,7 @@ Object { "registering": false, "results": null, "resultsLoadedForChallengeId": "", + "statisticsData": null, "submissionInformation": null, "unregistering": false, "updatingChallengeUuid": "", @@ -531,6 +548,7 @@ Object { "registering": false, "results": null, "resultsLoadedForChallengeId": "", + "statisticsData": null, "submissionInformation": null, "unregistering": false, "updatingChallengeUuid": "", @@ -552,6 +570,7 @@ Object { "registering": false, "results": null, "resultsLoadedForChallengeId": "", + "statisticsData": null, "submissionInformation": null, "unregistering": false, "updatingChallengeUuid": "", @@ -577,6 +596,7 @@ Object { "registering": false, "results": null, "resultsLoadedForChallengeId": "", + "statisticsData": null, "submissionInformation": null, "unregistering": false, "updatingChallengeUuid": "", @@ -602,6 +622,7 @@ Object { "registering": false, "results": null, "resultsLoadedForChallengeId": "", + "statisticsData": null, "submissionInformation": null, "unregistering": false, "updatingChallengeUuid": "", @@ -624,6 +645,7 @@ Object { "registering": false, "results": null, "resultsLoadedForChallengeId": "", + "statisticsData": null, "submissionInformation": null, "unregistering": false, "updatingChallengeUuid": "", @@ -655,6 +677,7 @@ Object { "registering": false, "results": null, "resultsLoadedForChallengeId": "", + "statisticsData": null, "submissionInformation": null, "unregistering": false, "updatingChallengeUuid": "", @@ -688,6 +711,7 @@ Object { "registering": false, "results": null, "resultsLoadedForChallengeId": "", + "statisticsData": null, "submissionInformation": null, "unregistering": false, "updatingChallengeUuid": "", @@ -719,6 +743,7 @@ Object { "registering": false, "results": null, "resultsLoadedForChallengeId": "", + "statisticsData": null, "submissionInformation": null, "unregistering": false, "updatingChallengeUuid": "", @@ -748,6 +773,7 @@ Object { "registering": false, "results": null, "resultsLoadedForChallengeId": "", + "statisticsData": null, "submissionInformation": null, "unregistering": false, "updatingChallengeUuid": "", @@ -780,6 +806,7 @@ Object { "registering": false, "results": null, "resultsLoadedForChallengeId": "", + "statisticsData": null, "submissionInformation": null, "unregistering": false, "updatingChallengeUuid": "", @@ -801,6 +828,7 @@ Object { "registering": false, "results": null, "resultsLoadedForChallengeId": "", + "statisticsData": null, "submissionInformation": null, "unregistering": false, "updatingChallengeUuid": "", @@ -826,6 +854,7 @@ Object { "registering": false, "results": null, "resultsLoadedForChallengeId": "", + "statisticsData": null, "submissionInformation": null, "unregistering": false, "updatingChallengeUuid": "", @@ -851,6 +880,7 @@ Object { "registering": false, "results": null, "resultsLoadedForChallengeId": "", + "statisticsData": null, "submissionInformation": null, "unregistering": false, "updatingChallengeUuid": "", @@ -873,6 +903,7 @@ Object { "registering": false, "results": null, "resultsLoadedForChallengeId": "", + "statisticsData": null, "submissionInformation": null, "unregistering": false, "updatingChallengeUuid": "", @@ -904,6 +935,7 @@ Object { "registering": false, "results": null, "resultsLoadedForChallengeId": "", + "statisticsData": null, "submissionInformation": null, "unregistering": false, "updatingChallengeUuid": "", @@ -937,6 +969,7 @@ Object { "registering": false, "results": null, "resultsLoadedForChallengeId": "", + "statisticsData": null, "submissionInformation": null, "unregistering": false, "updatingChallengeUuid": "", @@ -968,6 +1001,7 @@ Object { "registering": false, "results": null, "resultsLoadedForChallengeId": "", + "statisticsData": null, "submissionInformation": null, "unregistering": false, "updatingChallengeUuid": "", @@ -997,6 +1031,7 @@ Object { "registering": false, "results": null, "resultsLoadedForChallengeId": "", + "statisticsData": null, "submissionInformation": null, "unregistering": false, "updatingChallengeUuid": "", @@ -1029,6 +1064,7 @@ Object { "registering": false, "results": null, "resultsLoadedForChallengeId": "", + "statisticsData": null, "submissionInformation": null, "unregistering": false, "updatingChallengeUuid": "", diff --git a/package.json b/package.json index b1bf9678..1bc9b950 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "lint:js": "./node_modules/.bin/eslint --ext .js,.jsx .", "test": "npm run lint && npm run jest" }, - "version": "1.2.2", + "version": "1000.28.6", "dependencies": { "auth0-js": "^6.8.4", "config": "^3.2.0", diff --git a/src/actions/challenge.js b/src/actions/challenge.js index 86655807..9a1c048f 100644 --- a/src/actions/challenge.js +++ b/src/actions/challenge.js @@ -392,6 +392,25 @@ function getSubmissionInformationDone(challengeId, submissionId, tokenV3) { }); } +/** + * @static + * @desc Creates an action that signals beginning of fetching challenge statistics + * @return {Action} + */ +function fetchChallengeStatisticsInit() {} + +/** + * @static + * @desc Creates an action that gets challenge statistics from the backend. + * @param {String} challengeId The challenge id + * @param {String} tokenV3 Topcoder auth token v3. + * @return {Action} + */ +function fetchChallengeStatisticsDone(challengeId, tokenV3) { + const challengeService = getChallengesService(tokenV3); + return challengeService.getChallengeStatistics(challengeId); +} + export default createActions({ CHALLENGE: { DROP_CHECKPOINTS: dropCheckpoints, @@ -417,5 +436,7 @@ export default createActions({ GET_MM_SUBMISSIONS_DONE: getMMSubmissionsDone, GET_SUBMISSION_INFORMATION_INIT: getSubmissionInformationInit, GET_SUBMISSION_INFORMATION_DONE: getSubmissionInformationDone, + FETCH_CHALLENGE_STATISTICS_INIT: fetchChallengeStatisticsInit, + FETCH_CHALLENGE_STATISTICS_DONE: fetchChallengeStatisticsDone, }, }); diff --git a/src/reducers/challenge.js b/src/reducers/challenge.js index 7dde8670..db116631 100644 --- a/src/reducers/challenge.js +++ b/src/reducers/challenge.js @@ -368,6 +368,26 @@ function onGetSubmissionInformationDone(state, action) { }; } +/** + * Handles CHALLENGE/GET_CHALLENGE_STATISTICS_DONE action. + * @param {Object} state Previous state. + * @param {Object} action Action. + */ +function onFetchChallengeStatisticsDone(state, action) { + if (action.error) { + logger.error('Failed to get challenge statistics', action.payload); + return { + ...state, + statisticsData: null, + }; + } + + return { + ...state, + statisticsData: action.payload, + }; +} + /** * Creates a new Challenge reducer with the specified initial state. * @param {Object} initialState Optional. Initial state. @@ -411,6 +431,8 @@ function create(initialState) { [a.getActiveChallengesCountDone]: onGetActiveChallengesCountDone, [a.getSubmissionInformationInit]: onGetSubmissionInformationInit, [a.getSubmissionInformationDone]: onGetSubmissionInformationDone, + [a.fetchChallengeStatisticsInit]: state => state, + [a.fetchChallengeStatisticsDone]: onFetchChallengeStatisticsDone, }, _.defaults(initialState, { details: null, loadingCheckpoints: false, @@ -427,6 +449,7 @@ function create(initialState) { updatingChallengeUuid: '', mmSubmissions: [], submissionInformation: null, + statisticsData: null, })); } diff --git a/src/services/challenges.js b/src/services/challenges.js index bf2efe20..38ae8c5e 100644 --- a/src/services/challenges.js +++ b/src/services/challenges.js @@ -253,6 +253,21 @@ class ChallengesService { }; } + /** + * Gets challenge statistics. + * @param {Number} challengeId + * @return {Promise} The array of statistics + */ + async getChallengeStatistics(challengeId) { + return this.private.apiV5.get(`/challenges/${challengeId}/statistics`) + .then(res => (res.ok ? res.json() : new Error(res.statusText))) + .then(res => ( + res.message + ? new Error(res.message) + : res + )); + } + /** * Activates the specified challenge. * @param {Number} challengeId