From 1dc558ddbacf42390f46e8aa9792531ffc36e243 Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Mon, 29 Jan 2018 23:23:40 +0100 Subject: [PATCH] prevent ex-participants appearing in challenge export file - Fix #9844 (#9846) * possible fix for 9844 * fix typo in challengeModal file * remove lines for empty users --- .../components/challenges/challengeModal.vue | 7 +++---- website/server/controllers/api-v3/challenges.js | 15 ++++++++++++--- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/website/client/components/challenges/challengeModal.vue b/website/client/components/challenges/challengeModal.vue index 8f39632bad..e51a043e81 100644 --- a/website/client/components/challenges/challengeModal.vue +++ b/website/client/components/challenges/challengeModal.vue @@ -53,10 +53,9 @@ input(type='number', :min='minPrize', :max='maxPrize', v-model="workingChallenge.prize") .row.footer-wrap .col-12.text-center.submit-button-wrapper - .alert.alert-warning(v-if='insufficientGemsForTavernChallenge') - You do not have enough gems to create a Tavern challenge - // @TODO if buy gems button is added, add analytics tracking to it - // see https://github.com/HabitRPG/habitica/blob/develop/website/views/options/social/challenges.jade#L134 + .alert.alert-warning(v-if='insufficientGemsForTavernChallenge') You do not have enough gems to create a Tavern challenge + // @TODO if buy gems button is added, add analytics tracking to it + // see https://github.com/HabitRPG/habitica/blob/develop/website/views/options/social/challenges.jade#L134 button.btn.btn-primary(v-if='creating && !cloning', @click='createChallenge()', :disabled='loading') {{$t('createChallengeAddTasks')}} button.btn.btn-primary(v-once, v-if='cloning', @click='createChallenge()', :disabled='loading') {{$t('createChallengeCloneTasks')}} button.btn.btn-primary(v-once, v-if='!creating && !cloning', @click='updateChallenge()') {{$t('updateChallenge')}} diff --git a/website/server/controllers/api-v3/challenges.js b/website/server/controllers/api-v3/challenges.js index 2d58eda175..aa5a4852c7 100644 --- a/website/server/controllers/api-v3/challenges.js +++ b/website/server/controllers/api-v3/challenges.js @@ -592,13 +592,12 @@ api.exportChallengeCsv = { let resArray = members.map(member => [member._id, member.profile.name]); - // We assume every user in the challenge as at least some data so we can say that members[0] tasks will be at tasks [0] let lastUserId; let index = -1; tasks.forEach(task => { - if (task.userId !== lastUserId) { - lastUserId = task.userId; + while (task.userId !== lastUserId) { index++; + lastUserId = resArray[index][0]; // resArray[index][0] is an user id } const streak = task.streak || 0; @@ -611,8 +610,18 @@ api.exportChallengeCsv = { return result.concat(array); }, []).sort(); resArray.unshift(['UUID', 'name']); + _.times(challengeTasks.length, () => resArray[0].push('Task', 'Value', 'Notes', 'Streak')); + // Remove lines for users without tasks info + resArray = resArray.filter((line) => { + if (line.length === 2) { // only user data ([id, profile name]), no task data + return false; + } + + return true; + }); + res.set({ 'Content-Type': 'text/csv', 'Content-disposition': `attachment; filename=${challengeId}.csv`,