Skip to content

Commit 62392a9

Browse files
[feature] Add messages API (#126)
1 parent 4b56baa commit 62392a9

6 files changed

Lines changed: 118 additions & 1 deletion

File tree

src/ByteSync.Functions/Helpers/Middlewares/JwtMiddleware.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ public class JwtMiddleware : IFunctionsWorkerMiddleware
2727
public JwtMiddleware(IOptions<AppSettings> appSettings, IClientsRepository clientsRepository, ILogger<JwtMiddleware> logger)
2828
{
2929
var loginFunctionEntryPoint = GetEntryPoint<AuthFunction>(nameof(AuthFunction.Login));
30-
_allowedAnonymousFunctionEntryPoints = [loginFunctionEntryPoint];
30+
var getMessagesFunctionEntryPoint = GetEntryPoint<MessageDefinitionFunction>(nameof(MessageDefinitionFunction.GetMessages));
31+
_allowedAnonymousFunctionEntryPoints = [loginFunctionEntryPoint, getMessagesFunctionEntryPoint];
3132

3233
_secret = appSettings.Value.Secret;
3334
_clientsRepository = clientsRepository;
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using System.Net;
2+
using ByteSync.ServerCommon.Commands.Messages;
3+
using MediatR;
4+
using Microsoft.Azure.Functions.Worker;
5+
using Microsoft.Azure.Functions.Worker.Http;
6+
7+
namespace ByteSync.Functions.Http;
8+
9+
public class MessageDefinitionFunction
10+
{
11+
private readonly IMediator _mediator;
12+
13+
public MessageDefinitionFunction(IMediator mediator)
14+
{
15+
_mediator = mediator;
16+
}
17+
18+
[Function("GetMessages")]
19+
public async Task<HttpResponseData> GetMessages(
20+
[HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "messages")] HttpRequestData req,
21+
FunctionContext executionContext)
22+
{
23+
var messages = await _mediator.Send(new GetActiveMessagesRequest());
24+
25+
var response = req.CreateResponse();
26+
await response.WriteAsJsonAsync(messages, HttpStatusCode.OK);
27+
return response;
28+
}
29+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
using ByteSync.ServerCommon.Business.Messages;
2+
using ByteSync.ServerCommon.Interfaces.Repositories;
3+
using MediatR;
4+
5+
namespace ByteSync.ServerCommon.Commands.Messages;
6+
7+
public class GetActiveMessagesCommandHandler : IRequestHandler<GetActiveMessagesRequest, List<MessageDefinition>>
8+
{
9+
private readonly IMessageDefinitionRepository _repository;
10+
11+
public GetActiveMessagesCommandHandler(IMessageDefinitionRepository repository)
12+
{
13+
_repository = repository;
14+
}
15+
16+
public async Task<List<MessageDefinition>> Handle(GetActiveMessagesRequest request, CancellationToken cancellationToken)
17+
{
18+
var allMessages = await _repository.GetAll();
19+
if (allMessages is null)
20+
{
21+
return new List<MessageDefinition>();
22+
}
23+
24+
var now = DateTime.UtcNow;
25+
return allMessages.Where(m => m.StartDate <= now && now < m.EndDate).ToList();
26+
}
27+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
using ByteSync.ServerCommon.Business.Messages;
2+
using MediatR;
3+
4+
namespace ByteSync.ServerCommon.Commands.Messages;
5+
6+
public class GetActiveMessagesRequest : IRequest<List<MessageDefinition>>;
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
meta {
2+
name: Get Messages
3+
type: http
4+
seq: 10
5+
}
6+
7+
get {
8+
url: {{root-url}}/messages
9+
body: none
10+
auth: none
11+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
using ByteSync.ServerCommon.Business.Messages;
2+
using ByteSync.ServerCommon.Commands.Messages;
3+
using ByteSync.ServerCommon.Interfaces.Repositories;
4+
using FakeItEasy;
5+
using FluentAssertions;
6+
7+
namespace ByteSync.ServerCommon.Tests.Commands.Messages;
8+
9+
[TestFixture]
10+
public class GetActiveMessagesCommandHandlerTests
11+
{
12+
private IMessageDefinitionRepository _repository = null!;
13+
private GetActiveMessagesCommandHandler _handler = null!;
14+
15+
[SetUp]
16+
public void Setup()
17+
{
18+
_repository = A.Fake<IMessageDefinitionRepository>();
19+
_handler = new GetActiveMessagesCommandHandler(_repository);
20+
}
21+
22+
[Test]
23+
public async Task Handle_ReturnsOnlyActiveMessages()
24+
{
25+
// Arrange
26+
var now = DateTime.UtcNow;
27+
var messages = new List<MessageDefinition>
28+
{
29+
new() { Id = "1", StartDate = now.AddHours(-1), EndDate = now.AddHours(1) },
30+
new() { Id = "2", StartDate = now.AddHours(-2), EndDate = now.AddHours(-1) },
31+
new() { Id = "3", StartDate = now.AddHours(1), EndDate = now.AddHours(2) }
32+
};
33+
A.CallTo(() => _repository.GetAll()).Returns(messages);
34+
35+
// Act
36+
var result = await _handler.Handle(new GetActiveMessagesRequest(), CancellationToken.None);
37+
38+
// Assert
39+
result.Should().HaveCount(1);
40+
result[0].Id.Should().Be("1");
41+
A.CallTo(() => _repository.GetAll()).MustHaveHappenedOnceExactly();
42+
}
43+
}

0 commit comments

Comments
 (0)