diff --git a/Management.Test/FileStorage/FileStorageTests.cs b/Management.Test/FileStorage/FileStorageTests.cs index 038d608..bcd9523 100644 --- a/Management.Test/FileStorage/FileStorageTests.cs +++ b/Management.Test/FileStorage/FileStorageTests.cs @@ -8,8 +8,7 @@ using NSubstitute; public class FileStorageTests { - private FileStorageManager fileManager { get; set; } - + private FileStorageService fileManager { get; set; } public FileStorageTests() { @@ -28,10 +27,10 @@ public class FileStorageTests dir.Delete(true); } - var fileManagerLogger = new MyLogger(NullLogger.Instance); + var fileManagerLogger = new MyLogger(NullLogger.Instance); var markdownLoaderLogger = new MyLogger(NullLogger.Instance); var markdownSaverLogger = new MyLogger(NullLogger.Instance); - var otherLogger = NullLoggerFactory.Instance.CreateLogger(); + var otherLogger = NullLoggerFactory.Instance.CreateLogger(); Environment.SetEnvironmentVariable("storageDirectory", storageDirectory); var config = new ConfigurationBuilder() .AddEnvironmentVariables() @@ -40,7 +39,7 @@ public class FileStorageTests var markdownLoader = new CourseMarkdownLoader(markdownLoaderLogger, fileConfiguration); var markdownSaver = new MarkdownCourseSaver(markdownSaverLogger, fileConfiguration); - fileManager = new FileStorageManager(fileManagerLogger, markdownLoader, markdownSaver, otherLogger, fileConfiguration); + fileManager = new FileStorageService(fileManagerLogger, markdownLoader, markdownSaver, otherLogger, fileConfiguration); } [Fact] diff --git a/Management.Web/Program.cs b/Management.Web/Program.cs index 1dec766..1f80bc2 100644 --- a/Management.Web/Program.cs +++ b/Management.Web/Program.cs @@ -90,7 +90,7 @@ builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); -builder.Services.AddSingleton(); +builder.Services.AddSingleton(); // one actor system, maybe different actor for different pages? builder.Services.AddSingleton(); @@ -106,7 +106,7 @@ builder.Services.AddSingleton(sp => builder.Services.AddSingleton(sp => { var akka = sp.GetRequiredService(); - return new LocalStorageCache(akka.StorageActor ?? throw new Exception("Canvas queue actor not properly created")); + return new LocalStorageActorWrapper(akka.StorageActor ?? throw new Exception("Canvas queue actor not properly created")); }); @@ -145,7 +145,7 @@ app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); -app.UseResponseCompression(); +// app.UseResponseCompression(); app.MapBlazorHub(); app.MapFallbackToPage("/_Host"); diff --git a/Management/Services/Actors/LocalStorageActor.cs b/Management/Services/Actors/LocalStorageActor.cs index 44d840e..6ce4059 100644 --- a/Management/Services/Actors/LocalStorageActor.cs +++ b/Management/Services/Actors/LocalStorageActor.cs @@ -2,14 +2,16 @@ using Akka.Actor; using LocalModels; +using Management.Services; + 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 readonly MyLogger logger; + private readonly FileStorageService storage; private DateTime? cacheTime { get; set; } = null; private IEnumerable? cachedCourses { get; set; } = null; @@ -19,8 +21,8 @@ public class LocalStorageActor : ReceiveActor { serviceProvider = serviceProviderArg; scope = serviceProvider.CreateScope(); - logger = scope.ServiceProvider.GetRequiredService>(); - storage = scope.ServiceProvider.GetRequiredService(); + logger = scope.ServiceProvider.GetRequiredService>(); + storage = scope.ServiceProvider.GetRequiredService(); Receive(m => { @@ -31,15 +33,14 @@ public class LocalStorageActor : ReceiveActor ReceiveAsync(async m => { - var secondsFromLastLoad = (DateTime.Now - cacheTime)?.Seconds; + var secondsFromLastLoad = (DateTime.Now - cacheTime)?.TotalSeconds; if (cachedCourses != null && secondsFromLastLoad < cacheSeconds) { - logger.LogInformation("returning cached courses from file"); + logger.Log("returning cached courses from file"); Sender.Tell(cachedCourses); return; } - cachedCourses = await storage.LoadSavedCourses(); cacheTime = DateTime.Now; Sender.Tell(cachedCourses); diff --git a/Management/Services/Actors/LocalStorageCache.cs b/Management/Services/Actors/LocalStorageActorWrapper.cs similarity index 88% rename from Management/Services/Actors/LocalStorageCache.cs rename to Management/Services/Actors/LocalStorageActorWrapper.cs index b00c64a..43cc88d 100644 --- a/Management/Services/Actors/LocalStorageCache.cs +++ b/Management/Services/Actors/LocalStorageActorWrapper.cs @@ -2,7 +2,7 @@ using Akka.Actor; using LocalModels; -public class LocalStorageCache(IActorRef storageActor) : IFileStorageManager +public class LocalStorageActorWrapper(IActorRef storageActor) : IFileStorageManager { private readonly IActorRef storageActor = storageActor; diff --git a/Management/Services/Files/FileStorageManagerCached.cs b/Management/Services/Files/FileStorageManagerCached.cs deleted file mode 100644 index f0d2d80..0000000 --- a/Management/Services/Files/FileStorageManagerCached.cs +++ /dev/null @@ -1,50 +0,0 @@ - -// using System.Diagnostics.CodeAnalysis; -// using LocalModels; - -// public class FileStorageManagerCached : IFileStorageManager -// { -// private readonly FileStorageManager manager; - -// private readonly object cacheLock = new object(); // Lock object for synchronization - - -// private DateTime? cacheTime { get; set; } = null; -// private IEnumerable? cachedCourses { get; set; } = null; -// private ILogger logger { get; } - -// private readonly int cacheSeconds = 2; -// public FileStorageManagerCached(FileStorageManager manager, ILogger logger) -// { -// this.manager = manager; -// this.logger = logger; -// } -// public Task> GetEmptyDirectories() -// { -// return manager.GetEmptyDirectories(); -// } - -// public async Task> LoadSavedCourses() -// { - -// var secondsFromLastLoad = (DateTime.Now - cacheTime)?.Seconds; - -// if (cachedCourses != null && secondsFromLastLoad < cacheSeconds) -// { -// logger.LogInformation("returning cached courses from file"); -// return cachedCourses; -// } - -// cachedCourses = await manager.LoadSavedCourses(); -// cacheTime = DateTime.Now; -// return cachedCourses; -// } - -// public async Task SaveCourseAsync(LocalCourse course, LocalCourse? previouslyStoredCourse) -// { -// // race condition... -// cacheTime = null; -// cachedCourses = null; -// await manager.SaveCourseAsync(course, previouslyStoredCourse); -// } -// } diff --git a/Management/Services/Files/FileStorageManager.cs b/Management/Services/Files/FileStorageService.cs similarity index 82% rename from Management/Services/Files/FileStorageManager.cs rename to Management/Services/Files/FileStorageService.cs index 5a24958..ac3d9a2 100644 --- a/Management/Services/Files/FileStorageManager.cs +++ b/Management/Services/Files/FileStorageService.cs @@ -1,19 +1,19 @@ using LocalModels; using Management.Services; -public class FileStorageManager +public class FileStorageService { - private readonly MyLogger logger; + private readonly MyLogger logger; private readonly CourseMarkdownLoader _courseMarkdownLoader; private readonly MarkdownCourseSaver _saveMarkdownCourse; - private readonly ILogger _otherLogger; + private readonly ILogger _otherLogger; private readonly string _basePath; - public FileStorageManager( - MyLogger logger, + public FileStorageService( + MyLogger logger, CourseMarkdownLoader courseMarkdownLoader, MarkdownCourseSaver saveMarkdownCourse, - ILogger otherLogger, + ILogger otherLogger, FileConfiguration fileConfig ) { @@ -36,6 +36,8 @@ public class FileStorageManager public async Task> LoadSavedCourses() { + + Console.WriteLine("loading pages from file system"); return await _courseMarkdownLoader.LoadSavedCourses(); } diff --git a/Management/Services/Files/LoadMarkdownCourse.cs b/Management/Services/Files/LoadMarkdownCourse.cs index 1a4d16f..4e00cc5 100644 --- a/Management/Services/Files/LoadMarkdownCourse.cs +++ b/Management/Services/Files/LoadMarkdownCourse.cs @@ -24,6 +24,7 @@ public class CourseMarkdownLoader return File.Exists(settingsPath); }) .Select(async d => await LoadCourseByPath(d)) + .ToArray() ); return courses.OrderBy(c => c.Settings.Name); } @@ -70,6 +71,7 @@ public class CourseMarkdownLoader var modules = await Task.WhenAll( modulePaths .Select(loadModuleFromPath) + .ToArray() ); return modules.OrderBy(m => m.Name); } @@ -79,7 +81,7 @@ public class CourseMarkdownLoader var moduleName = Path.GetFileName(modulePath); var assignments = await loadAssignmentsFromPath(modulePath); var quizzes = await loadQuizzesFromPath(modulePath); - var pages = await loadPagesFromPath(modulePath); + var pages = await loadModulePagesFromPath(modulePath); return new LocalModule() { @@ -125,13 +127,13 @@ public class CourseMarkdownLoader { var rawQuiz = (await File.ReadAllTextAsync(path)).Replace("\r\n", "\n"); return LocalQuiz.ParseMarkdown(rawQuiz); - }); + }) + .ToArray(); return await Task.WhenAll(quizPromises); } - private async Task> loadPagesFromPath(string modulePath) + private async Task> loadModulePagesFromPath(string modulePath) { - using var activity = DiagnosticsConfig.Source?.StartActivity("loading Pages from path"); var pagesPath = $"{modulePath}/pages"; if (!Directory.Exists(pagesPath)) { @@ -145,7 +147,8 @@ public class CourseMarkdownLoader { var rawPage = (await File.ReadAllTextAsync(path)).Replace("\r\n", "\n"); return LocalCoursePage.ParseMarkdown(rawPage); - }); + }) + .ToArray(); return await Task.WhenAll(pagePromises); } diff --git a/Management/Services/MyLogger.cs b/Management/Services/MyLogger.cs index 13364b5..e73a0a1 100644 --- a/Management/Services/MyLogger.cs +++ b/Management/Services/MyLogger.cs @@ -33,7 +33,7 @@ public class MyLogger var finalMessage = $"[{typeof(T)}.{memberName}] {message}"; _baseLogger.Log(logLevel, finalMessage); - Console.WriteLine(finalMessage); + // Console.WriteLine(finalMessage); } public void Error( string message,