@@ -214,13 +214,20 @@ public Task<Either<ActionResult, Unit>> DeleteReleaseVersion(
214
214
return _persistenceHelper
215
215
. CheckEntityExists < ReleaseVersion > ( releaseVersionId )
216
216
. OnSuccess ( _userService . CheckCanDeleteReleaseVersion )
217
+ . OnSuccessDo ( releaseVersion =>
218
+ {
219
+ if ( releaseVersion . ApprovalStatus != ReleaseApprovalStatus . Draft )
220
+ {
221
+ throw new Exception ( "Can only delete draft releases" ) ;
222
+ }
223
+ } )
217
224
. OnSuccessDo ( async ( ) => await _processorClient . BulkDeleteDataSetVersions ( releaseVersionId ) )
218
225
. OnSuccessDo ( async release => await _cacheService . DeleteCacheFolderAsync ( new PrivateReleaseContentFolderCacheKey ( release . Id ) ) )
219
226
. OnSuccessDo ( async ( ) => await _releaseDataFileService . DeleteAll ( releaseVersionId ) )
220
227
. OnSuccessDo ( async ( ) => await _releaseFileService . DeleteAll ( releaseVersionId ) )
221
228
. OnSuccessVoid ( async releaseVersion =>
222
229
{
223
- if ( ! releaseVersion . Amendment && releaseVersion . ApprovalStatus == ReleaseApprovalStatus . Draft )
230
+ if ( ! releaseVersion . Amendment )
224
231
{
225
232
await HardDeleteForDraft ( releaseVersion , cancellationToken ) ;
226
233
}
@@ -233,6 +240,7 @@ public Task<Either<ActionResult, Unit>> DeleteReleaseVersion(
233
240
234
241
await _context . SaveChangesAsync ( ) ;
235
242
243
+ // TODO: This may be redundant (investigate as part of EES-1295)
236
244
await _releaseSubjectRepository . DeleteAllReleaseSubjects ( releaseVersionId : releaseVersionId ) ;
237
245
} ) ;
238
246
}
@@ -241,19 +249,15 @@ private async Task HardDeleteForDraft(
241
249
ReleaseVersion releaseVersion ,
242
250
CancellationToken cancellationToken )
243
251
{
244
- var publication = await _context . Publications . FindAsync ( releaseVersion . PublicationId , cancellationToken ) ;
245
- var releaseSeriesItem = publication ! . ReleaseSeries . Find ( rs => rs . ReleaseId == releaseVersion . ReleaseId ) ;
246
-
247
- publication . ReleaseSeries . Remove ( releaseSeriesItem ! ) ;
248
- _context . Publications . Update ( publication ) ;
252
+ await DeleteReleaseSeriesItem ( releaseVersion , cancellationToken ) ;
253
+ DeleteDataBlocks ( releaseVersion . Id ) ;
249
254
250
255
var release = await _context . Releases . FindAsync ( releaseVersion . ReleaseId , cancellationToken ) ;
251
256
_context . Releases . Remove ( release ! ) ;
252
257
258
+ // We suspect this is only necessary for the unit tests, as the in-memory database doesn't perform a cascade delete
253
259
await DeleteRoles ( releaseVersion . Id , hardDelete : true , cancellationToken ) ;
254
260
await DeleteInvites ( releaseVersion . Id , hardDelete : true , cancellationToken ) ;
255
-
256
- _context . ReleaseVersions . Remove ( releaseVersion ) ;
257
261
}
258
262
259
263
private async Task SoftDeleteForAmendment (
@@ -267,6 +271,7 @@ private async Task SoftDeleteForAmendment(
267
271
await DeleteInvites ( releaseVersion . Id , hardDelete : false , cancellationToken ) ;
268
272
}
269
273
274
+ // TODO: UserReleaseRoles deletion should probably be handled by cascade deletion of the associated ReleaseVersion (investigate as part of EES-1295)
270
275
private async Task DeleteRoles (
271
276
Guid releaseVersionId ,
272
277
bool hardDelete ,
@@ -289,6 +294,7 @@ private async Task DeleteRoles(
289
294
}
290
295
}
291
296
297
+ // TODO: UserReleaseInvites deletion should probably be handled by cascade deletion of the associated ReleaseVersion (investigate as part of EES-1295)
292
298
private async Task DeleteInvites (
293
299
Guid releaseVersionId ,
294
300
bool hardDelete ,
@@ -311,6 +317,26 @@ private async Task DeleteInvites(
311
317
}
312
318
}
313
319
320
+ private async Task DeleteReleaseSeriesItem (
321
+ ReleaseVersion releaseVersion ,
322
+ CancellationToken cancellationToken )
323
+ {
324
+ var publication = await _context . Publications . FindAsync ( releaseVersion . PublicationId , cancellationToken ) ;
325
+ var releaseSeriesItem = publication ! . ReleaseSeries . Find ( rs => rs . ReleaseId == releaseVersion . ReleaseId ) ;
326
+
327
+ publication . ReleaseSeries . Remove ( releaseSeriesItem ! ) ;
328
+ _context . Publications . Update ( publication ) ;
329
+ }
330
+
331
+ private void DeleteDataBlocks ( Guid releaseVersionId )
332
+ {
333
+ var dataBlocks = _context . DataBlockVersions
334
+ . Where ( dbv => dbv . ReleaseVersionId == releaseVersionId )
335
+ . Select ( dbv => dbv . DataBlockParent ) ;
336
+
337
+ _context . DataBlockParents . RemoveRange ( dataBlocks ) ;
338
+ }
339
+
314
340
private void UpdateMethodologies ( Guid releaseVersionId )
315
341
{
316
342
var methodologiesScheduledWithRelease = GetMethodologiesScheduledWithRelease ( releaseVersionId ) ;
0 commit comments