From 13cdcedcbad91bff0f1f351825792b07fff7f973 Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Mon, 4 Dec 2017 11:23:47 -0600 Subject: [PATCH] Added support for scoring group tasks down after approval (#9623) * Added support for scoring group tasks down after approval * Fixed lint issues --- ...OST-group_tasks_id_score_direction.test.js | 9 ++++- website/client/components/notifications.vue | 8 +++- website/server/controllers/api-v3/tasks.js | 1 + .../server/controllers/api-v3/tasks/groups.js | 38 +++++++++++++------ 4 files changed, 40 insertions(+), 16 deletions(-) diff --git a/test/api/v3/integration/tasks/groups/POST-group_tasks_id_score_direction.test.js b/test/api/v3/integration/tasks/groups/POST-group_tasks_id_score_direction.test.js index a707e445a2..d50841d3bc 100644 --- a/test/api/v3/integration/tasks/groups/POST-group_tasks_id_score_direction.test.js +++ b/test/api/v3/integration/tasks/groups/POST-group_tasks_id_score_direction.test.js @@ -41,8 +41,9 @@ describe('POST /tasks/:id/score/:direction', () => { let memberTasks = await member.get('/tasks/user'); let syncedTask = find(memberTasks, findAssignedTask); + const direction = 'up'; - await expect(member.post(`/tasks/${syncedTask._id}/score/up`)) + await expect(member.post(`/tasks/${syncedTask._id}/score/${direction}`)) .to.eventually.be.rejected.and.to.eql({ code: 401, error: 'NotAuthorized', @@ -58,6 +59,7 @@ describe('POST /tasks/:id/score/:direction', () => { user: member.auth.local.username, taskName: updatedTask.text, taskId: updatedTask._id, + direction, }, 'cs')); // This test only works if we have the notification translated expect(user.notifications[1].data.groupId).to.equal(guild._id); @@ -71,8 +73,9 @@ describe('POST /tasks/:id/score/:direction', () => { }); let memberTasks = await member.get('/tasks/user'); let syncedTask = find(memberTasks, findAssignedTask); + const direction = 'up'; - await expect(member.post(`/tasks/${syncedTask._id}/score/up`)) + await expect(member.post(`/tasks/${syncedTask._id}/score/${direction}`)) .to.eventually.be.rejected.and.to.eql({ code: 401, error: 'NotAuthorized', @@ -88,6 +91,7 @@ describe('POST /tasks/:id/score/:direction', () => { user: member.auth.local.username, taskName: updatedTask.text, taskId: updatedTask._id, + direction, })); expect(user.notifications[1].data.groupId).to.equal(guild._id); @@ -97,6 +101,7 @@ describe('POST /tasks/:id/score/:direction', () => { user: member.auth.local.username, taskName: updatedTask.text, taskId: updatedTask._id, + direction, })); expect(member2.notifications[0].data.groupId).to.equal(guild._id); }); diff --git a/website/client/components/notifications.vue b/website/client/components/notifications.vue index 8437c37428..2ddcb7e821 100644 --- a/website/client/components/notifications.vue +++ b/website/client/components/notifications.vue @@ -568,10 +568,14 @@ export default { let approvedTasks = []; for (let i = 0; i < scoreTaskNotification.length; i++) { // Array with all approved tasks + const scoreData = scoreTaskNotification[i].data; + let direction = 'up'; + if (scoreData.direction) direction = scoreData.direction; + approvedTasks.push({ params: { - task: scoreTaskNotification[i].data.scoreTask, - direction: 'up', + task: scoreData.scoreTask, + direction, }, }); diff --git a/website/server/controllers/api-v3/tasks.js b/website/server/controllers/api-v3/tasks.js index 7bbb10948d..bddbf6cde1 100644 --- a/website/server/controllers/api-v3/tasks.js +++ b/website/server/controllers/api-v3/tasks.js @@ -569,6 +569,7 @@ api.scoreTask = { }, manager.preferences.language), groupId: group._id, taskId: task._id, + direction, }); managerPromises.push(manager.save()); }); diff --git a/website/server/controllers/api-v3/tasks/groups.js b/website/server/controllers/api-v3/tasks/groups.js index 2c44ef848e..709da205fe 100644 --- a/website/server/controllers/api-v3/tasks/groups.js +++ b/website/server/controllers/api-v3/tasks/groups.js @@ -299,20 +299,22 @@ api.approveTask = { task.group.approval.approvingUser = user._id; task.group.approval.approved = true; - assignedUser.addNotification('GROUP_TASK_APPROVED', { - message: res.t('yourTaskHasBeenApproved', {taskText: task.text}), - groupId: group._id, - }); - - assignedUser.addNotification('SCORED_TASK', { - message: res.t('yourTaskHasBeenApproved', {taskText: task.text}), - scoreTask: task, - }); - - let managerIds = Object.keys(group.managers); + // Get Managers + const managerIds = Object.keys(group.managers); managerIds.push(group.leader); - let managers = await User.find({_id: managerIds}, 'notifications').exec(); // Use this method so we can get access to notifications + const managers = await User.find({_id: managerIds}, 'notifications').exec(); // Use this method so we can get access to notifications + // Get task direction + const firstManagerNotifications = managers[0].notifications; + const firstNotificationIndex = findIndex(firstManagerNotifications, (notification) => { + return notification.data.taskId === task._id; + }); + let direction = 'up'; + if (firstManagerNotifications[firstNotificationIndex]) { + direction = firstManagerNotifications[firstNotificationIndex].direction; + } + + // Remove old notifications let managerPromises = []; managers.forEach((manager) => { let notificationIndex = findIndex(manager.notifications, function findNotification (notification) { @@ -325,6 +327,18 @@ api.approveTask = { } }); + // Add new notifications to user + assignedUser.addNotification('GROUP_TASK_APPROVED', { + message: res.t('yourTaskHasBeenApproved', {taskText: task.text}), + groupId: group._id, + }); + + assignedUser.addNotification('SCORED_TASK', { + message: res.t('yourTaskHasBeenApproved', {taskText: task.text}), + scoreTask: task, + direction, + }); + managerPromises.push(task.save()); managerPromises.push(assignedUser.save()); await Bluebird.all(managerPromises);