Skip to content

Commit 0a0cc6a

Browse files
Merge pull request #5705 from dfe-analytical-services/EES-5934-second-attempt
EES-5934 Fixing Admin Public API Data Set Changelog page
2 parents 8ecfc31 + fb28ad9 commit 0a0cc6a

File tree

12 files changed

+395
-83
lines changed

12 files changed

+395
-83
lines changed

src/GovUk.Education.ExploreEducationStatistics.Admin.Tests/Controllers/Api/Public.Data/DataSetVersionsControllerTests.cs

+73
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,79 @@ private async Task<HttpResponseMessage> ListLiveVersions(
369369
}
370370
}
371371

372+
public class GetDataSetVersionTests(
373+
TestApplicationFactory testApp) : DataSetVersionsControllerTests(testApp)
374+
{
375+
public static TheoryData<DataSetVersionStatus> AllDataSetVersionStatuses => new(EnumUtil.GetEnums<DataSetVersionStatus>());
376+
377+
[Theory]
378+
[MemberData(nameof(AllDataSetVersionStatuses))]
379+
public async Task Success(DataSetVersionStatus dataSetVersionStatus)
380+
{
381+
DataSet dataSet = DataFixture
382+
.DefaultDataSet()
383+
.WithStatusPublished();
384+
385+
await TestApp.AddTestData<PublicDataDbContext>(context => context.DataSets.Add(dataSet));
386+
387+
var dataSetVersions = DataFixture
388+
.DefaultDataSetVersion()
389+
.WithStatus(dataSetVersionStatus)
390+
.WithDataSet(dataSet)
391+
.GenerateList(3);
392+
393+
await TestApp.AddTestData<PublicDataDbContext>(context =>
394+
{
395+
context.DataSetVersions.AddRange(dataSetVersions);
396+
context.DataSets.Update(dataSet);
397+
});
398+
399+
var requestedDataSetVersion = dataSetVersions[1];
400+
401+
var response = await GetDataSetVersion(dataSetVersionId: requestedDataSetVersion.Id);
402+
403+
var viewModel = response.AssertOk<DataSetVersionInfoViewModel>();
404+
405+
Assert.NotNull(viewModel);
406+
Assert.Equal(requestedDataSetVersion.Id, viewModel.Id);
407+
Assert.Equal(requestedDataSetVersion.PublicVersion, viewModel.Version);
408+
Assert.Equal(requestedDataSetVersion.Status, viewModel.Status);
409+
Assert.Equal(requestedDataSetVersion.VersionType, viewModel.Type);
410+
Assert.Equal(requestedDataSetVersion.Notes, viewModel.Notes);
411+
}
412+
413+
[Fact]
414+
public async Task NotBauUser_Returns403()
415+
{
416+
var client = BuildApp(user: DataFixture.AuthenticatedUser()).CreateClient();
417+
418+
var response = await GetDataSetVersion(
419+
dataSetVersionId: Guid.NewGuid(),
420+
client: client);
421+
422+
response.AssertForbidden();
423+
}
424+
425+
[Fact]
426+
public async Task DataSetVersionDoesNotExist_Returns404()
427+
{
428+
var response = await GetDataSetVersion(dataSetVersionId: Guid.NewGuid());
429+
430+
response.AssertNotFound();
431+
}
432+
433+
private async Task<HttpResponseMessage> GetDataSetVersion(
434+
Guid dataSetVersionId,
435+
HttpClient? client = null)
436+
{
437+
client ??= BuildApp().CreateClient();
438+
439+
var uri = $"{BaseUrl}/{dataSetVersionId}";
440+
441+
return await client.GetAsync(uri);
442+
}
443+
}
444+
372445
public class CreateNextVersionTests(
373446
TestApplicationFactory testApp) : DataSetVersionsControllerTests(testApp)
374447
{

src/GovUk.Education.ExploreEducationStatistics.Admin/Controllers/Api/Public.Data/DataSetVersionsController.cs

+13
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,19 @@ public async Task<ActionResult<PaginatedListViewModel<DataSetLiveVersionSummaryV
3333
.HandleFailuresOrOk();
3434
}
3535

36+
[HttpGet("{dataSetVersionId:guid}")]
37+
[Produces("application/json")]
38+
public async Task<ActionResult<DataSetVersionInfoViewModel>> GetDataSetVersion(
39+
Guid dataSetVersionId,
40+
CancellationToken cancellationToken)
41+
{
42+
return await dataSetVersionService
43+
.GetDataSetVersion(
44+
dataSetVersionId: dataSetVersionId,
45+
cancellationToken: cancellationToken)
46+
.HandleFailuresOrOk();
47+
}
48+
3649
[HttpPost]
3750
[Produces("application/json")]
3851
public async Task<ActionResult<DataSetVersionSummaryViewModel>> CreateNextVersion(

src/GovUk.Education.ExploreEducationStatistics.Admin/Mappings/MappingProfiles.cs

+10
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22
using GovUk.Education.ExploreEducationStatistics.Admin.Services.Methodologies;
33
using GovUk.Education.ExploreEducationStatistics.Admin.ViewModels;
44
using GovUk.Education.ExploreEducationStatistics.Admin.ViewModels.ManageContent;
5+
using GovUk.Education.ExploreEducationStatistics.Admin.ViewModels.Public.Data;
56
using GovUk.Education.ExploreEducationStatistics.Common.Extensions;
67
using GovUk.Education.ExploreEducationStatistics.Common.Mappings;
78
using GovUk.Education.ExploreEducationStatistics.Common.ViewModels;
89
using GovUk.Education.ExploreEducationStatistics.Content.Model;
910
using GovUk.Education.ExploreEducationStatistics.Content.ViewModels;
11+
using GovUk.Education.ExploreEducationStatistics.Public.Data.Model;
1012
using GovUk.Education.ExploreEducationStatistics.Publisher.Model;
1113
using System;
1214
using System.Collections.Generic;
@@ -211,6 +213,14 @@ public MappingProfiles()
211213
methodologyVersion.Notes.OrderByDescending(note => note.DisplayDate)));
212214

213215
CreateMap<ReleaseVersion, ReleasePublicationStatusViewModel>();
216+
217+
CreateMap<DataSetVersion, DataSetVersionInfoViewModel>()
218+
.ForMember(dest => dest.Version,
219+
m => m.MapFrom(dataSetVersion =>
220+
dataSetVersion.PublicVersion))
221+
.ForMember(dest => dest.Type,
222+
m => m.MapFrom(dataSetVersion =>
223+
dataSetVersion.VersionType));
214224
}
215225

216226
private void CreateContentBlockMap()

src/GovUk.Education.ExploreEducationStatistics.Admin/Services/Interfaces/Public.Data/IDataSetVersionService.cs

+6-2
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,19 @@ Task<Either<ActionResult, PaginatedListViewModel<DataSetLiveVersionSummaryViewMo
2323
int pageSize,
2424
CancellationToken cancellationToken = default);
2525

26-
Task<List<DataSetVersionStatusSummary>> GetStatusesForReleaseVersion(
27-
Guid releaseVersionId,
26+
Task<Either<ActionResult, DataSetVersionInfoViewModel>> GetDataSetVersion(
27+
Guid dataSetVersionId,
2828
CancellationToken cancellationToken = default);
2929

3030
Task<Either<ActionResult, DataSetVersion>> GetDataSetVersion(
3131
Guid dataSetId,
3232
SemVersion version,
3333
CancellationToken cancellationToken = default);
3434

35+
Task<List<DataSetVersionStatusSummary>> GetStatusesForReleaseVersion(
36+
Guid releaseVersionId,
37+
CancellationToken cancellationToken = default);
38+
3539
Task<Either<ActionResult, Unit>> DeleteVersion(
3640
Guid dataSetVersionId,
3741
CancellationToken cancellationToken = default);

src/GovUk.Education.ExploreEducationStatistics.Admin/Services/Public.Data/DataSetVersionService.cs

+30-17
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Net.Http;
66
using System.Threading;
77
using System.Threading.Tasks;
8+
using AutoMapper;
89
using GovUk.Education.ExploreEducationStatistics.Admin.Requests.Public.Data;
910
using GovUk.Education.ExploreEducationStatistics.Admin.Services.Interfaces.Public.Data;
1011
using GovUk.Education.ExploreEducationStatistics.Admin.Services.Interfaces.Security;
@@ -32,7 +33,8 @@ public class DataSetVersionService(
3233
PublicDataDbContext publicDataDbContext,
3334
IProcessorClient processorClient,
3435
IPublicDataApiClient publicDataApiClient,
35-
IUserService userService)
36+
IUserService userService,
37+
IMapper mapper)
3638
: IDataSetVersionService
3739
{
3840
public async Task<Either<ActionResult, PaginatedListViewModel<DataSetLiveVersionSummaryViewModel>>>
@@ -73,6 +75,31 @@ public async Task<Either<ActionResult, PaginatedListViewModel<DataSetLiveVersion
7375
});
7476
}
7577

78+
public async Task<Either<ActionResult, DataSetVersionInfoViewModel>> GetDataSetVersion(
79+
Guid dataSetVersionId,
80+
CancellationToken cancellationToken = default)
81+
{
82+
return await userService.CheckIsBauUser()
83+
.OnSuccess(async () => await GetVersion(
84+
dataSetVersionId: dataSetVersionId,
85+
cancellationToken: cancellationToken))
86+
.OnSuccess(mapper.Map<DataSetVersionInfoViewModel>);
87+
}
88+
89+
public async Task<Either<ActionResult, DataSetVersion>> GetDataSetVersion(
90+
Guid dataSetId,
91+
SemVersion version,
92+
CancellationToken cancellationToken = default)
93+
{
94+
return await publicDataDbContext.DataSetVersions
95+
.AsNoTracking()
96+
.Include(dsv => dsv.DataSet)
97+
.Where(dsv => dsv.DataSetId == dataSetId)
98+
.Where(dsv => dsv.VersionMajor == version.Major)
99+
.Where(dsv => dsv.VersionMinor == version.Minor)
100+
.SingleOrNotFoundAsync(cancellationToken);
101+
}
102+
76103
public async Task<List<DataSetVersionStatusSummary>> GetStatusesForReleaseVersion(
77104
Guid releaseVersionId,
78105
CancellationToken cancellationToken = default)
@@ -129,20 +156,6 @@ public async Task<Either<ActionResult, DataSetVersionSummaryViewModel>> Complete
129156
.OnSuccess(async dataSetVersion => await MapDraftVersionSummary(dataSetVersion, cancellationToken));
130157
}
131158

132-
public async Task<Either<ActionResult, DataSetVersion>> GetDataSetVersion(
133-
Guid dataSetId,
134-
SemVersion version,
135-
CancellationToken cancellationToken = default)
136-
{
137-
return await publicDataDbContext.DataSetVersions
138-
.AsNoTracking()
139-
.Include(dsv => dsv.DataSet)
140-
.Where(dsv => dsv.DataSetId == dataSetId)
141-
.Where(dsv => dsv.VersionMajor == version.Major)
142-
.Where(dsv => dsv.VersionMinor == version.Minor)
143-
.SingleOrNotFoundAsync(cancellationToken);
144-
}
145-
146159
public async Task<Either<ActionResult, Unit>> DeleteVersion(
147160
Guid dataSetVersionId,
148161
CancellationToken cancellationToken = default)
@@ -175,7 +188,7 @@ public async Task<Either<ActionResult, DataSetDraftVersionViewModel>> UpdateVers
175188
CancellationToken cancellationToken = default)
176189
{
177190
return await userService.CheckIsBauUser()
178-
.OnSuccess(async () => await GetDataSetVersion(
191+
.OnSuccess(async () => await GetVersion(
179192
dataSetVersionId: dataSetVersionId,
180193
cancellationToken: cancellationToken))
181194
.OnSuccessDo(dataSetVersion => CheckCanUpdateVersion(dataSetVersion, updateRequest))
@@ -267,7 +280,7 @@ private async Task<DataSetVersionSummaryViewModel> MapDraftVersionSummary(
267280
};
268281
}
269282

270-
private async Task<Either<ActionResult, DataSetVersion>> GetDataSetVersion(
283+
private async Task<Either<ActionResult, DataSetVersion>> GetVersion(
271284
Guid dataSetVersionId,
272285
CancellationToken cancellationToken)
273286
{

src/GovUk.Education.ExploreEducationStatistics.Admin/Startup.cs

+10-3
Original file line numberDiff line numberDiff line change
@@ -872,11 +872,11 @@ public Task<Either<ActionResult, PaginatedListViewModel<DataSetLiveVersionSummar
872872
return Task.FromResult(PaginatedListViewModel<DataSetLiveVersionSummaryViewModel>.Paginate([], 1, 10));
873873
}
874874

875-
public Task<List<DataSetVersionStatusSummary>> GetStatusesForReleaseVersion(
876-
Guid releaseVersionId,
875+
public Task<Either<ActionResult, DataSetVersionInfoViewModel>> GetDataSetVersion(
876+
Guid dataSetVersionIdId,
877877
CancellationToken cancellationToken = default)
878878
{
879-
return Task.FromResult(new List<DataSetVersionStatusSummary>());
879+
return Task.FromResult(new Either<ActionResult, DataSetVersionInfoViewModel>(new NotFoundResult()));
880880
}
881881

882882
public Task<Either<ActionResult, DataSetVersion>> GetDataSetVersion(
@@ -887,6 +887,13 @@ public Task<Either<ActionResult, DataSetVersion>> GetDataSetVersion(
887887
return Task.FromResult(new Either<ActionResult, DataSetVersion>(new NotFoundResult()));
888888
}
889889

890+
public Task<List<DataSetVersionStatusSummary>> GetStatusesForReleaseVersion(
891+
Guid releaseVersionId,
892+
CancellationToken cancellationToken = default)
893+
{
894+
return Task.FromResult(new List<DataSetVersionStatusSummary>());
895+
}
896+
890897
public Task<Either<ActionResult, DataSetVersionSummaryViewModel>> CreateNextVersion(
891898
Guid releaseFileId,
892899
Guid dataSetId,

src/GovUk.Education.ExploreEducationStatistics.Admin/ViewModels/Public.Data/DataSetVersionViewModels.cs

+15
Original file line numberDiff line numberDiff line change
@@ -85,3 +85,18 @@ public record MappingStatusViewModel
8585

8686
public required bool FiltersComplete { get; init; }
8787
}
88+
89+
public record DataSetVersionInfoViewModel
90+
{
91+
public required Guid Id { get; init; }
92+
93+
public required string Version { get; init; }
94+
95+
[JsonConverter(typeof(StringEnumConverter))]
96+
public required DataSetVersionStatus Status { get; init; }
97+
98+
[JsonConverter(typeof(StringEnumConverter))]
99+
public required DataSetVersionType Type { get; init; }
100+
101+
public required string Notes { get; init; }
102+
}

src/explore-education-statistics-admin/src/pages/release/data/ReleaseApiDataSetChangelogPage.tsx

+16-6
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ import { useQuery } from '@tanstack/react-query';
2020
import { generatePath, useParams } from 'react-router-dom';
2121
import React, { useEffect } from 'react';
2222
import WarningMessage from '@common/components/WarningMessage';
23+
import { DataSetVersionStatus } from '@admin/services/apiDataSetService';
24+
25+
const dataSetVersionIsDraft = (dataSetVersionStatus: DataSetVersionStatus) =>
26+
dataSetVersionStatus === 'Draft';
2327

2428
export default function ReleaseApiDataSetChangelogPage() {
2529
const { dataSetId, dataSetVersionId, releaseVersionId, publicationId } =
@@ -31,18 +35,20 @@ export default function ReleaseApiDataSetChangelogPage() {
3135
refetch: refetchDataSet,
3236
} = useQuery(apiDataSetQueries.get(dataSetId));
3337

38+
const { data: dataSetVersion, isLoading: isLoadingDataSetVersion } = useQuery(
39+
apiDataSetVersionQueries.getVersion(dataSetVersionId),
40+
);
41+
3442
const { data: changes, isLoading: isLoadingChanges } = useQuery(
3543
apiDataSetVersionQueries.getChanges(dataSetVersionId),
3644
);
3745

38-
const isDraft = dataSet?.draftVersion?.id === dataSetVersionId;
46+
const isDraft = dataSetVersion
47+
? dataSetVersionIsDraft(dataSetVersion.status)
48+
: false;
3949

4050
const [showForm, toggleShowForm] = useToggle(false);
4151

42-
const dataSetVersion = isDraft
43-
? dataSet?.draftVersion
44-
: dataSet?.latestLiveVersion;
45-
4652
useEffect(() => {
4753
if (isDraft && !dataSetVersion?.notes) {
4854
toggleShowForm.on();
@@ -76,7 +82,11 @@ export default function ReleaseApiDataSetChangelogPage() {
7682
Back to API data set details
7783
</Link>
7884

79-
<LoadingSpinner loading={isLoadingDataSet || isLoadingChanges}>
85+
<LoadingSpinner
86+
loading={
87+
isLoadingDataSet || isLoadingDataSetVersion || isLoadingChanges
88+
}
89+
>
8090
{dataSet && dataSetVersion ? (
8191
<>
8292
<div className="govuk-grid-row">

0 commit comments

Comments
 (0)