Skip to content

Commit

Permalink
Merge pull request #128 from DFE-Digital/feature/project-tasks
Browse files Browse the repository at this point in the history
SPIKE for configuring project tasks
Needs team discussion about how well this works
The tasks have been made up to test the limits, they are not part of the requirements
  • Loading branch information
mikestock-nimble authored Sep 1, 2023
2 parents 3213939 + 169f0d9 commit 7712165
Show file tree
Hide file tree
Showing 51 changed files with 25,033 additions and 77 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
namespace Dfe.ManageFreeSchoolProjects.API.Contracts.Project.Tasks
{
public record ConstructionTask
{
public string NameOfSite { get; set; }
public string AddressOfSite { get; set; }
public string PostcodeOfSite { get; set; }
public string BuildingType { get; set; }
public string TrustRef { get; set; }
public string TrustLeadSponsor { get; set; }
public string TrustName { get; set; }
public string SiteMinArea { get; set; }
public string TypeofWorksLocation { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
namespace Dfe.ManageFreeSchoolProjects.API.Contracts.Project.Tasks
{

public record DatesTask
{
public string DateOfEntryIntoPreopening { get; set; }
public string RealisticYearOfOpening { get; set; }
public string ProvisionalOpeningDateAgreedWithTrust { get; set; }
public string ActualOpeningDate { get; set; }
public string OpeningAcademicYear { get; set; }
public string StartOfTermDate { get; set; }
public string ProvisionalKickoffMeetingDate { get; set; }
public string ActualKickOffMeetingDate { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace Dfe.ManageFreeSchoolProjects.API.Contracts.Project.Tasks
{
public class GetProjectByTaskResponse
{
public RiskAppraisalTask RiskAppraisal { get; set; }
public DatesTask Dates { get; set; }
public SchoolTask School { get; set; }
public ConstructionTask Construction { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
namespace Dfe.ManageFreeSchoolProjects.API.Contracts.Project.Tasks
{
public class ProjectByTaskSummaryResponse
{
public TaskSummaryResponse School { get; set; }

public TaskSummaryResponse Construction { get; set; }
}

public class TaskSummaryResponse
{
public string Name { get; set; }
public ProjectTaskStatus Status { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
namespace Dfe.ManageFreeSchoolProjects.API.Contracts.Project.Tasks
{
public enum ProjectTaskStatus
{
NotStarted = 1,
InProgress = 2,
Completed = 3
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
namespace Dfe.ManageFreeSchoolProjects.API.Contracts.Project.Tasks
{
public enum ProjectTaskType
{
Unknown = 0,
Dates = 1,
RiskAppraisal = 2
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
namespace Dfe.ManageFreeSchoolProjects.API.Contracts.Project.Tasks
{
public record RiskAppraisalTask
{
public string SharepointLink { get; set; }
public string EducationRiskRating { get; set; }
public string GovernanceRiskRating { get; set; }
public string FinanceRiskRating { get; set; }
public bool MarkedAsComplete { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
namespace Dfe.ManageFreeSchoolProjects.API.Contracts.Project.Tasks
{
public record SchoolTask
{
public string SchoolType { get; set; }
public string SchoolPhase { get; set; }
public string AgeRange { get; set; }
public string Nursery { get; set; }
public string SixthForm { get; set; }
public string CompanyName { get; set; }
public string NumberOfCompanyMembers { get; set; }
public string ProposedChairOfTrustees { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace Dfe.ManageFreeSchoolProjects.API.Contracts.Project.Tasks
{
public class UpdateProjectByTaskRequest
{
public RiskAppraisalTask RiskAppraisal { get; set; }
public DatesTask Dates { get; set; }
public SchoolTask School { get; set; }
public ConstructionTask Construction { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
using Dfe.ManageFreeSchoolProjects.API.Contracts.Project.Tasks;
using Dfe.ManageFreeSchoolProjects.API.Contracts.ResponseModels;
using Dfe.ManageFreeSchoolProjects.API.Tests.Fixtures;
using Dfe.ManageFreeSchoolProjects.API.Tests.Helpers;
using System.Net;
using System.Net.Http.Json;
using System.Threading.Tasks;

namespace Dfe.ManageFreeSchoolProjects.API.Tests.Integration
{
[Collection(ApiTestCollection.ApiTestCollectionName)]
public class GetProjectTaskSummaryApiTests : ApiTestsBase
{
public GetProjectTaskSummaryApiTests(ApiTestFixture apiTestFixture) : base(apiTestFixture)
{
}

[Fact]
public async Task GetProjectTaskList_Returns_200()
{
using var context = _testFixture.GetContext();
var project = DatabaseModelBuilder.BuildProject();

context.Kpi.Add(project);
await context.SaveChangesAsync();

var taskListResponse = await _client.GetAsync($"/api/v1/client/projects/{project.ProjectStatusProjectId}/tasks/summary");
taskListResponse.StatusCode.Should().Be(HttpStatusCode.OK);

var content = await taskListResponse.Content.ReadFromJsonAsync<ApiSingleResponseV2<ProjectByTaskSummaryResponse>>();

var result = content.Data;

result.School.Name.Should().Be("School");
result.School.Status.Should().Be(ProjectTaskStatus.NotStarted);
result.Construction.Name.Should().Be("Construction");
result.Construction.Status.Should().Be(ProjectTaskStatus.InProgress);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public async Task When_CreateProject_Returns_NewProjectFields_201()
request.ApplicationNumber = request.ApplicationNumber.Substring(0, 9);
request.ProjectId = request.ProjectId.Substring(0, 24);

var result = await _client.PostAsync($"/api/v1/client/project/create/individual", request.ConvertToJson());
var result = await _client.PostAsync($"/api/v1/client/projects/create/individual", request.ConvertToJson());

result.StatusCode.Should().Be(HttpStatusCode.Created);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public async Task When_Get_AllFieldsSet_Returns_200()
context.Kpi.Add(project);
await context.SaveChangesAsync();

var overviewResponse = await _client.GetAsync($"/api/v1/client/project/overview/{project.ProjectStatusProjectId}");
var overviewResponse = await _client.GetAsync($"/api/v1/client/projects/{project.ProjectStatusProjectId}/overview");
overviewResponse.StatusCode.Should().Be(HttpStatusCode.OK);

var result = await overviewResponse.Content.ReadFromJsonAsync<ApiSingleResponseV2<ProjectOverviewResponse>>();
Expand Down Expand Up @@ -76,7 +76,7 @@ public async Task When_Get_MandatoryFieldsSet_Returns_200()
context.Kpi.Add(project);
await context.SaveChangesAsync();

var overviewResponse = await _client.GetAsync($"/api/v1/client/project/overview/{project.ProjectStatusProjectId}");
var overviewResponse = await _client.GetAsync($"/api/v1/client/projects/{project.ProjectStatusProjectId}/overview");
overviewResponse.StatusCode.Should().Be(HttpStatusCode.OK);

var result = await overviewResponse.Content.ReadFromJsonAsync<ApiSingleResponseV2<ProjectOverviewResponse>>();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
using Dfe.ManageFreeSchoolProjects.API.Contracts.Project.Tasks;
using Dfe.ManageFreeSchoolProjects.API.Contracts.ResponseModels;
using Dfe.ManageFreeSchoolProjects.API.Tests.Fixtures;
using Dfe.ManageFreeSchoolProjects.API.Tests.Helpers;
using System.Net;
using System.Net.Http.Json;
using System.Threading.Tasks;

namespace Dfe.ManageFreeSchoolProjects.API.Tests.Integration
{
[Collection(ApiTestCollection.ApiTestCollectionName)]
public class UpdateProjectTaskApiTests : ApiTestsBase
{
public UpdateProjectTaskApiTests(ApiTestFixture apiTestFixture) : base(apiTestFixture)
{
}

[Fact]
public async Task Patch_SchoolTask_Returns_201()
{
var project = DatabaseModelBuilder.BuildProject();
var projectId = project.ProjectStatusProjectId;

using var context = _testFixture.GetContext();
context.Kpi.Add(project);
await context.SaveChangesAsync();

var request = new UpdateProjectByTaskRequest()
{
School = new SchoolTask()
{
SchoolType = "Secondary",
AgeRange = "11-18",
SchoolPhase = "Opening",
Nursery = "Yes",
SixthForm = "Yes",
CompanyName = "School Builders Ltd",
NumberOfCompanyMembers = "100",
ProposedChairOfTrustees = "Lemon Group Ltd"
}
};

var projectResponse = await UpdateProjectTask(projectId, request);

projectResponse.School.SchoolType.Should().Be("Secondary");
projectResponse.School.SchoolPhase.Should().Be("Opening");
projectResponse.School.AgeRange.Should().Be("11-18");
projectResponse.School.Nursery.Should().Be("Yes");
projectResponse.School.SixthForm.Should().Be("Yes");
projectResponse.School.CompanyName.Should().Be("School Builders Ltd");
projectResponse.School.NumberOfCompanyMembers.Should().Be("100");
projectResponse.School.ProposedChairOfTrustees.Should().Be("Lemon Group Ltd");
}

[Fact]
public async Task Patch_ConstructionTask_Returns_201()
{
var project = DatabaseModelBuilder.BuildProject();
var projectId = project.ProjectStatusProjectId;

using var context = _testFixture.GetContext();
context.Kpi.Add(project);
await context.SaveChangesAsync();

var request = new UpdateProjectByTaskRequest()
{
Construction = new ConstructionTask()
{
NameOfSite = "Lemon Site",
AddressOfSite = "Fruitpickers Lane",
PostcodeOfSite = "LF124YH",
BuildingType = "Brick",
TrustRef = "1234ABC",
TrustLeadSponsor = "Aviva",
TrustName = "Education First",
SiteMinArea = "10000",
TypeofWorksLocation = "Building site"
}
};

var projectResponse = await UpdateProjectTask(projectId, request);

projectResponse.Construction.NameOfSite.Should().Be("Lemon Site");
projectResponse.Construction.AddressOfSite.Should().Be("Fruitpickers Lane");
projectResponse.Construction.PostcodeOfSite.Should().Be("LF124YH");
projectResponse.Construction.BuildingType.Should().Be("Brick");
projectResponse.Construction.TrustRef.Should().Be("1234ABC");
projectResponse.Construction.TrustLeadSponsor.Should().Be("Aviva");
projectResponse.Construction.TrustName.Should().Be("Education First");
projectResponse.Construction.SiteMinArea.Should().Be("10000");
projectResponse.Construction.TypeofWorksLocation.Should().Be("Building site");
}

[Fact]
public async Task Patch_Task_NoProjectExists_Returns_404()
{
var request = new UpdateProjectByTaskRequest()
{
};

var updateTaskResponse = await _client.PatchAsync($"/api/v1/client/projects/NotExist/tasks", request.ConvertToJson());
updateTaskResponse.StatusCode.Should().Be(HttpStatusCode.NotFound);
}

private async Task<GetProjectByTaskResponse> UpdateProjectTask(string projectId, UpdateProjectByTaskRequest request)
{
var updateTaskResponse = await _client.PatchAsync($"/api/v1/client/projects/{projectId}/tasks", request.ConvertToJson());
updateTaskResponse.StatusCode.Should().Be(HttpStatusCode.OK);

var getProjectByTaskResponse = await _client.GetAsync($"/api/v1/client/projects/{projectId}/tasks");
getProjectByTaskResponse.StatusCode.Should().Be(HttpStatusCode.OK);

var result = await getProjectByTaskResponse.Content.ReadFromJsonAsync<ApiSingleResponseV2<GetProjectByTaskResponse>>();

return result.Data;
}
}
}
Original file line number Diff line number Diff line change
@@ -1,28 +1,22 @@
using Azure;
using Dfe.ManageFreeSchoolProjects.API.Contracts.Dashboard;
using Dfe.ManageFreeSchoolProjects.API.Contracts.Project;
using Dfe.ManageFreeSchoolProjects.API.Contracts.RequestModels.Projects;
using Dfe.ManageFreeSchoolProjects.API.Contracts.ResponseModels.Project;
using Dfe.ManageFreeSchoolProjects.API.Contracts.ResponseModels;
using Dfe.ManageFreeSchoolProjects.API.Contracts.RequestModels.Projects;
using Dfe.ManageFreeSchoolProjects.API.UseCases.Project;
using Dfe.ManageFreeSchoolProjects.Logging;
using Microsoft.AspNetCore.Mvc;
namespace Dfe.ManageFreeSchoolProjects.API.Controllers
{
[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/client/project")]
[Route("api/v{version:apiVersion}/client/projects")]
[ApiController]
public class ProjectController : ControllerBase
{

private readonly ICreateProjectService _createProject;
private readonly ICreateProjectService _createProjectService;
private readonly ILogger<ProjectController> _logger;

public ProjectController(
ICreateProjectService createProject,
ILogger<ProjectController> logger)
{
_createProject = createProject;
_createProjectService = createProject;
_logger = logger;
}

Expand All @@ -32,14 +26,13 @@ public ActionResult CreateProject(CreateProjectRequest createProjectRequest)
{
_logger.LogMethodEntered();

_createProject.Execute(createProjectRequest);
_createProjectService.Execute(createProjectRequest);

return new ObjectResult(null)
{
StatusCode = StatusCodes.Status201Created
};
}

}
}

Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
namespace Dfe.ManageFreeSchoolProjects.API.Controllers
{
[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/client/project/overview")]
[Route("api/v{version:apiVersion}/client/projects/{projectId}/overview")]
[ApiController]
public class ProjectOverviewController : ControllerBase
{
Expand All @@ -23,20 +23,12 @@ public ProjectOverviewController(
}

[HttpGet]
[Route("{projectId}")]
public async Task<ActionResult<ApiSingleResponseV2<ProjectOverviewResponse>>> GetProjectOverview(string projectId)
{
_logger.LogMethodEntered();

var overview = await _getProjectOverviewService.Execute(projectId);

if (overview == null)
{
_logger.LogInformation("No project overview found for {projectId}", projectId);

return new NotFoundResult();
}

_logger.LogInformation("Returning overview for project {projectId}", projectId);

var result = new ApiSingleResponseV2<ProjectOverviewResponse>(overview);
Expand Down
Loading

0 comments on commit 7712165

Please sign in to comment.