Skip to content

Commit fd3922f

Browse files
authored
Merge pull request #1616 from Northeastern-Electric-Racing/1307-change-requests-expire-5-days-after-implemented-instead-of-after-approved
#1307 : Changed dateReviewed to dateImplemented
2 parents d4c7f3c + d0061af commit fd3922f

5 files changed

Lines changed: 19 additions & 11 deletions

File tree

src/backend/src/transformers/change-requests.transformer.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { wbsNumOf } from '../utils/utils';
55
import { calculateChangeRequestStatus, convertCRScopeWhyType } from '../utils/change-requests.utils';
66
import proposedSolutionTransformer from './proposed-solutions.transformer';
77
import userTransformer from './user.transformer';
8+
import { getDateImplemented } from '../utils/change-requests.utils';
89

910
const changeRequestTransformer = (
1011
changeRequest: Prisma.Change_RequestGetPayload<typeof changeRequestRelationArgs>
@@ -23,11 +24,7 @@ const changeRequestTransformer = (
2324
dateReviewed: changeRequest.dateReviewed ?? undefined,
2425
accepted: changeRequest.accepted ?? undefined,
2526
reviewNotes: changeRequest.reviewNotes ?? undefined,
26-
dateImplemented: changeRequest.changes.reduce(
27-
(res: Date | undefined, change) =>
28-
!res || change.dateImplemented.valueOf() > res.valueOf() ? change.dateImplemented : res,
29-
undefined
30-
),
27+
dateImplemented: getDateImplemented(changeRequest),
3128
implementedChanges: changeRequest.changes.map((change) => ({
3229
wbsNum: wbsNumOf(change.wbsElement),
3330
changeId: change.changeId,

src/backend/src/utils/change-requests.utils.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import prisma from '../prisma/prisma';
2-
import { Scope_CR_Why_Type, Team, User, Prisma, Change_Request } from '@prisma/client';
2+
import { Scope_CR_Why_Type, Team, User, Prisma, Change_Request, Change } from '@prisma/client';
33
import { addWeeksToDate, ChangeRequestReason } from 'shared';
44
import { sendMessage } from '../integrations/slack';
55
import { HttpException, NotFoundException } from './errors.utils';
@@ -134,15 +134,16 @@ export const updateBlocking = async (
134134
* @throws if the change request is unreviewed, denied, or deleted
135135
*/
136136
export const validateChangeRequestAccepted = async (crId: number) => {
137-
const changeRequest = await prisma.change_Request.findUnique({ where: { crId } });
137+
const changeRequest = await prisma.change_Request.findUnique({ where: { crId }, include: { changes: true } });
138138
const currentDate = new Date();
139139

140140
if (!changeRequest) throw new NotFoundException('Change Request', crId);
141141
if (changeRequest.dateDeleted) throw new HttpException(400, 'Cannot use a deleted change request!');
142142
if (changeRequest.accepted === null) throw new HttpException(400, 'Cannot implement an unreviewed change request');
143143
if (!changeRequest.accepted) throw new HttpException(400, 'Cannot implement a denied change request');
144144
if (!changeRequest.dateReviewed) throw new HttpException(400, 'Cannot use an unreviewed change request');
145-
if (currentDate.getTime() - changeRequest.dateReviewed.getTime() > 1000 * 60 * 60 * 24 * 5)
145+
const dateImplemented = getDateImplemented(changeRequest);
146+
if (dateImplemented && currentDate.getTime() - dateImplemented.getTime() > 1000 * 60 * 60 * 24 * 5)
146147
throw new HttpException(400, 'Cannot tie changes to outdated change request');
147148

148149
return changeRequest;
@@ -166,6 +167,14 @@ export const calculateChangeRequestStatus = (
166167
return ChangeRequestStatus.Open;
167168
};
168169

170+
export const getDateImplemented = (changeRequest: Change_Request & { changes: Change[] }): Date | undefined => {
171+
return changeRequest.changes.reduce(
172+
(res: Date | undefined, change) =>
173+
!res || change.dateImplemented.valueOf() < res.valueOf() ? change.dateImplemented : res,
174+
undefined
175+
);
176+
};
177+
169178
/**
170179
* Determines whether all the change requests in an array of change requests have been reviewed
171180
* @param changeRequests the given array of change requests

src/backend/tests/projects.test.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ const mockGetHighestProjectNumber = getHighestProjectNumber as jest.Mock<Promise
2323

2424
describe('Projects', () => {
2525
beforeEach(() => {
26-
vi.spyOn(changeRequestUtils, 'validateChangeRequestAccepted').mockImplementation(async (_crId) => prismaChangeRequest1);
26+
vi.spyOn(changeRequestUtils, 'validateChangeRequestAccepted').mockImplementation(async (_crId) => {
27+
return { ...prismaChangeRequest1, changes: [] };
28+
});
2729
vi.spyOn(projectTransformer, 'default').mockReturnValue(sharedProject1);
2830
vi.spyOn(WorkPackagesService, 'deleteWorkPackage').mockImplementation(async (_user: User, _wbsNum: WbsNumber) => {});
2931
});

src/backend/tests/work-packages.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ describe('Work Packages', () => {
6161

6262
beforeEach(() => {
6363
vi.spyOn(changeRequestUtils, 'validateChangeRequestAccepted').mockImplementation(async (_crId) => {
64-
return prismaChangeRequest1;
64+
return { ...prismaChangeRequest1, changes: [] };
6565
});
6666

6767
vi.spyOn(workPackageTransformer, 'default').mockReturnValue(sharedWorkPackage);

src/frontend/src/components/ChangeRequestDropdown.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ const getFilteredChangeRequests = (changeRequests: ChangeRequest[], user: Authen
1212
const fiveDaysAgo = subDays(today, 5);
1313

1414
const filteredRequests = changeRequests.filter(
15-
(cr) => cr.dateReviewed && cr.accepted && isWithinInterval(cr.dateReviewed, { start: fiveDaysAgo, end: today })
15+
(cr) => cr.dateImplemented && cr.accepted && isWithinInterval(cr.dateImplemented, { start: fiveDaysAgo, end: today })
1616
);
1717

1818
// The current user's CRs should be at the top

0 commit comments

Comments
 (0)