Skip to content

Commit 0308f5e

Browse files
committed
feat: allow non-admin set dates
allow non-admin users to set "completionDate" and "actualStartDate" during milestone updating if they are not yet set
1 parent 60595cc commit 0308f5e

File tree

3 files changed

+41
-6
lines changed

3 files changed

+41
-6
lines changed

src/routes/milestones/bulkUpdate.spec.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,8 @@ describe('BULK UPDATE Milestones', () => {
165165
name: 'Milestone 2',
166166
duration: 3,
167167
startDate: '2018-05-14T00:00:00.000Z',
168+
actualStartDate: '2018-05-14T00:00:00.000Z',
169+
completionDate: '2018-05-15T00:00:00.000Z',
168170
status: 'reviewed',
169171
type: 'type2',
170172
order: 2,
@@ -302,7 +304,7 @@ describe('BULK UPDATE Milestones', () => {
302304

303305
it('should return 403 for non-admin member updating the completionDate', (done) => {
304306
const newBody = _.cloneDeep(body);
305-
newBody.id = 1;
307+
newBody.id = 2;
306308
newBody.completionDate = '2019-01-16T00:00:00.000Z';
307309
request(server)
308310
.patch('/v5/timelines/1/milestones')
@@ -316,7 +318,7 @@ describe('BULK UPDATE Milestones', () => {
316318
it('should return 403 for non-admin member updating the actualStartDate', (done) => {
317319
const newBody = _.cloneDeep(body);
318320
newBody.actualStartDate = '2018-05-15T00:00:00.000Z';
319-
newBody.id = 1;
321+
newBody.id = 2;
320322
request(server)
321323
.patch('/v5/timelines/1/milestones')
322324
.set({

src/routes/milestones/commonHelper.js

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,17 @@ async function updateMilestone(authUser, timelineId, data, transaction, item) {
113113
}
114114
entityToUpdate.status = statusHistory[1].status;
115115
}
116-
if ((entityToUpdate.completionDate || entityToUpdate.actualStartDate) &&
117-
!util.hasPermission({ topcoderRoles: ADMIN_ROLES }, authUser)) {
118-
const apiErr = new Error('You are not authorised to perform this action');
116+
117+
// only admins can update values of 'completionDate' and 'actualStartDate' if they are already set
118+
const isUpdatedCompletionDate = milestone.completionDate && entityToUpdate.completionDate
119+
&& milestone.completionDate !== entityToUpdate.completionDate;
120+
const isUpdatedActualStartDate = milestone.actualStartDate && entityToUpdate.actualStartDate
121+
&& milestone.actualStartDate !== entityToUpdate.actualStartDate;
122+
if (
123+
(isUpdatedCompletionDate || isUpdatedActualStartDate)
124+
&& !util.hasPermission({ topcoderRoles: ADMIN_ROLES }, authUser)
125+
) {
126+
const apiErr = new Error('You are not allowed to perform this action.');
119127
apiErr.status = 403;
120128
throw apiErr;
121129
}

src/routes/milestones/update.spec.js

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ describe('UPDATE Milestone', () => {
166166
name: 'Milestone 2',
167167
duration: 3,
168168
startDate: '2018-05-14T00:00:00.000Z',
169+
actualStartDate: '2018-05-14T00:00:00.000Z',
169170
status: 'reviewed',
170171
type: 'type2',
171172
order: 2,
@@ -317,14 +318,38 @@ describe('UPDATE Milestone', () => {
317318
const newBody = _.cloneDeep(body);
318319
newBody.actualStartDate = '2018-05-15T00:00:00.000Z';
319320
request(server)
320-
.patch('/v5/timelines/1/milestones/1')
321+
.patch('/v5/timelines/1/milestones/2')
321322
.set({
322323
Authorization: `Bearer ${testUtil.jwts.manager}`,
323324
})
324325
.send(newBody)
325326
.expect(403, done);
326327
});
327328

329+
it('should return 200 for non-admin member setting the completionDate', (done) => {
330+
const newBody = _.cloneDeep(body);
331+
newBody.completionDate = '2019-01-16T00:00:00.000Z';
332+
request(server)
333+
.patch('/v5/timelines/1/milestones/2')
334+
.set({
335+
Authorization: `Bearer ${testUtil.jwts.manager}`,
336+
})
337+
.send(newBody)
338+
.expect(200, done);
339+
});
340+
341+
it('should return 200 for non-admin member setting the actualStartDate', (done) => {
342+
const newBody = _.cloneDeep(body);
343+
newBody.actualStartDate = '2018-05-15T00:00:00.000Z';
344+
request(server)
345+
.patch('/v5/timelines/1/milestones/1')
346+
.set({
347+
Authorization: `Bearer ${testUtil.jwts.manager}`,
348+
})
349+
.send(newBody)
350+
.expect(200, done);
351+
});
352+
328353
it('should return 404 for non-existed timeline', (done) => {
329354
request(server)
330355
.patch('/v5/timelines/1234/milestones/1')

0 commit comments

Comments
 (0)