Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/ByteSync.Functions/Helpers/Middlewares/JwtMiddleware.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ public class JwtMiddleware : IFunctionsWorkerMiddleware
public JwtMiddleware(IOptions<AppSettings> appSettings, IClientsRepository clientsRepository, ILogger<JwtMiddleware> logger)
{
var loginFunctionEntryPoint = GetEntryPoint<AuthFunction>(nameof(AuthFunction.Login));
_allowedAnonymousFunctionEntryPoints = [loginFunctionEntryPoint];
var getMessagesFunctionEntryPoint = GetEntryPoint<MessageDefinitionFunction>(nameof(MessageDefinitionFunction.GetMessages));
_allowedAnonymousFunctionEntryPoints = [loginFunctionEntryPoint, getMessagesFunctionEntryPoint];

_secret = appSettings.Value.Secret;
_clientsRepository = clientsRepository;
Expand Down
29 changes: 29 additions & 0 deletions src/ByteSync.Functions/Http/MessageDefinitionFunction.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using System.Net;
using ByteSync.ServerCommon.Commands.Messages;
using MediatR;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;

namespace ByteSync.Functions.Http;

public class MessageDefinitionFunction
{
private readonly IMediator _mediator;

public MessageDefinitionFunction(IMediator mediator)
{
_mediator = mediator;
}

[Function("GetMessages")]
public async Task<HttpResponseData> GetMessages(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "messages")] HttpRequestData req,
FunctionContext executionContext)
{
var messages = await _mediator.Send(new GetActiveMessagesRequest());

var response = req.CreateResponse();
await response.WriteAsJsonAsync(messages, HttpStatusCode.OK);
return response;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
using ByteSync.ServerCommon.Business.Messages;
using ByteSync.ServerCommon.Interfaces.Repositories;
using MediatR;

namespace ByteSync.ServerCommon.Commands.Messages;

public class GetActiveMessagesCommandHandler : IRequestHandler<GetActiveMessagesRequest, List<MessageDefinition>>
{
private readonly IMessageDefinitionRepository _repository;

public GetActiveMessagesCommandHandler(IMessageDefinitionRepository repository)
{
_repository = repository;
}

public async Task<List<MessageDefinition>> Handle(GetActiveMessagesRequest request, CancellationToken cancellationToken)
{
var allMessages = await _repository.GetAll();
if (allMessages is null)
{
return new List<MessageDefinition>();
}

var now = DateTime.UtcNow;
return allMessages.Where(m => m.StartDate <= now && now < m.EndDate).ToList();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
using ByteSync.ServerCommon.Business.Messages;
using MediatR;

namespace ByteSync.ServerCommon.Commands.Messages;

public class GetActiveMessagesRequest : IRequest<List<MessageDefinition>>;
11 changes: 11 additions & 0 deletions tests/ByteSync.Functions.UnitTests/Bruno/Get Messages.bru
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
meta {
name: Get Messages
type: http
seq: 10
}

get {
url: {{root-url}}/messages
body: none
auth: none
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
using ByteSync.ServerCommon.Business.Messages;
using ByteSync.ServerCommon.Commands.Messages;
using ByteSync.ServerCommon.Interfaces.Repositories;
using FakeItEasy;
using FluentAssertions;

namespace ByteSync.ServerCommon.Tests.Commands.Messages;

[TestFixture]
public class GetActiveMessagesCommandHandlerTests
{
private IMessageDefinitionRepository _repository = null!;
private GetActiveMessagesCommandHandler _handler = null!;

[SetUp]
public void Setup()
{
_repository = A.Fake<IMessageDefinitionRepository>();
_handler = new GetActiveMessagesCommandHandler(_repository);
}

[Test]
public async Task Handle_ReturnsOnlyActiveMessages()
{
// Arrange
var now = DateTime.UtcNow;
var messages = new List<MessageDefinition>
{
new() { Id = "1", StartDate = now.AddHours(-1), EndDate = now.AddHours(1) },
new() { Id = "2", StartDate = now.AddHours(-2), EndDate = now.AddHours(-1) },
new() { Id = "3", StartDate = now.AddHours(1), EndDate = now.AddHours(2) }
};
A.CallTo(() => _repository.GetAll()).Returns(messages);

// Act
var result = await _handler.Handle(new GetActiveMessagesRequest(), CancellationToken.None);

// Assert
result.Should().HaveCount(1);
result[0].Id.Should().Be("1");
A.CallTo(() => _repository.GetAll()).MustHaveHappenedOnceExactly();
}
}