1
1
import { forwardRef , Inject , Injectable } from '@nestjs/common' ;
2
2
import {
3
+ CalendarDate ,
3
4
ID ,
4
5
InputException ,
5
6
ObjectView ,
7
+ Range ,
8
+ RangeException ,
6
9
SecuredList ,
7
10
Session ,
8
11
UnsecuredDto ,
@@ -16,6 +19,7 @@ import {
16
19
Logger ,
17
20
ResourceLoader ,
18
21
} from '~/core' ;
22
+ import { AnyChangesOf } from '~/core/database/changes' ;
19
23
import { Privileges } from '../authorization' ;
20
24
import { CeremonyService } from '../ceremony' ;
21
25
import { ProductService } from '../product' ;
@@ -67,6 +71,7 @@ export class EngagementService {
67
71
) : Promise < LanguageEngagement > {
68
72
await this . verifyCreateEngagement ( input . projectId , session ) ;
69
73
this . verifyCreationStatus ( input . status ) ;
74
+ EngagementDateRangeException . throwIfInvalid ( input ) ;
70
75
71
76
const engagement = await this . repo . createLanguageEngagement (
72
77
input ,
@@ -87,6 +92,7 @@ export class EngagementService {
87
92
) : Promise < InternshipEngagement > {
88
93
await this . verifyCreateEngagement ( input . projectId , session ) ;
89
94
this . verifyCreationStatus ( input . status ) ;
95
+ EngagementDateRangeException . throwIfInvalid ( input ) ;
90
96
91
97
const { id } = await this . repo . createInternshipEngagement (
92
98
input ,
@@ -172,6 +178,7 @@ export class EngagementService {
172
178
this . privileges
173
179
. for ( session , LanguageEngagement , object )
174
180
. verifyChanges ( changes ) ;
181
+ EngagementDateRangeException . throwIfInvalid ( previous , changes ) ;
175
182
176
183
const updated = await this . repo . updateLanguage (
177
184
{
@@ -218,6 +225,7 @@ export class EngagementService {
218
225
this . privileges
219
226
. for ( session , InternshipEngagement , object )
220
227
. verifyChanges ( changes , { pathPrefix : 'engagement' } ) ;
228
+ EngagementDateRangeException . throwIfInvalid ( previous , changes ) ;
221
229
222
230
const updated = await this . repo . updateInternship (
223
231
{ id : object . id , ...changes } ,
@@ -310,3 +318,33 @@ export class EngagementService {
310
318
return ids . length > 0 ;
311
319
}
312
320
}
321
+
322
+ class EngagementDateRangeException extends RangeException {
323
+ static throwIfInvalid (
324
+ current : Partial <
325
+ Pick < UnsecuredDto < Engagement > , 'startDateOverride' | 'endDateOverride' >
326
+ > ,
327
+ changes : AnyChangesOf < Engagement > = { } ,
328
+ ) {
329
+ const start =
330
+ changes . startDateOverride !== undefined
331
+ ? changes . startDateOverride
332
+ : current . startDateOverride ;
333
+ const end =
334
+ changes . endDateOverride !== undefined
335
+ ? changes . endDateOverride
336
+ : current . endDateOverride ;
337
+ if ( start && end && start > end ) {
338
+ const field =
339
+ changes . endDateOverride !== undefined
340
+ ? 'engagement.endDateOverride'
341
+ : 'engagement.startDateOverride' ;
342
+ throw new EngagementDateRangeException ( { start, end } , field ) ;
343
+ }
344
+ }
345
+
346
+ constructor ( readonly value : Range < CalendarDate > , readonly field : string ) {
347
+ const message = "Engagement's start date must be before the end date" ;
348
+ super ( { message, field } ) ;
349
+ }
350
+ }
0 commit comments