Changed Shop interface to be more asynchronous.
Implemented changes in Props. Implemented said changes in AdafruitShop. Fixed and improved caching in AdafruitShop.
This commit is contained in:
@@ -12,6 +12,8 @@ namespace Props.Shop.Adafruit.Api
|
||||
public void StartUpdateTimer(int delay = 1000 * 60 * 5, int period = 1000 * 60 * 5);
|
||||
public void StopUpdateTimer();
|
||||
|
||||
public DateTime? LastDownload { get; }
|
||||
|
||||
public Task<ProductListing> GetProductListingFromIdentifier(string url);
|
||||
}
|
||||
}
|
@@ -5,6 +5,7 @@ using System.Net.Http;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Props.Shop.Adafruit.Persistence;
|
||||
using Props.Shop.Framework;
|
||||
|
||||
namespace Props.Shop.Adafruit.Api
|
||||
@@ -14,7 +15,7 @@ namespace Props.Shop.Adafruit.Api
|
||||
private ILogger<LiveProductListingManager> logger;
|
||||
private bool disposedValue;
|
||||
private int minDownloadInterval;
|
||||
private DateTime? lastDownload;
|
||||
public DateTime? LastDownload { get; private set; }
|
||||
private object refreshLock = new object();
|
||||
private volatile Task<IReadOnlyDictionary<string, IList<ProductListing>>> productListingsTask;
|
||||
|
||||
@@ -25,12 +26,17 @@ namespace Props.Shop.Adafruit.Api
|
||||
private HttpClient httpClient;
|
||||
private Timer updateTimer;
|
||||
|
||||
public LiveProductListingManager(HttpClient httpClient, ILogger<LiveProductListingManager> logger, IReadOnlyDictionary<string, IList<ProductListing>> productListings = null, int minDownloadInterval = 5 * 60 * 1000)
|
||||
public LiveProductListingManager(HttpClient httpClient, ILogger<LiveProductListingManager> logger, ProductListingCacheData productListingCacheData = null, int minDownloadInterval = 5 * 60 * 1000)
|
||||
{
|
||||
this.logger = logger;
|
||||
this.minDownloadInterval = minDownloadInterval;
|
||||
this.httpClient = httpClient;
|
||||
productListingsTask = Task.FromResult(productListings);
|
||||
if (productListingCacheData != null)
|
||||
{
|
||||
productListingsTask = Task.FromResult(productListingCacheData.ProductListings);
|
||||
LastDownload = productListingCacheData.LastUpdatedUtc;
|
||||
logger.LogInformation("{0} Cached product listings loaded. Listing saved at {1}", productListingCacheData.ProductListings.Count, productListingCacheData.LastUpdatedUtc);
|
||||
}
|
||||
}
|
||||
|
||||
public void RefreshProductListings()
|
||||
@@ -38,9 +44,9 @@ namespace Props.Shop.Adafruit.Api
|
||||
lock (refreshLock)
|
||||
{
|
||||
if (disposedValue) throw new ObjectDisposedException("ProductListingManager");
|
||||
if ((lastDownload != null && DateTime.UtcNow - lastDownload <= TimeSpan.FromMilliseconds(minDownloadInterval)) || (productListingsTask != null && !productListingsTask.IsCompleted)) return;
|
||||
lastDownload = DateTime.UtcNow;
|
||||
logger.LogDebug("Refreshing listings ({0}).", lastDownload);
|
||||
if ((LastDownload != null && DateTime.UtcNow - LastDownload <= TimeSpan.FromMilliseconds(minDownloadInterval)) || (productListingsTask != null && !productListingsTask.IsCompleted)) return;
|
||||
LastDownload = DateTime.UtcNow;
|
||||
logger.LogDebug("Refreshing listings ({0}).", LastDownload);
|
||||
productListingsTask = DownloadListings();
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user