using Akka.Actor; using LocalModels; using Microsoft.Extensions.DependencyInjection; public class LocalStorageActor : ReceiveActor { private readonly IServiceProvider serviceProvider; private readonly IServiceScope scope; private readonly ILogger logger; private readonly FileStorageManager storage; private DateTime? cacheTime { get; set; } = null; private IEnumerable? cachedCourses { get; set; } = null; private readonly int cacheSeconds = 2; public LocalStorageActor(IServiceProvider serviceProviderArg) { serviceProvider = serviceProviderArg; scope = serviceProvider.CreateScope(); logger = scope.ServiceProvider.GetRequiredService>(); storage = scope.ServiceProvider.GetRequiredService(); Receive(m => { storage .GetEmptyDirectories() .PipeTo(Sender); }); ReceiveAsync(async m => { var secondsFromLastLoad = (DateTime.Now - cacheTime)?.Seconds; if (cachedCourses != null && secondsFromLastLoad < cacheSeconds) { logger.LogInformation("returning cached courses from file"); Sender.Tell(cachedCourses); return; } cachedCourses = await storage.LoadSavedCourses(); cacheTime = DateTime.Now; Sender.Tell(cachedCourses); }); ReceiveAsync(async m => { cacheTime = null; cachedCourses = null; await storage.SaveCourseAsync(m.Course, m.PreviouslyStoredCourse); }); } } public record EmptyDirectoryAsk(); public record SavedCoursesAsk(); public record SaveCoursesRequest(LocalCourse Course, LocalCourse? PreviouslyStoredCourse); public record SaveCoursesResponseSuccess();