Skip to content

Commit bed596b

Browse files
Merge pull request #69 from GarageGroup/custom-clasim-provider-fix
Fix the non-retryable error when provide custom claims
2 parents 84fc101 + 2417332 commit bed596b

File tree

7 files changed

+53
-17
lines changed

7 files changed

+53
-17
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
1+
using System;
2+
13
namespace GarageGroup.Internal.Timesheet;
24

35
public sealed record class AuthenticationContext
46
{
7+
public Guid CorrelationId { get; init; }
8+
59
public User? User { get; init; }
610
}

src/endpoint/Claims.Provide/Contract/Claims.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,7 @@ namespace GarageGroup.Internal.Timesheet;
44

55
public sealed record class Claims
66
{
7+
public required Guid CorrelationId { get; init; }
8+
79
public required Guid SystemUserId { get; init; }
810
}
Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
1+
using GarageGroup.Infra;
2+
13
namespace GarageGroup.Internal.Timesheet;
24

35
public enum ClaimsProvideFailureCode
46
{
57
Unknown,
6-
InvalidQuery
8+
9+
InvalidQuery,
10+
11+
[Problem(FailureStatusCode.NotFound, "System user was not found")]
12+
UserNotFound
713
}

src/endpoint/Claims.Provide/Endpoint/Func/ClaimsProvideFunc.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,11 @@ namespace GarageGroup.Internal.Timesheet;
44

55
internal sealed partial class ClaimsProvideFunc(IDataverseEntityGetSupplier dataverseApi) : IClaimsProvideFunc
66
{
7+
private static ClaimsProvideFailureCode MapFailureCodeWhenSearchingForUser(DataverseFailureCode failureCode)
8+
=>
9+
failureCode switch
10+
{
11+
DataverseFailureCode.RecordNotFound => ClaimsProvideFailureCode.UserNotFound,
12+
_ => ClaimsProvideFailureCode.Unknown
13+
};
714
}

src/endpoint/Claims.Provide/Endpoint/Func/Func.Invoke.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Threading;
33
using System.Threading.Tasks;
4+
using GarageGroup.Infra;
45
using GarageGroup.Internal.Timesheet.Inner;
56

67
namespace GarageGroup.Internal.Timesheet;
@@ -18,9 +19,9 @@ public ValueTask<Result<ClaimsProvideOut, Failure<ClaimsProvideFailureCode>>> In
1819
UserJson.BuildGetInput)
1920
.ForwardValue(
2021
dataverseApi.GetEntityAsync<UserJson>,
21-
static failure => failure.WithFailureCode(ClaimsProvideFailureCode.Unknown))
22+
static failure => failure.MapFailureCode(MapFailureCodeWhenSearchingForUser))
2223
.MapSuccess(
23-
static systemUser => new ClaimsProvideOut
24+
systemUser => new ClaimsProvideOut
2425
{
2526
Data = new AuthenticationEventResponseData
2627
{
@@ -30,6 +31,7 @@ public ValueTask<Result<ClaimsProvideOut, Failure<ClaimsProvideFailureCode>>> In
3031
{
3132
Claims = new Claims
3233
{
34+
CorrelationId = input.Data?.AuthenticationContext?.CorrelationId ?? default,
3335
SystemUserId = systemUser.Value.Id
3436
}
3537
}

src/endpoint/Claims.Provide/Test/Func.Test/ClaimsProvideFuncTest.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ private static readonly ClaimsProvideIn SomeInput
1414
{
1515
AuthenticationContext = new()
1616
{
17+
CorrelationId = Guid.Parse("1282002b-6a8b-418f-b481-67844abb0cc5"),
1718
User = new()
1819
{
1920
Id = Guid.Parse("5b228f06-d220-4006-844a-374df853108d")

src/endpoint/Claims.Provide/Test/Func.Test/Test.InvokeAsync.cs

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -57,19 +57,19 @@ public static async Task InvokeAsync_InputIsValid_ExpectGetUserCalledOnce()
5757
}
5858

5959
[Theory]
60-
[InlineData(DataverseFailureCode.Unknown)]
61-
[InlineData(DataverseFailureCode.Unauthorized)]
62-
[InlineData(DataverseFailureCode.RecordNotFound)]
63-
[InlineData(DataverseFailureCode.PicklistValueOutOfRange)]
64-
[InlineData(DataverseFailureCode.UserNotEnabled)]
65-
[InlineData(DataverseFailureCode.PrivilegeDenied)]
66-
[InlineData(DataverseFailureCode.Throttling)]
67-
[InlineData(DataverseFailureCode.SearchableEntityNotFound)]
68-
[InlineData(DataverseFailureCode.DuplicateRecord)]
69-
[InlineData(DataverseFailureCode.InvalidPayload)]
70-
[InlineData(DataverseFailureCode.InvalidFileSize)]
60+
[InlineData(DataverseFailureCode.Unknown, ClaimsProvideFailureCode.Unknown)]
61+
[InlineData(DataverseFailureCode.Unauthorized, ClaimsProvideFailureCode.Unknown)]
62+
[InlineData(DataverseFailureCode.RecordNotFound, ClaimsProvideFailureCode.UserNotFound)]
63+
[InlineData(DataverseFailureCode.PicklistValueOutOfRange, ClaimsProvideFailureCode.Unknown)]
64+
[InlineData(DataverseFailureCode.UserNotEnabled, ClaimsProvideFailureCode.Unknown)]
65+
[InlineData(DataverseFailureCode.PrivilegeDenied, ClaimsProvideFailureCode.Unknown)]
66+
[InlineData(DataverseFailureCode.Throttling, ClaimsProvideFailureCode.Unknown)]
67+
[InlineData(DataverseFailureCode.SearchableEntityNotFound, ClaimsProvideFailureCode.Unknown)]
68+
[InlineData(DataverseFailureCode.DuplicateRecord, ClaimsProvideFailureCode.Unknown)]
69+
[InlineData(DataverseFailureCode.InvalidPayload, ClaimsProvideFailureCode.Unknown)]
70+
[InlineData(DataverseFailureCode.InvalidFileSize, ClaimsProvideFailureCode.Unknown)]
7171
public static async Task InvokeAsync_GetUserResultIsFailure_ExpectUnknownFailure(
72-
DataverseFailureCode sourceFailureCode)
72+
DataverseFailureCode sourceFailureCode, ClaimsProvideFailureCode expectedFailureCode)
7373
{
7474
var sourceException = new Exception("Some exception message");
7575
var dataverseFailure = sourceException.ToFailure(sourceFailureCode, "Some failure text");
@@ -80,7 +80,7 @@ public static async Task InvokeAsync_GetUserResultIsFailure_ExpectUnknownFailure
8080
var cancellationToken = CancellationToken.None;
8181

8282
var actual = await func.InvokeAsync(SomeInput, cancellationToken);
83-
var expected = Failure.Create(ClaimsProvideFailureCode.Unknown, "Some failure text", sourceException);
83+
var expected = Failure.Create(expectedFailureCode, "Some failure text", sourceException);
8484

8585
Assert.StrictEqual(expected, actual);
8686
}
@@ -94,8 +94,21 @@ public static async Task InvokeAsync_GetUserResultIsSuccess_ExpectSuccess()
9494
});
9595
var mockDataverseApi = BuildDataverseMock(dataverseGetUserResult);
9696

97+
var input = new ClaimsProvideIn(
98+
new AuthenticationEventData
99+
{
100+
AuthenticationContext = new AuthenticationContext
101+
{
102+
CorrelationId = Guid.Parse("97d7f13b-24e2-461e-9b57-8d8e3d9d9ba3"),
103+
User = new User
104+
{
105+
Id = Guid.Parse("ac9fdb67-8321-4757-8bd8-3066ca55f7d9")
106+
}
107+
}
108+
});
109+
97110
var func = new ClaimsProvideFunc(mockDataverseApi.Object);
98-
var actual = await func.InvokeAsync(SomeInput, CancellationToken.None);
111+
var actual = await func.InvokeAsync(input, CancellationToken.None);
99112

100113
var expected = new ClaimsProvideOut
101114
{
@@ -107,6 +120,7 @@ public static async Task InvokeAsync_GetUserResultIsSuccess_ExpectSuccess()
107120
{
108121
Claims = new Claims
109122
{
123+
CorrelationId = Guid.Parse("97d7f13b-24e2-461e-9b57-8d8e3d9d9ba3"),
110124
SystemUserId = Guid.Parse("eea93cde-6bbf-4137-a6b9-f6c75d8ea10c")
111125
}
112126
}

0 commit comments

Comments
 (0)