Skip to content

Commit 8f95d0d

Browse files
committed
Merge remote-tracking branch 'origin/master' into update/dependencies
2 parents 77f344e + ad5ea69 commit 8f95d0d

32 files changed

+3671
-5
lines changed

src/ECER.Clients.RegistryPortal/ECER.Clients.RegistryPortal.Server/Applications/ApplicationsEndpoints.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -520,6 +520,7 @@ public enum ApplicationTypes
520520
New,
521521
Renewal,
522522
LabourMobility,
523+
ICRA
523524
}
524525

525526
public enum EducationOrigin
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
using AutoMapper;
2+
using ECER.Infrastructure.Common;
3+
using ECER.Managers.Registry.Contract.ICRA;
4+
using ECER.Utilities.Hosting;
5+
using ECER.Utilities.Security;
6+
using MediatR;
7+
using Microsoft.AspNetCore.Http.HttpResults;
8+
9+
namespace ECER.Clients.RegistryPortal.Server.ICRA;
10+
11+
public class ICRAEligibilitiesEndpoints : IRegisterEndpoints
12+
{
13+
public void Register(IEndpointRouteBuilder endpointRouteBuilder)
14+
{
15+
endpointRouteBuilder.MapPut("/api/icra/{id?}", async Task<Results<Ok<DraftICRAEligibilityResponse>, BadRequest<string>, NotFound>> (string? id, SaveDraftICRAEligibilityRequest request, HttpContext ctx, CancellationToken ct, IMediator messageBus, IMapper mapper) =>
16+
{
17+
bool IdIsNotGuid = !Guid.TryParse(id, out _); if (IdIsNotGuid && id != null) { id = null; }
18+
bool PayloadIdIsNotGuid = !Guid.TryParse(request.Eligibility.Id, out _); if (PayloadIdIsNotGuid && request.Eligibility.Id != null) { request.Eligibility.Id = null; }
19+
20+
if (request.Eligibility.Id != id) return TypedResults.BadRequest("resource id and payload id do not match");
21+
var userContext = ctx.User.GetUserContext();
22+
var eligibility = mapper.Map<Managers.Registry.Contract.ICRA.ICRAEligibility>(request.Eligibility, opts => opts.Items.Add("ApplicantId", userContext!.UserId))!;
23+
24+
if (id != null)
25+
{
26+
var query = new ICRAEligibilitiesQuery
27+
{
28+
ById = id,
29+
ByApplicantId = userContext!.UserId,
30+
ByStatus = [Managers.Registry.Contract.ICRA.ICRAStatus.Draft]
31+
};
32+
var results = await messageBus.Send(query, ct);
33+
if (!results.Items.Any()) return TypedResults.NotFound();
34+
}
35+
36+
var freshEligibility = await messageBus.Send(new SaveICRAEligibilityCommand(eligibility), ct);
37+
return TypedResults.Ok(new DraftICRAEligibilityResponse(mapper.Map<ICRAEligibility>(freshEligibility)));
38+
})
39+
.WithOpenApi("Save a draft icra eligibility for the current user", string.Empty, "icra_put")
40+
.RequireAuthorization()
41+
.WithParameterValidation();
42+
43+
endpointRouteBuilder.MapGet("/api/icra/{id?}", async (string? id, ICRAStatus[]? byStatus, HttpContext ctx, IMediator messageBus, IMapper mapper, CancellationToken ct) =>
44+
{
45+
var userId = ctx.User.GetUserContext()?.UserId;
46+
47+
bool IdIsNotGuid = !Guid.TryParse(id, out _); if (IdIsNotGuid) { id = null; }
48+
var query = new ICRAEligibilitiesQuery
49+
{
50+
ById = id,
51+
ByApplicantId = userId,
52+
ByStatus = byStatus?.Convert<ICRAStatus, Managers.Registry.Contract.ICRA.ICRAStatus>()
53+
};
54+
var results = await messageBus.Send(query, ct);
55+
return TypedResults.Ok(mapper.Map<IEnumerable<ICRAEligibility>>(results.Items));
56+
})
57+
.WithOpenApi("Handles icra queries", string.Empty, "icra_get")
58+
.RequireAuthorization()
59+
.WithParameterValidation();
60+
}
61+
}
62+
63+
public record SaveDraftICRAEligibilityRequest(ICRAEligibility Eligibility);
64+
65+
public record DraftICRAEligibilityResponse(ICRAEligibility Eligibility);
66+
67+
public record ICRAEligibilityQueryResponse(IEnumerable<ICRAEligibility> Items);
68+
69+
public record ICRAEligibility()
70+
{
71+
public string? Id { get; set; }
72+
public string ApplicantId { get; set; } = string.Empty;
73+
public string? PortalStage { get; set; }
74+
75+
public ICRAStatus Status { get; set; }
76+
}
77+
78+
public enum ICRAStatus
79+
{
80+
Active,
81+
Draft,
82+
Eligible,
83+
Inactive,
84+
Ineligible,
85+
InReview,
86+
ReadyforReview,
87+
Submitted
88+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using AutoMapper;
2+
using System.Diagnostics.Contracts;
3+
4+
namespace ECER.Clients.RegistryPortal.Server.ICRA;
5+
6+
public class ICRAEligibilityMapper : Profile
7+
{
8+
public ICRAEligibilityMapper()
9+
{
10+
CreateMap<ICRAEligibility, Managers.Registry.Contract.ICRA.ICRAEligibility>()
11+
.ReverseMap();
12+
}
13+
}

src/ECER.Managers.Registry.Contract/Applications/Contract.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,8 @@ public enum ApplicationTypes
238238
{
239239
New,
240240
Renewal,
241-
LabourMobility
241+
LabourMobility,
242+
ICRA
242243
}
243244

244245
public enum EducationOrigin
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
using MediatR;
2+
3+
namespace ECER.Managers.Registry.Contract.ICRA;
4+
5+
public record SaveICRAEligibilityCommand(ICRAEligibility eligibility) : IRequest<Contract.ICRA.ICRAEligibility?>;
6+
7+
public record ICRAEligibilitiesQuery : IRequest<ICRAEligibilitiesQueryResults>
8+
{
9+
public string? ById { get; set; }
10+
public string? ByApplicantId { get; set; }
11+
public string? PortalStage { get; set; }
12+
public IEnumerable<ICRAStatus>? ByStatus { get; set; }
13+
}
14+
15+
public record ICRAEligibilitiesQueryResults(IEnumerable<ICRAEligibility> Items);
16+
17+
public record ICRAEligibility()
18+
{
19+
public string? Id { get; set; }
20+
public string? PortalStage { get; set; }
21+
public string ApplicantId { get; set; } = string.Empty;
22+
public ICRAStatus Status { get; set; }
23+
}
24+
25+
public enum ICRAStatus
26+
{
27+
Active,
28+
Draft,
29+
Eligible,
30+
Inactive,
31+
Ineligible,
32+
InReview,
33+
ReadyforReview,
34+
Submitted
35+
}

src/ECER.Managers.Registry/Configurer.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public void Configure([NotNull] ConfigurationContext configurationContext)
1414
{
1515
configurationContext.Services.AddTransient<ApplicationHandlers>();
1616
configurationContext.Services.AddTransient<CommunicationHandlers>();
17+
configurationContext.Services.AddTransient<ICRAEligibilityHandlers>();
1718
configurationContext.Services.AddTransient<RegistrantHandlers>();
1819
configurationContext.Services.AddTransient<PortalInvitationHandlers>();
1920
configurationContext.Services.AddTransient<RecaptchaHandlers>();
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
using AutoMapper;
2+
using ECER.Infrastructure.Common;
3+
using ECER.Managers.Registry.Contract.ICRA;
4+
using ECER.Resources.Documents.ICRA;
5+
using MediatR;
6+
7+
8+
namespace ECER.Managers.Registry;
9+
10+
/// <summary>
11+
/// Message handlers
12+
/// </summary>
13+
public class ICRAEligibilityHandlers(
14+
IICRARepository iCRARepository,
15+
IMapper mapper)
16+
: IRequestHandler<SaveICRAEligibilityCommand, Contract.ICRA.ICRAEligibility?>,
17+
IRequestHandler<ICRAEligibilitiesQuery, ICRAEligibilitiesQueryResults>
18+
{
19+
20+
public async Task<Contract.ICRA.ICRAEligibility?> Handle(SaveICRAEligibilityCommand request, CancellationToken cancellationToken)
21+
{
22+
ArgumentNullException.ThrowIfNull(request);
23+
24+
var iCRAEligibilityId = await iCRARepository.Save(mapper.Map<Resources.Documents.ICRA.ICRAEligibility>(request.eligibility)!, cancellationToken);
25+
26+
var freshIcraEligibilities = await iCRARepository.Query(new ICRAQuery
27+
{
28+
ById = iCRAEligibilityId,
29+
}, cancellationToken);
30+
31+
return mapper.Map<Contract.ICRA.ICRAEligibility>(freshIcraEligibilities.SingleOrDefault())!;
32+
}
33+
34+
35+
public async Task<ICRAEligibilitiesQueryResults> Handle(ICRAEligibilitiesQuery request, CancellationToken cancellationToken)
36+
{
37+
ArgumentNullException.ThrowIfNull(request);
38+
39+
var eligibilities = await iCRARepository.Query(new ICRAQuery
40+
{
41+
ById = request.ById,
42+
ByApplicantId = request.ByApplicantId,
43+
ByStatus = request.ByStatus?.Convert<Contract.ICRA.ICRAStatus, Resources.Documents.ICRA.ICRAStatus>(),
44+
}, cancellationToken);
45+
return new ICRAEligibilitiesQueryResults(mapper.Map<IEnumerable<Contract.ICRA.ICRAEligibility>>(eligibilities)!);
46+
}
47+
48+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using AutoMapper;
2+
using ECER.Resources.Documents.ICRA;
3+
4+
namespace ECER.Managers.Registry;
5+
6+
internal class ICRAEligibilityMapper : Profile
7+
{
8+
public ICRAEligibilityMapper()
9+
{
10+
CreateMap<Contract.ICRA.ICRAEligibility, ICRAEligibility>().ReverseMap();
11+
}
12+
}

src/ECER.Resources.Documents/Applications/IApplicationRepository.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,8 @@ public enum ApplicationTypes
173173
{
174174
New,
175175
Renewal,
176-
LabourMobility
176+
LabourMobility,
177+
ICRA
177178
}
178179

179180
public enum EducationOrigin

src/ECER.Resources.Documents/Configurer.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,6 @@ public void Configure([NotNull] ConfigurationContext configurationContext)
1616
configurationContext.Services.AddTransient<IApplicationRepository, ApplicationRepository>();
1717
configurationContext.Services.AddTransient<IPortalInvitationRepository, PortalInvitationRepository>();
1818
configurationContext.Services.AddTransient<IMetadataResourceRepository, MetadataResourceRepository>();
19+
configurationContext.Services.AddTransient<ICRA.IICRARepository, ICRA.ICRARepository>();
1920
}
2021
}

0 commit comments

Comments
 (0)