diff --git a/AccessQueueService/Controllers/StatusController.cs b/AccessQueueService/Controllers/StatusController.cs new file mode 100644 index 0000000..4b5c8d5 --- /dev/null +++ b/AccessQueueService/Controllers/StatusController.cs @@ -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 GetStatus() + { + return Ok(_accessService.Status); + } + } +} diff --git a/AccessQueueService/Models/AccessQueueStatus.cs b/AccessQueueService/Models/AccessQueueStatus.cs new file mode 100644 index 0000000..49ce094 --- /dev/null +++ b/AccessQueueService/Models/AccessQueueStatus.cs @@ -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; } + } +} diff --git a/AccessQueueService/Services/AccessService.cs b/AccessQueueService/Services/AccessService.cs index 891ab88..12f4779 100644 --- a/AccessQueueService/Services/AccessService.cs +++ b/AccessQueueService/Services/AccessService.cs @@ -41,6 +41,13 @@ namespace AccessQueueService.Services public int UnexpiredTicketsCount => _accessQueueRepo.GetUnexpiredTicketsCount(); public int ActiveTicketsCount => _accessQueueRepo.GetActiveTicketsCount(DateTime.UtcNow.AddSeconds(-_config.ActivitySeconds.Value)); public int QueueCount => _accessQueueRepo.GetQueueCount(); + public AccessQueueStatus Status => new() + { + ActiveTicketsCount = this.ActiveTicketsCount, + QueueCount = this.QueueCount, + UnexpiredTicketsCount = this.UnexpiredTicketsCount, + }; + public async Task RequestAccess(string userId) { await _queueLock.WaitAsync(); diff --git a/AccessQueueService/Services/IAccessService.cs b/AccessQueueService/Services/IAccessService.cs index 35cdf3c..8400567 100644 --- a/AccessQueueService/Services/IAccessService.cs +++ b/AccessQueueService/Services/IAccessService.cs @@ -10,5 +10,6 @@ namespace AccessQueueService.Services public AccessQueueConfig GetConfiguration(); public void UpdateConfiguration(AccessQueueConfig config); public void PatchConfiguration(AccessQueueConfig partialConfig); + public AccessQueueStatus Status { get; } } } diff --git a/AccessQueueServiceTests/AccessServiceTests.cs b/AccessQueueServiceTests/AccessServiceTests.cs index c44df63..f0100a8 100644 --- a/AccessQueueServiceTests/AccessServiceTests.cs +++ b/AccessQueueServiceTests/AccessServiceTests.cs @@ -15,7 +15,7 @@ namespace AccessQueueServiceTests const int ACT_SECONDS = 1; const int ACT_MILLIS = 1000 * ACT_SECONDS; const int CAP_LIMIT = 5; - const int BULK_COUNT = 50000; + const int BULK_COUNT = 10000; private readonly AccessService _accessService; public AccessServiceTests() @@ -272,6 +272,26 @@ namespace AccessQueueServiceTests 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); + } + } } \ No newline at end of file