diff --git a/AccessQueueService/Data/IAccessQueueRepo.cs b/AccessQueueService/Data/IAccessQueueRepo.cs index 094afca..f3c0e8b 100644 --- a/AccessQueueService/Data/IAccessQueueRepo.cs +++ b/AccessQueueService/Data/IAccessQueueRepo.cs @@ -15,8 +15,5 @@ namespace AccessQueueService.Data public int DeleteExpiredTickets(); public bool RemoveUser(string userId); public bool DidDequeueUntilFull(int activeSeconds, int expirationSeconds, int capacityLimit); - - - } } diff --git a/AccessQueueService/Data/TakeANumberAccessQueueRepo.cs b/AccessQueueService/Data/TakeANumberAccessQueueRepo.cs index 63c5eb4..21b1dc6 100644 --- a/AccessQueueService/Data/TakeANumberAccessQueueRepo.cs +++ b/AccessQueueService/Data/TakeANumberAccessQueueRepo.cs @@ -50,11 +50,6 @@ namespace AccessQueueService.Data return count; } - public void RemoveUser(string userId) - { - _accessTickets.Remove(userId); - } - public bool DidDequeueUntilFull(int activeSeconds, int expirationSeconds, int capacityLimit) { var now = DateTime.UtcNow; diff --git a/AccessQueueService/Program.cs b/AccessQueueService/Program.cs index 746706c..5272265 100644 --- a/AccessQueueService/Program.cs +++ b/AccessQueueService/Program.cs @@ -11,6 +11,7 @@ builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); +builder.Services.AddHostedService(); var app = builder.Build(); diff --git a/AccessQueueService/Services/AccessCleanupBackgroundService.cs b/AccessQueueService/Services/AccessCleanupBackgroundService.cs new file mode 100644 index 0000000..2548563 --- /dev/null +++ b/AccessQueueService/Services/AccessCleanupBackgroundService.cs @@ -0,0 +1,25 @@ + +namespace AccessQueueService.Services +{ + public class AccessCleanupBackgroundService : BackgroundService + { + private readonly IAccessService _accessService; + private readonly IConfiguration _config; + + public AccessCleanupBackgroundService(IAccessService accessService, IConfiguration config) + { + _accessService = accessService; + _config = config; + } + + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + var cleanupIntervalMillis = _config.GetValue("AccessQueue:CleanupIntervalSeconds") * 1000; + while (!stoppingToken.IsCancellationRequested) + { + _accessService.DeleteExpiredTickets(); + await Task.Delay(cleanupIntervalMillis, stoppingToken); + } + } + } +} diff --git a/AccessQueueService/appsettings.json b/AccessQueueService/appsettings.json index 6ba2637..7a7cdb3 100644 --- a/AccessQueueService/appsettings.json +++ b/AccessQueueService/appsettings.json @@ -9,7 +9,8 @@ "CapacityLimit": 100, // Maximum number of active users "ActivitySeconds": 900, // Time since last access before a user is considered inactive "ExpirationSeconds": 43200, // 12 hours - Time before a user access is revoked - "RollingExpiration": true // Whether to extend expiration time on access + "RollingExpiration": true, // Whether to extend expiration time on access + "CleanupIntervalSeconds": 60 // Interval for cleaning up expired users }, "AllowedHosts": "*" }