Skip to content

Commit 5ed7831

Browse files
author
Tom Jones
committed
EES-4046: Update delete permission for readability, delete associated data blocks when deleting draft releases.
1 parent 5479cf7 commit 5ed7831

File tree

2 files changed

+55
-19
lines changed

2 files changed

+55
-19
lines changed

src/GovUk.Education.ExploreEducationStatistics.Admin/Security/AuthorizationHandlers/DeleteSpecificReleaseAuthorizationHandlers.cs

+21-11
Original file line numberDiff line numberDiff line change
@@ -30,24 +30,34 @@ protected override async Task HandleRequirementAsync(
3030
DeleteSpecificReleaseRequirement requirement,
3131
ReleaseVersion releaseVersion)
3232
{
33-
if ((!context.User.IsInRole(RoleNames.BauUser) && !releaseVersion.Amendment) || releaseVersion.ApprovalStatus == Approved)
33+
if (releaseVersion.ApprovalStatus != Draft)
3434
{
3535
return;
3636
}
3737

38-
if (SecurityUtils.HasClaim(context.User, DeleteAllReleaseAmendments))
38+
if (!releaseVersion.Amendment)
3939
{
40-
context.Succeed(requirement);
41-
return;
40+
if (context.User.IsInRole(RoleNames.BauUser))
41+
{
42+
context.Succeed(requirement);
43+
}
4244
}
43-
44-
if (await _authorizationHandlerService
45-
.HasRolesOnPublication(
46-
userId: context.User.GetUserId(),
47-
publicationId: releaseVersion.PublicationId,
48-
Owner))
45+
else
4946
{
50-
context.Succeed(requirement);
47+
if (SecurityUtils.HasClaim(context.User, DeleteAllReleaseAmendments))
48+
{
49+
context.Succeed(requirement);
50+
return;
51+
}
52+
53+
if (await _authorizationHandlerService
54+
.HasRolesOnPublication(
55+
userId: context.User.GetUserId(),
56+
publicationId: releaseVersion.PublicationId,
57+
Owner))
58+
{
59+
context.Succeed(requirement);
60+
}
5161
}
5262
}
5363
}

src/GovUk.Education.ExploreEducationStatistics.Admin/Services/ReleaseService.cs

+34-8
Original file line numberDiff line numberDiff line change
@@ -214,13 +214,20 @@ public Task<Either<ActionResult, Unit>> DeleteReleaseVersion(
214214
return _persistenceHelper
215215
.CheckEntityExists<ReleaseVersion>(releaseVersionId)
216216
.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+
})
217224
.OnSuccessDo(async () => await _processorClient.BulkDeleteDataSetVersions(releaseVersionId))
218225
.OnSuccessDo(async release => await _cacheService.DeleteCacheFolderAsync(new PrivateReleaseContentFolderCacheKey(release.Id)))
219226
.OnSuccessDo(async () => await _releaseDataFileService.DeleteAll(releaseVersionId))
220227
.OnSuccessDo(async () => await _releaseFileService.DeleteAll(releaseVersionId))
221228
.OnSuccessVoid(async releaseVersion =>
222229
{
223-
if (!releaseVersion.Amendment && releaseVersion.ApprovalStatus == ReleaseApprovalStatus.Draft)
230+
if (!releaseVersion.Amendment)
224231
{
225232
await HardDeleteForDraft(releaseVersion, cancellationToken);
226233
}
@@ -233,6 +240,7 @@ public Task<Either<ActionResult, Unit>> DeleteReleaseVersion(
233240

234241
await _context.SaveChangesAsync();
235242

243+
// TODO: This may be redundant (investigate as part of EES-1295)
236244
await _releaseSubjectRepository.DeleteAllReleaseSubjects(releaseVersionId: releaseVersionId);
237245
});
238246
}
@@ -241,19 +249,15 @@ private async Task HardDeleteForDraft(
241249
ReleaseVersion releaseVersion,
242250
CancellationToken cancellationToken)
243251
{
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);
249254

250255
var release = await _context.Releases.FindAsync(releaseVersion.ReleaseId, cancellationToken);
251256
_context.Releases.Remove(release!);
252257

258+
// We suspect this is only necessary for the unit tests, as the in-memory database doesn't perform a cascade delete
253259
await DeleteRoles(releaseVersion.Id, hardDelete: true, cancellationToken);
254260
await DeleteInvites(releaseVersion.Id, hardDelete: true, cancellationToken);
255-
256-
_context.ReleaseVersions.Remove(releaseVersion);
257261
}
258262

259263
private async Task SoftDeleteForAmendment(
@@ -267,6 +271,7 @@ private async Task SoftDeleteForAmendment(
267271
await DeleteInvites(releaseVersion.Id, hardDelete: false, cancellationToken);
268272
}
269273

274+
// TODO: UserReleaseRoles deletion should probably be handled by cascade deletion of the associated ReleaseVersion (investigate as part of EES-1295)
270275
private async Task DeleteRoles(
271276
Guid releaseVersionId,
272277
bool hardDelete,
@@ -289,6 +294,7 @@ private async Task DeleteRoles(
289294
}
290295
}
291296

297+
// TODO: UserReleaseInvites deletion should probably be handled by cascade deletion of the associated ReleaseVersion (investigate as part of EES-1295)
292298
private async Task DeleteInvites(
293299
Guid releaseVersionId,
294300
bool hardDelete,
@@ -311,6 +317,26 @@ private async Task DeleteInvites(
311317
}
312318
}
313319

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+
314340
private void UpdateMethodologies(Guid releaseVersionId)
315341
{
316342
var methodologiesScheduledWithRelease = GetMethodologiesScheduledWithRelease(releaseVersionId);

0 commit comments

Comments
 (0)