From e8152186c1682d579440c363aa20c75328bbb2d2 Mon Sep 17 00:00:00 2001 From: Jeff Leung Date: Sat, 13 Jan 2024 17:05:21 -0800 Subject: [PATCH] Bring the caching services over --- AS1024.GeoFeed.MinimalAPI/Program.cs | 35 ++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/AS1024.GeoFeed.MinimalAPI/Program.cs b/AS1024.GeoFeed.MinimalAPI/Program.cs index 4bc44c5..a6cf784 100644 --- a/AS1024.GeoFeed.MinimalAPI/Program.cs +++ b/AS1024.GeoFeed.MinimalAPI/Program.cs @@ -1,19 +1,25 @@ +using AS1024.GeoFeed.Core.CacheService; using AS1024.GeoFeed.Core.GeoFeedProviders; using AS1024.GeoFeed.Core.Interfaces; using AS1024.GeoFeed.Core.Tools; using AS1024.GeoFeed.Models; using Microsoft.AspNetCore.Http.HttpResults; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Caching.Memory; +using System; using System.Text.Json.Serialization; namespace AS1024.GeoFeed.MinimalAPI { public class Program { + public static void Main(string[] args) { var builder = WebApplication.CreateSlimBuilder(args); builder.Services.AddTransient(); + builder.Services.AddHostedService(); + builder.Services.AddTransient(); builder.Services.AddMemoryCache(); builder.Services.AddLogging(); builder.Services.AddHttpClient(); @@ -21,14 +27,33 @@ namespace AS1024.GeoFeed.MinimalAPI options.SerializerOptions.TypeInfoResolverChain.Insert(0, AppJsonSerializerContext.Default); }); var app = builder.Build(); - var geoFeed = app.Map("/geofeed.csv", async (IGeoFeedProvider provider, ILogger logger) => { + var geoFeed = app.Map("/geofeed.csv", async (IGeoFeedProvider provider, + ILogger logger, + IGeoFeedPersistentCacheProvider cacheProvider, + IMemoryCache memoryCache, + IWebHostEnvironment environment) => { try { - var results = - await provider.GetGeoFeedData(); - return results.ToGeoFeedCsv(); + if (!memoryCache.TryGetValue("Geofeed", out List? feed)) + { + feed = await provider.GetGeoFeedData(); + if (environment.IsProduction()) + { + MemoryCacheEntryOptions cacheEntryOptions = new MemoryCacheEntryOptions() + .SetSlidingExpiration(TimeSpan.FromMinutes(15)); + memoryCache.Set("Geofeed", feed, cacheEntryOptions); + } + } + + return feed.ToGeoFeedCsv(); } - catch (Exception ex) + catch (HttpRequestException ex) + { + logger.LogWarning($"Temporary failure of retrieving GeoData from upstream. {ex}"); + string geoFeedData = cacheProvider.GetGeoFeed(); + return geoFeedData; + } + catch (Exception ex) { logger.LogError($"Error: {ex}"); }