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 c8e05d3d28..71eb8e8d40 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 @@ -37,6 +37,20 @@ describe('POST /tasks/:id/score/:direction', () => { let memberTasks = await member.get('/tasks/user'); let syncedTask = find(memberTasks, findAssignedTask); + let response = await member.post(`/tasks/${syncedTask._id}/score/up`); + let updatedTask = await member.get(`/tasks/${syncedTask._id}`); + + expect(response.message).to.equal(t('taskRequiresApproval')); + expect(updatedTask.approvalRequested).to.equal(true); + expect(updatedTask.approvalRequestedDate).to.be.a('string'); // date gets converted to a string as json doesn't have a Date type + }); + + it('errors when approval has already been requested', async () => { + let memberTasks = await member.get('/tasks/user'); + let syncedTask = find(memberTasks, findAssignedTask); + + await member.post(`/tasks/${syncedTask._id}/score/up`); + await expect(member.post(`/tasks/${syncedTask._id}/score/up`)) .to.eventually.be.rejected.and.eql({ code: 401, diff --git a/website/server/controllers/api-v3/tasks.js b/website/server/controllers/api-v3/tasks.js index a254fcc521..93537a3c65 100644 --- a/website/server/controllers/api-v3/tasks.js +++ b/website/server/controllers/api-v3/tasks.js @@ -316,7 +316,13 @@ api.scoreTask = { if (!task) throw new NotFound(res.t('taskNotFound')); if (task.requiresApproval && !task.approved) { - throw new NotAuthorized(res.t('taskRequiresApproval')); + if (task.approvalRequested) { + throw new NotAuthorized(res.t('taskRequiresApproval')); + } + task.approvalRequested = true; + task.approvalRequestedDate = new Date(); + await task.save(); + return res.respond(200, {message: res.t('taskRequiresApproval'), task}); } let wasCompleted = task.completed; diff --git a/website/server/models/task.js b/website/server/models/task.js index cdba5b6f6c..ad31454391 100644 --- a/website/server/models/task.js +++ b/website/server/models/task.js @@ -73,6 +73,10 @@ export let TaskSchema = new Schema({ requiresApproval: {type: Boolean, default: false}, approved: {type: Boolean, default: false}, + approvedDate: {type: Date}, + approvingUser: [{type: String, ref: 'User', validate: [validator.isUUID, 'Invalid uuid.']}], + approvalRequested: {type: Boolean, default: false}, + approvalRequestedDate: {type: Date}, reminders: [{ _id: false,