Added /status route to get current counts. closes #19

This commit is contained in:
henry 2025-06-17 19:24:15 -04:00
parent 61a4140b6e
commit a4f314a7b1
5 changed files with 64 additions and 1 deletions

View File

@ -0,0 +1,24 @@
using AccessQueueService.Models;
using AccessQueueService.Services;
using Microsoft.AspNetCore.Mvc;
namespace AccessQueueService.Controllers
{
[ApiController]
[Route("status")]
public class StatusController : ControllerBase
{
private readonly IAccessService _accessService;
public StatusController(IAccessService accessService)
{
_accessService = accessService;
}
[HttpGet]
public ActionResult<AccessQueueStatus> GetStatus()
{
return Ok(_accessService.Status);
}
}
}

View File

@ -0,0 +1,11 @@
using AccessQueueService.Data;
namespace AccessQueueService.Models
{
public class AccessQueueStatus
{
public int UnexpiredTicketsCount { get; internal set; }
public int ActiveTicketsCount { get; internal set; }
public int QueueCount { get; internal set; }
}
}

View File

@ -41,6 +41,13 @@ namespace AccessQueueService.Services
public int UnexpiredTicketsCount => _accessQueueRepo.GetUnexpiredTicketsCount(); public int UnexpiredTicketsCount => _accessQueueRepo.GetUnexpiredTicketsCount();
public int ActiveTicketsCount => _accessQueueRepo.GetActiveTicketsCount(DateTime.UtcNow.AddSeconds(-_config.ActivitySeconds.Value)); public int ActiveTicketsCount => _accessQueueRepo.GetActiveTicketsCount(DateTime.UtcNow.AddSeconds(-_config.ActivitySeconds.Value));
public int QueueCount => _accessQueueRepo.GetQueueCount(); public int QueueCount => _accessQueueRepo.GetQueueCount();
public AccessQueueStatus Status => new()
{
ActiveTicketsCount = this.ActiveTicketsCount,
QueueCount = this.QueueCount,
UnexpiredTicketsCount = this.UnexpiredTicketsCount,
};
public async Task<AccessResponse> RequestAccess(string userId) public async Task<AccessResponse> RequestAccess(string userId)
{ {
await _queueLock.WaitAsync(); await _queueLock.WaitAsync();

View File

@ -10,5 +10,6 @@ namespace AccessQueueService.Services
public AccessQueueConfig GetConfiguration(); public AccessQueueConfig GetConfiguration();
public void UpdateConfiguration(AccessQueueConfig config); public void UpdateConfiguration(AccessQueueConfig config);
public void PatchConfiguration(AccessQueueConfig partialConfig); public void PatchConfiguration(AccessQueueConfig partialConfig);
public AccessQueueStatus Status { get; }
} }
} }

View File

@ -15,7 +15,7 @@ namespace AccessQueueServiceTests
const int ACT_SECONDS = 1; const int ACT_SECONDS = 1;
const int ACT_MILLIS = 1000 * ACT_SECONDS; const int ACT_MILLIS = 1000 * ACT_SECONDS;
const int CAP_LIMIT = 5; const int CAP_LIMIT = 5;
const int BULK_COUNT = 50000; const int BULK_COUNT = 10000;
private readonly AccessService _accessService; private readonly AccessService _accessService;
public AccessServiceTests() public AccessServiceTests()
@ -272,6 +272,26 @@ namespace AccessQueueServiceTests
Assert.Equal(2, response3.RequestsAhead); Assert.Equal(2, response3.RequestsAhead);
} }
[Fact]
public async Task Status_ShouldReturnCorrectCounts()
{
// Fill up the queue to force a user into the queue
for (int i = 0; i < CAP_LIMIT; i++)
{
await _accessService.RequestAccess(Guid.NewGuid().ToString());
}
// Add an additional user
await _accessService.RequestAccess("user");
var status = _accessService.Status;
Assert.NotNull(status);
Assert.Equal(CAP_LIMIT, status.UnexpiredTicketsCount);
Assert.Equal(CAP_LIMIT, status.ActiveTicketsCount);
Assert.Equal(1, status.QueueCount);
}
} }
} }