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 logger; private readonly IGeoFeedProvider feedProvider; public GeoFeedCacheService(ILogger 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 StartPerioidicSync(){ List 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 GeoFeedCacheEntries {get;set;} } }