11import 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' ;
33import { addWeeksToDate , ChangeRequestReason } from 'shared' ;
44import { sendMessage } from '../integrations/slack' ;
55import { 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 */
136136export 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
0 commit comments