using System.Collections.Concurrent; using AVSCartonShipmentVerifier.DTOs; namespace AVSCartonShipmentVerifier.Services; public sealed class InMemoryScanHistoryStore : IScanHistoryStore { private const int MaxItems = 5; private readonly ConcurrentQueue _successful = new(); private readonly ConcurrentQueue _rejected = new(); private readonly Lock _syncLock = new(); public Task AddSuccessfulScanAsync(ScannedRecordDto record, CancellationToken cancellationToken = default) { lock (_syncLock) { _successful.Enqueue(record); while (_successful.Count > MaxItems) { _successful.TryDequeue(out _); } } return Task.CompletedTask; } public Task AddRejectedScanAsync(RejectedScanRecordDto record, CancellationToken cancellationToken = default) { lock (_syncLock) { _rejected.Enqueue(record); while (_rejected.Count > MaxItems) { _rejected.TryDequeue(out _); } } return Task.CompletedTask; } public Task> GetLastFiveSuccessfulScansAsync(CancellationToken cancellationToken = default) { lock (_syncLock) { return Task.FromResult>(_successful.Reverse().ToArray()); } } public Task> GetLastFiveRejectedScansAsync(CancellationToken cancellationToken = default) { lock (_syncLock) { return Task.FromResult>(_rejected.Reverse().ToArray()); } } public Task> GetAllSuccessfulScansAsync(CancellationToken cancellationToken = default) { lock (_syncLock) { return Task.FromResult>(_successful.Reverse().ToArray()); } } public Task> GetAllRejectedScansAsync(CancellationToken cancellationToken = default) { lock (_syncLock) { return Task.FromResult>(_rejected.Reverse().ToArray()); } } }