Skip to content

Commit 85cef30

Browse files
authored
Merge pull request #1487 from bcgov/stories/ecer-5513
Stories/ecer 5513: Portal invitation changes
2 parents 36909e5 + 3ed24ca commit 85cef30

File tree

16 files changed

+99
-62
lines changed

16 files changed

+99
-62
lines changed

src/ECER.Clients.Api/InviteLinks/InviteLinksEndpoints.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public void Register(IEndpointRouteBuilder endpointRouteBuilder)
1515
IMediator messageBus,
1616
CancellationToken ct) =>
1717
{
18-
var referenceLinkResponse = await messageBus.Send(new GenerateInviteLinkCommand(request.portalInvitation, request.inviteType, request.validDays), ct);
18+
var referenceLinkResponse = await messageBus.Send(new GenerateInviteLinkCommand(request.portalInvitation, request.validDays), ct);
1919

2020
return TypedResults.Ok(new GenerateInviteLinkResponse(referenceLinkResponse.PortalInvitation, referenceLinkResponse.VerificationLink));
2121
})
@@ -26,5 +26,5 @@ public void Register(IEndpointRouteBuilder endpointRouteBuilder)
2626
}
2727
}
2828

29-
public record GenerateInviteLinkRequest(Guid portalInvitation, InviteType inviteType, int validDays);
29+
public record GenerateInviteLinkRequest(Guid portalInvitation, int validDays);
3030
public record GenerateInviteLinkResponse(Guid portalInvitation, string inviteLink);

src/ECER.Engines.Transformation/Contract.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ namespace ECER.Engines.Transformation;
55
public abstract record TransformRequest();
66
public abstract record TransformResponse();
77

8-
public record EncryptInviteTokenRequest(Guid PortalInvitation, InviteType InviteType, int ValidDays) : TransformRequest;
8+
public record EncryptInviteTokenRequest(Guid PortalInvitation, int ValidDays) : TransformRequest;
99
public record EncryptInviteTokenResponse(Guid PortalInvitation, string VerificationToken) : TransformResponse;
1010

1111
public record DecryptInviteTokenRequest(string VerificationToken) : TransformRequest;
12-
public record DecryptInviteTokenResponse(Guid PortalInvitation, InviteType InviteType) : TransformResponse;
12+
public record DecryptInviteTokenResponse(Guid PortalInvitation) : TransformResponse;

src/ECER.Engines.Transformation/PortalInvitations/PortalInvitationTransformationEngine.cs

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,10 @@ private async Task<EncryptInviteTokenResponse> EncryptInviteToken(EncryptInviteT
2020
{
2121
await Task.CompletedTask;
2222

23-
var expiryDate = DateTime.UtcNow.AddDays(request.ValidDays); // Example expiry date
23+
var expiryDate = DateTime.UtcNow.AddDays(request.ValidDays);
2424
var protector = dataProtectionProvider.CreateProtector(nameof(PortalInvitationTransformationEngine)).ToTimeLimitedDataProtector();
2525

26-
// Combine referenceType and portalInvitation into a single string
27-
var combinedData = $"{request.InviteType}:{request.PortalInvitation}";
28-
var encryptedData = protector.Protect(combinedData, expiryDate);
26+
var encryptedData = protector.Protect(request.PortalInvitation.ToString(), expiryDate);
2927

3028
var referenceLink = WebUtility.UrlEncode(encryptedData);
3129
return new EncryptInviteTokenResponse(request.PortalInvitation, referenceLink);
@@ -40,22 +38,8 @@ private async Task<DecryptInviteTokenResponse> DecryptInviteToken(DecryptInviteT
4038
var protector = dataProtectionProvider.CreateProtector(nameof(PortalInvitationTransformationEngine)).ToTimeLimitedDataProtector();
4139
var decryptedData = protector.Unprotect(encryptedData);
4240

43-
// Split the decrypted data back into ReferenceType and PortalInvitation
44-
var splitIndex = decryptedData.IndexOf(':');
45-
if (splitIndex == -1)
46-
{
47-
throw new InvalidOperationException($"Invalid reference link format. decryptedData should be ReferenceType:PortalInvitation => '{decryptedData}'");
48-
}
49-
50-
var referenceTypeString = decryptedData.Substring(0, splitIndex);
51-
var inviteIdString = decryptedData.Substring(splitIndex + 1);
52-
var portalInvitation = Guid.Parse(inviteIdString);
53-
54-
if (!Enum.TryParse<InviteType>(referenceTypeString, out var referenceType))
55-
{
56-
throw new InvalidOperationException($"Invalid reference type.");
57-
}
41+
var portalInvitation = Guid.Parse(decryptedData);
5842

59-
return new DecryptInviteTokenResponse(portalInvitation, referenceType);
43+
return new DecryptInviteTokenResponse(portalInvitation);
6044
}
6145
}

src/ECER.Managers.Admin.Contract/PortalInvitations/Contract.cs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,5 @@
22

33
namespace ECER.Managers.Admin.Contract.PortalInvitations;
44

5-
public record GenerateInviteLinkCommand(Guid PortalInvitation, InviteType InviteType, int ValidDays) : IRequest<GenerateInviteLinkCommandResponse>;
5+
public record GenerateInviteLinkCommand(Guid PortalInvitation, int ValidDays) : IRequest<GenerateInviteLinkCommandResponse>;
66
public record GenerateInviteLinkCommandResponse(Guid PortalInvitation, string VerificationLink);
7-
8-
public enum InviteType
9-
{
10-
CharacterReference,
11-
WorkExperienceReference
12-
}

src/ECER.Managers.Admin/InviteLinkHandlers.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public async Task<GenerateInviteLinkCommandResponse> Handle(GenerateInviteLinkCo
1313
{
1414
ArgumentNullException.ThrowIfNull(request);
1515

16-
var response = await transformationEngine.Transform(new EncryptInviteTokenRequest(request.PortalInvitation, request.InviteType, request.ValidDays))! as EncryptInviteTokenResponse ?? throw new InvalidCastException("Invalid response type");
16+
var response = await transformationEngine.Transform(new EncryptInviteTokenRequest(request.PortalInvitation, request.ValidDays))! as EncryptInviteTokenResponse ?? throw new InvalidCastException("Invalid response type");
1717
string verificationLink = $"{portalAppSettings.Value.BaseUrl}/{portalAppSettings.Value.ReferenceVerificationRoute}/{response.VerificationToken}";
1818
return new GenerateInviteLinkCommandResponse(response.PortalInvitation, verificationLink);
1919
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ public record PortalInvitation(string? Id, string Name, string ReferenceFirstNam
3636
public enum InviteType
3737
{
3838
CharacterReference,
39-
WorkExperienceReference
39+
PSIProgramRepresentative,
40+
WorkExperienceReferenceforApplication,
41+
WorkExperienceReferenceforICRA
4042
}
4143

4244
public enum PortalInvitationStatusCode

src/ECER.Managers.Registry/ApplicationHandlers.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ public async Task<ReferenceSubmissionResult> Handle(SubmitReferenceCommand reque
204204

205205
var transformationResponse = await transformationEngine.Transform(new DecryptInviteTokenRequest(request.Token))! as DecryptInviteTokenResponse ?? throw new InvalidCastException("Invalid response type");
206206
if (transformationResponse.PortalInvitation == Guid.Empty) return ReferenceSubmissionResult.Failure("Invalid Token");
207-
207+
208208
var portalInvitation = await portalInvitationRepository.Query(new PortalInvitationQuery(transformationResponse.PortalInvitation), cancellationToken);
209209
if (portalInvitation.StatusCode != PortalInvitationStatusCode.Sent) return ReferenceSubmissionResult.Failure("Portal Invitation is not valid or expired");
210210

@@ -217,7 +217,7 @@ public async Task<ReferenceSubmissionResult> Handle(SubmitReferenceCommand reque
217217
submitReferenceRequest = mapper.Map<Resources.Documents.Applications.CharacterReferenceSubmissionRequest>(request.CharacterReferenceSubmissionRequest);
218218
break;
219219

220-
case InviteType.WorkExperienceReference:
220+
case InviteType.WorkExperienceReferenceforApplication:
221221
submitReferenceRequest = mapper.Map<Resources.Documents.Applications.WorkExperienceReferenceSubmissionRequest>(request.WorkExperienceReferenceSubmissionRequest);
222222
break;
223223
}

src/ECER.Managers.Registry/PortalInvitationHandlers.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public async Task<PortalInvitationVerificationQueryResult> Handle(PortalInvitati
7070
return PortalInvitationVerificationQueryResult.Failure("Reference has failed.");
7171
}
7272

73-
if (result.InviteType == Contract.PortalInvitations.InviteType.WorkExperienceReference)
73+
if (result.InviteType == Contract.PortalInvitations.InviteType.WorkExperienceReferenceforApplication)
7474
{
7575
var workExRef =
7676
application.WorkExperienceReferences.SingleOrDefault(work =>

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ public async Task<string> SubmitReference(SubmitReferenceRequest request, Cancel
174174
public async Task<string> OptOutReference(OptOutReferenceRequest request, CancellationToken cancellationToken) => request.PortalInvitation!.InviteType switch
175175
{
176176
InviteType.CharacterReference => await OptOutCharacterReference(request),
177-
InviteType.WorkExperienceReference => await OptOutWorkExperienceReference(request),
177+
InviteType.WorkExperienceReferenceforApplication => await OptOutWorkExperienceReference(request),
178178
_ => throw new NotSupportedException($"{request.GetType().Name} is not supported")
179179
};
180180
}

src/ECER.Resources.Documents/PortalInvitations/IPortalInvitationRepository.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ public record PortalInvitation(string? Id, string Name, string ReferenceFirstNam
2323
public enum InviteType
2424
{
2525
CharacterReference,
26-
WorkExperienceReference
26+
PSIProgramRepresentative,
27+
WorkExperienceReferenceforApplication,
28+
WorkExperienceReferenceforICRA
2729
}
2830

2931
public enum PortalInvitationStatusCode

0 commit comments

Comments
 (0)