7
7
Range ,
8
8
RangeException ,
9
9
RequiredWhen ,
10
+ ResourceShape ,
10
11
SecuredList ,
11
12
Session ,
12
13
UnsecuredDto ,
@@ -149,8 +150,12 @@ export class EngagementService {
149
150
return engagements . map ( ( dto ) => this . secure ( dto , session ) ) ;
150
151
}
151
152
152
- secure ( dto : UnsecuredDto < Engagement > , session : Session ) : Engagement {
153
- return this . privileges . for ( session , resolveEngagementType ( dto ) ) . secure ( dto ) ;
153
+ private secure < E extends Engagement > (
154
+ dto : UnsecuredDto < E > ,
155
+ session : Session ,
156
+ ) : E {
157
+ const res = resolveEngagementType ( dto ) as unknown as ResourceShape < E > ;
158
+ return this . privileges . for ( session , res ) . secure ( dto ) ;
154
159
}
155
160
156
161
async updateLanguageEngagement (
@@ -160,20 +165,23 @@ export class EngagementService {
160
165
) : Promise < LanguageEngagement > {
161
166
const view : ObjectView = viewOfChangeset ( changeset ) ;
162
167
163
- const previous = await this . repo . readOne ( input . id , session , view ) ;
164
- const object = this . secure ( previous , session ) as LanguageEngagement ;
168
+ const previous = ( await this . repo . readOne (
169
+ input . id ,
170
+ session ,
171
+ view ,
172
+ ) ) as UnsecuredDto < LanguageEngagement > ;
173
+ const object = this . secure ( previous , session ) ;
165
174
166
- if ( input . status && input . status !== previous . status ) {
175
+ const { methodology, ...maybeChanges } = input ;
176
+ const changes = this . repo . getActualLanguageChanges ( object , maybeChanges ) ;
177
+ if ( changes . status ) {
167
178
await this . engagementRules . verifyStatusChange (
168
179
input . id ,
169
180
session ,
170
- input . status ,
181
+ changes . status ,
171
182
changeset ,
172
183
) ;
173
184
}
174
-
175
- const { methodology, ...maybeChanges } = input ;
176
- const changes = this . repo . getActualLanguageChanges ( object , maybeChanges ) ;
177
185
this . privileges
178
186
. for ( session , LanguageEngagement , object )
179
187
. verifyChanges ( changes ) ;
@@ -188,7 +196,14 @@ export class EngagementService {
188
196
changeset ,
189
197
) ;
190
198
191
- RequiredWhen . verify ( LanguageEngagement , updated ) ;
199
+ const prevMissing = RequiredWhen . calc ( LanguageEngagement , previous ) ;
200
+ const nowMissing = RequiredWhen . calc ( LanguageEngagement , updated ) ;
201
+ if (
202
+ nowMissing &&
203
+ ( ! prevMissing || nowMissing . missing . length >= prevMissing . missing . length )
204
+ ) {
205
+ throw nowMissing ;
206
+ }
192
207
193
208
const event = new EngagementUpdatedEvent (
194
209
updated ,
@@ -210,19 +225,22 @@ export class EngagementService {
210
225
) : Promise < InternshipEngagement > {
211
226
const view : ObjectView = viewOfChangeset ( changeset ) ;
212
227
213
- const previous = await this . repo . readOne ( input . id , session , view ) ;
214
- const object = this . secure ( previous , session ) as InternshipEngagement ;
228
+ const previous = ( await this . repo . readOne (
229
+ input . id ,
230
+ session ,
231
+ view ,
232
+ ) ) as UnsecuredDto < InternshipEngagement > ;
233
+ const object = this . secure ( previous , session ) ;
215
234
216
- if ( input . status && input . status !== previous . status ) {
235
+ const changes = this . repo . getActualInternshipChanges ( object , input ) ;
236
+ if ( changes . status ) {
217
237
await this . engagementRules . verifyStatusChange (
218
238
input . id ,
219
239
session ,
220
- input . status ,
240
+ changes . status ,
221
241
changeset ,
222
242
) ;
223
243
}
224
-
225
- const changes = this . repo . getActualInternshipChanges ( object , input ) ;
226
244
this . privileges
227
245
. for ( session , InternshipEngagement , object )
228
246
. verifyChanges ( changes , { pathPrefix : 'engagement' } ) ;
@@ -234,7 +252,14 @@ export class EngagementService {
234
252
changeset ,
235
253
) ;
236
254
237
- RequiredWhen . verify ( InternshipEngagement , updated ) ;
255
+ const prevMissing = RequiredWhen . calc ( InternshipEngagement , previous ) ;
256
+ const nowMissing = RequiredWhen . calc ( InternshipEngagement , updated ) ;
257
+ if (
258
+ nowMissing &&
259
+ ( ! prevMissing || nowMissing . missing . length >= prevMissing . missing . length )
260
+ ) {
261
+ throw nowMissing ;
262
+ }
238
263
239
264
const event = new EngagementUpdatedEvent (
240
265
updated ,
0 commit comments