GeoFeed/AS1024.GeoFeed/GeoFeedBuilder/GeoFeedCacheService.cs

63 lines
2.1 KiB
C#

using System.ComponentModel.DataAnnotations;
using AS1024.GeoFeed.Models;
using AS1024.GeoFeed.GeoFeedBuilder;
using Microsoft.EntityFrameworkCore;
using AS1024.GeoFeed.Interfaces;
namespace AS1024.GeoFeed.GeoFeedCacheService
{
public class GeoFeedCacheService : IHostedService
{
CancellationToken _cancellationToken;
private readonly ILogger<GeoFeedCacheService> logger;
private readonly IGeoFeedProvider feedProvider;
public GeoFeedCacheService(ILogger<GeoFeedCacheService> logger,
IGeoFeedProvider feedProvider)
{
this.logger = logger;
this.feedProvider = feedProvider;
}
public Task StartAsync(CancellationToken cancellationToken)
{
_ = StartPerioidicSync();
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
public async Task<bool> StartPerioidicSync(){
List<GeoFeedCacheEntry> geoFeedCacheEntry = [];
while (!_cancellationToken.IsCancellationRequested) {
await Task.Delay(TimeSpan.FromMinutes(30));
logger.LogInformation("Running on disk fallback cache process...");
var results = await feedProvider.GetGeoFeedData();
results.ForEach(x => {
geoFeedCacheEntry.Add(new (){
Prefix = x.Prefix,
GeolocCity = x.GeolocCity,
GeolocCountry = x.GeolocCountry,
GeolocHasLocation = x.GeolocHasLocation,
GeolocPostalCode = x.GeolocPostalCode,
GeolocRegion = x.GeolocRegion
});
});
}
return false;
}
}
public class GeoFeedCacheEntry : IPGeoFeed {
[Key]
public int Id { get; set; }
}
public class GeoFeedCacheDbContext : DbContext {
public virtual DbSet<GeoFeedCacheEntry> GeoFeedCacheEntries {get;set;}
}
}