Skip to content

Commit 040947a

Browse files
[refactor] Apply mediator DP on TrustFunction (#185)
Co-authored-by: Paul Fresquet <61119222+paul-fresquet@users.noreply.github.com>
1 parent 3c25e92 commit 040947a

12 files changed

+419
-98
lines changed

src/ByteSync.Functions/Http/TrustFunction.cs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,10 @@ namespace ByteSync.Functions.Http;
1212

1313
public class TrustFunction
1414
{
15-
private readonly ITrustService _trustService;
1615
private readonly IMediator _mediator;
1716

18-
public TrustFunction(ITrustService trustService, IMediator mediator)
17+
public TrustFunction(IMediator mediator)
1918
{
20-
_trustService = trustService;
2119
_mediator = mediator;
2220
}
2321

@@ -84,8 +82,9 @@ public async Task<HttpResponseData> SetAuthChecked(
8482
var client = FunctionHelper.GetClientFromContext(executionContext);
8583
var parameters = await FunctionHelper.DeserializeRequestBody<SetAuthCheckedParameters>(req);
8684

87-
await _trustService.SetAuthChecked(client, parameters);
88-
85+
var request = new SetAuthCheckedRequest(parameters, client);
86+
await _mediator.Send(request);
87+
8988
var response = req.CreateResponse();
9089
response.StatusCode = HttpStatusCode.OK;
9190

@@ -101,7 +100,8 @@ public async Task<HttpResponseData> RequestTrustPublicKey(
101100
var client = FunctionHelper.GetClientFromContext(executionContext);
102101
var parameters = await FunctionHelper.DeserializeRequestBody<RequestTrustProcessParameters>(req);
103102

104-
await _trustService.RequestTrustPublicKey(client, parameters);
103+
var request = new RequestTrustPublicKeyRequest(parameters, client);
104+
await _mediator.Send(request);
105105

106106
var response = req.CreateResponse();
107107
response.StatusCode = HttpStatusCode.OK;
@@ -118,7 +118,8 @@ public async Task<HttpResponseData> InformPublicKeyValidationIsFinished(
118118
var client = FunctionHelper.GetClientFromContext(executionContext);
119119
var parameters = await FunctionHelper.DeserializeRequestBody<PublicKeyValidationParameters>(req);
120120

121-
await _trustService.InformPublicKeyValidationIsFinished(client, parameters);
121+
var request = new InformPublicKeyValidationIsFinishedRequest(parameters, client);
122+
await _mediator.Send(request);
122123

123124
var response = req.CreateResponse();
124125
response.StatusCode = HttpStatusCode.OK;
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
using ByteSync.ServerCommon.Interfaces.Repositories;
2+
using ByteSync.ServerCommon.Interfaces.Services.Clients;
3+
using MediatR;
4+
using Microsoft.Extensions.Logging;
5+
6+
namespace ByteSync.ServerCommon.Commands.Trusts;
7+
8+
public class InformPublicKeyValidationIsFinishedCommandHandler: IRequestHandler<InformPublicKeyValidationIsFinishedRequest>
9+
{
10+
private readonly ICloudSessionsRepository _cloudSessionsRepository;
11+
private readonly IInvokeClientsService _invokeClientsService;
12+
private readonly ILogger<InformPublicKeyValidationIsFinishedCommandHandler> _logger;
13+
14+
public InformPublicKeyValidationIsFinishedCommandHandler(ICloudSessionsRepository cloudSessionsRepository, IInvokeClientsService invokeClientService, ILogger<InformPublicKeyValidationIsFinishedCommandHandler> logger)
15+
{
16+
_cloudSessionsRepository = cloudSessionsRepository;
17+
_invokeClientsService = invokeClientService;
18+
_logger = logger;
19+
}
20+
21+
public async Task Handle(InformPublicKeyValidationIsFinishedRequest request, CancellationToken cancellationToken)
22+
{
23+
var session = await _cloudSessionsRepository.Get(request.Parameters.SessionId);
24+
if (session != null)
25+
{
26+
await _invokeClientsService.Client(request.Parameters.OtherPartyClientInstanceId).InformPublicKeyValidationIsFinished(request.Parameters).ConfigureAwait(false);
27+
28+
_logger.LogInformation("InformPublicKeyValidationIsFinished: {Sender} sends PublicKeyValidation to {Recipient}", request.Client.ClientInstanceId,
29+
request.Parameters.OtherPartyClientInstanceId);
30+
}
31+
else
32+
{
33+
_logger.LogInformation("InformPublicKeyValidationIsFinished: session not found for sessionId '{sessionId}'. Can not proceed",
34+
request.Parameters.SessionId);
35+
}
36+
}
37+
38+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using ByteSync.Common.Business.Sessions.Cloud.Connections;
2+
using ByteSync.ServerCommon.Business.Auth;
3+
using MediatR;
4+
5+
namespace ByteSync.ServerCommon.Commands.Trusts;
6+
7+
public class InformPublicKeyValidationIsFinishedRequest: IRequest
8+
{
9+
public InformPublicKeyValidationIsFinishedRequest(PublicKeyValidationParameters parameters, Client client)
10+
{
11+
Parameters = parameters;
12+
Client = client;
13+
}
14+
public PublicKeyValidationParameters Parameters { get; set; }
15+
16+
public Client Client { get; set; }
17+
18+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
using ByteSync.ServerCommon.Interfaces.Repositories;
2+
using ByteSync.ServerCommon.Interfaces.Services.Clients;
3+
using MediatR;
4+
using Microsoft.Extensions.Logging;
5+
6+
namespace ByteSync.ServerCommon.Commands.Trusts;
7+
8+
public class RequestTrustPublicKeyCommandHandler: IRequestHandler<RequestTrustPublicKeyRequest>
9+
{
10+
private readonly ICloudSessionsRepository _cloudSessionsRepository;
11+
private readonly IInvokeClientsService _invokeClientsService;
12+
private readonly ILogger<SetAuthCheckedCommandHandler> _logger;
13+
14+
public RequestTrustPublicKeyCommandHandler(ICloudSessionsRepository cloudSessionsRepository, IInvokeClientsService invokeClientService, ILogger<SetAuthCheckedCommandHandler> logger)
15+
{
16+
_cloudSessionsRepository = cloudSessionsRepository;
17+
_invokeClientsService = invokeClientService;
18+
_logger = logger;
19+
}
20+
21+
public async Task Handle(RequestTrustPublicKeyRequest request, CancellationToken cancellationToken)
22+
{
23+
var recipient = await _cloudSessionsRepository.GetSessionMember(request.Parameters.SessionId, request.Parameters.SessionMemberInstanceId);
24+
if (recipient != null)
25+
{
26+
await _invokeClientsService.Client(recipient).RequestTrustPublicKey(request.Parameters).ConfigureAwait(false);
27+
28+
_logger.LogInformation("RequestTrustPublicKey: {Sender} sends trust publicKey Request to {Recipient}", request.Client.ClientInstanceId,
29+
request.Parameters.SessionMemberInstanceId);
30+
}
31+
else
32+
{
33+
_logger.LogInformation("RequestTrustPublicKey: Recipient not found. Cannot proceed");
34+
}
35+
}
36+
37+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using ByteSync.Common.Business.Sessions.Cloud.Connections;
2+
using ByteSync.ServerCommon.Business.Auth;
3+
using MediatR;
4+
5+
namespace ByteSync.ServerCommon.Commands.Trusts;
6+
7+
public class RequestTrustPublicKeyRequest: IRequest
8+
{
9+
public RequestTrustPublicKeyRequest(RequestTrustProcessParameters parameters, Client client)
10+
{
11+
Parameters = parameters;
12+
Client = client;
13+
}
14+
15+
public RequestTrustProcessParameters Parameters { get; set; }
16+
17+
public Client Client { get; set; }
18+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using ByteSync.ServerCommon.Interfaces.Repositories;
2+
using MediatR;
3+
using Microsoft.Extensions.Logging;
4+
5+
namespace ByteSync.ServerCommon.Commands.Trusts;
6+
7+
public class SetAuthCheckedCommandHandler: IRequestHandler<SetAuthCheckedRequest>
8+
{
9+
private readonly ICloudSessionsRepository _cloudSessionsRepository;
10+
private readonly ILogger<SetAuthCheckedCommandHandler> _logger;
11+
12+
public SetAuthCheckedCommandHandler(ICloudSessionsRepository cloudSessionsRepository, ILogger<SetAuthCheckedCommandHandler> logger)
13+
{
14+
_cloudSessionsRepository = cloudSessionsRepository;
15+
_logger = logger;
16+
}
17+
18+
public async Task Handle(SetAuthCheckedRequest request, CancellationToken cancellationToken)
19+
{
20+
await _cloudSessionsRepository.Update(request.Parameters.SessionId, cloudSessionData =>
21+
{
22+
var member = cloudSessionData.FindMemberOrPreMember(request.Client.ClientInstanceId);
23+
24+
if (member == null)
25+
{
26+
_logger.LogInformation("{Endpoint} is neither a member nor a premember of session {session}",
27+
request.Client.ClientInstanceId, request.Parameters.SessionId);
28+
return false;
29+
}
30+
31+
member.AuthCheckClientInstanceIds.Add(request.Parameters.CheckedClientInstanceId);
32+
33+
return true;
34+
});
35+
}
36+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using ByteSync.Common.Business.Trust.Connections;
2+
using ByteSync.ServerCommon.Business.Auth;
3+
using MediatR;
4+
5+
namespace ByteSync.ServerCommon.Commands.Trusts;
6+
7+
public class SetAuthCheckedRequest: IRequest
8+
{
9+
public SetAuthCheckedRequest(SetAuthCheckedParameters parameters, Client client)
10+
{
11+
Parameters = parameters;
12+
Client = client;
13+
}
14+
15+
public SetAuthCheckedParameters Parameters { get; set; }
16+
17+
public Client Client { get; set; }
18+
}

src/ByteSync.ServerCommon/Interfaces/Services/ITrustService.cs

Lines changed: 0 additions & 14 deletions
This file was deleted.

src/ByteSync.ServerCommon/Services/TrustService.cs

Lines changed: 0 additions & 77 deletions
This file was deleted.
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
using ByteSync.Common.Business.Sessions.Cloud.Connections;
2+
using ByteSync.Common.Interfaces.Hub;
3+
using ByteSync.ServerCommon.Business.Auth;
4+
using ByteSync.ServerCommon.Business.Sessions;
5+
using ByteSync.ServerCommon.Commands.Trusts;
6+
using ByteSync.ServerCommon.Interfaces.Repositories;
7+
using ByteSync.ServerCommon.Interfaces.Services.Clients;
8+
using Microsoft.Extensions.Logging;
9+
using Moq;
10+
11+
namespace ByteSync.ServerCommon.Tests.Commands.Trusts;
12+
13+
[TestFixture]
14+
public class InformPublicKeyValidationIsFinishedCommandHandlerTests
15+
{
16+
[Test]
17+
public async Task Handle_WhenSessionExists_InvokesClientInform()
18+
{
19+
// Arrange
20+
var sessionId = "session-1";
21+
var otherPartyInstanceId = "other-instance";
22+
23+
var repo = new Mock<ICloudSessionsRepository>();
24+
repo.Setup(r => r.Get(sessionId)).ReturnsAsync(new CloudSessionData { SessionId = sessionId });
25+
26+
var hub = new Mock<IHubByteSyncPush>();
27+
var invoke = new Mock<IInvokeClientsService>();
28+
invoke.Setup(s => s.Client(otherPartyInstanceId)).Returns(hub.Object);
29+
30+
var logger = new Mock<ILogger<InformPublicKeyValidationIsFinishedCommandHandler>>();
31+
var handler = new InformPublicKeyValidationIsFinishedCommandHandler(repo.Object, invoke.Object, logger.Object);
32+
33+
var parameters = new PublicKeyValidationParameters { SessionId = sessionId, OtherPartyClientInstanceId = otherPartyInstanceId };
34+
var client = new Client { ClientInstanceId = "sender", ClientId = "s" };
35+
var request = new InformPublicKeyValidationIsFinishedRequest(parameters, client);
36+
37+
// Act
38+
await handler.Handle(request, default);
39+
40+
// Assert
41+
invoke.Verify(s => s.Client(otherPartyInstanceId), Times.Once);
42+
hub.Verify(h => h.InformPublicKeyValidationIsFinished(parameters), Times.Once);
43+
}
44+
45+
[Test]
46+
public async Task Handle_WhenSessionMissing_DoesNothing()
47+
{
48+
// Arrange
49+
var sessionId = "session-1";
50+
var otherPartyInstanceId = "other-instance";
51+
52+
var repo = new Mock<ICloudSessionsRepository>();
53+
repo.Setup(r => r.Get(sessionId)).ReturnsAsync((CloudSessionData?)null);
54+
55+
var hub = new Mock<IHubByteSyncPush>();
56+
var invoke = new Mock<IInvokeClientsService>();
57+
invoke.Setup(s => s.Client(It.IsAny<string>())).Returns(hub.Object);
58+
59+
var logger = new Mock<ILogger<InformPublicKeyValidationIsFinishedCommandHandler>>();
60+
var handler = new InformPublicKeyValidationIsFinishedCommandHandler(repo.Object, invoke.Object, logger.Object);
61+
62+
var parameters = new PublicKeyValidationParameters { SessionId = sessionId, OtherPartyClientInstanceId = otherPartyInstanceId };
63+
var client = new Client { ClientInstanceId = "sender", ClientId = "s" };
64+
var request = new InformPublicKeyValidationIsFinishedRequest(parameters, client);
65+
66+
// Act
67+
await handler.Handle(request, default);
68+
69+
// Assert
70+
invoke.Verify(s => s.Client(It.IsAny<string>()), Times.Never);
71+
hub.Verify(h => h.InformPublicKeyValidationIsFinished(It.IsAny<PublicKeyValidationParameters>()), Times.Never);
72+
}
73+
}

0 commit comments

Comments
 (0)