refactor was really not needed

This commit is contained in:
2024-05-20 18:18:55 -06:00
parent c4cd65ca19
commit 0db62b4f04
8 changed files with 33 additions and 78 deletions

View File

@@ -8,8 +8,7 @@ using NSubstitute;
public class FileStorageTests public class FileStorageTests
{ {
private FileStorageManager fileManager { get; set; } private FileStorageService fileManager { get; set; }
public FileStorageTests() public FileStorageTests()
{ {
@@ -28,10 +27,10 @@ public class FileStorageTests
dir.Delete(true); dir.Delete(true);
} }
var fileManagerLogger = new MyLogger<FileStorageManager>(NullLogger<FileStorageManager>.Instance); var fileManagerLogger = new MyLogger<FileStorageService>(NullLogger<FileStorageService>.Instance);
var markdownLoaderLogger = new MyLogger<CourseMarkdownLoader>(NullLogger<CourseMarkdownLoader>.Instance); var markdownLoaderLogger = new MyLogger<CourseMarkdownLoader>(NullLogger<CourseMarkdownLoader>.Instance);
var markdownSaverLogger = new MyLogger<MarkdownCourseSaver>(NullLogger<MarkdownCourseSaver>.Instance); var markdownSaverLogger = new MyLogger<MarkdownCourseSaver>(NullLogger<MarkdownCourseSaver>.Instance);
var otherLogger = NullLoggerFactory.Instance.CreateLogger<FileStorageManager>(); var otherLogger = NullLoggerFactory.Instance.CreateLogger<FileStorageService>();
Environment.SetEnvironmentVariable("storageDirectory", storageDirectory); Environment.SetEnvironmentVariable("storageDirectory", storageDirectory);
var config = new ConfigurationBuilder() var config = new ConfigurationBuilder()
.AddEnvironmentVariables() .AddEnvironmentVariables()
@@ -40,7 +39,7 @@ public class FileStorageTests
var markdownLoader = new CourseMarkdownLoader(markdownLoaderLogger, fileConfiguration); var markdownLoader = new CourseMarkdownLoader(markdownLoaderLogger, fileConfiguration);
var markdownSaver = new MarkdownCourseSaver(markdownSaverLogger, fileConfiguration); var markdownSaver = new MarkdownCourseSaver(markdownSaverLogger, fileConfiguration);
fileManager = new FileStorageManager(fileManagerLogger, markdownLoader, markdownSaver, otherLogger, fileConfiguration); fileManager = new FileStorageService(fileManagerLogger, markdownLoader, markdownSaver, otherLogger, fileConfiguration);
} }
[Fact] [Fact]

View File

@@ -90,7 +90,7 @@ builder.Services.AddSingleton<ICanvasService, CanvasService>();
builder.Services.AddSingleton<MarkdownCourseSaver>(); builder.Services.AddSingleton<MarkdownCourseSaver>();
builder.Services.AddSingleton<CourseMarkdownLoader>(); builder.Services.AddSingleton<CourseMarkdownLoader>();
builder.Services.AddSingleton<FileStorageManager>(); builder.Services.AddSingleton<FileStorageService>();
// one actor system, maybe different actor for different pages? // one actor system, maybe different actor for different pages?
builder.Services.AddSingleton<AkkaService>(); builder.Services.AddSingleton<AkkaService>();
@@ -106,7 +106,7 @@ builder.Services.AddSingleton(sp =>
builder.Services.AddSingleton<IFileStorageManager>(sp => builder.Services.AddSingleton<IFileStorageManager>(sp =>
{ {
var akka = sp.GetRequiredService<AkkaService>(); var akka = sp.GetRequiredService<AkkaService>();
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.UseStaticFiles();
app.UseRouting(); app.UseRouting();
app.UseResponseCompression(); // app.UseResponseCompression();
app.MapBlazorHub(); app.MapBlazorHub();
app.MapFallbackToPage("/_Host"); app.MapFallbackToPage("/_Host");

View File

@@ -2,14 +2,16 @@ using Akka.Actor;
using LocalModels; using LocalModels;
using Management.Services;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
public class LocalStorageActor : ReceiveActor public class LocalStorageActor : ReceiveActor
{ {
private readonly IServiceProvider serviceProvider; private readonly IServiceProvider serviceProvider;
private readonly IServiceScope scope; private readonly IServiceScope scope;
private readonly ILogger<CanvasQueueActor> logger; private readonly MyLogger<CanvasQueueActor> logger;
private readonly FileStorageManager storage; private readonly FileStorageService storage;
private DateTime? cacheTime { get; set; } = null; private DateTime? cacheTime { get; set; } = null;
private IEnumerable<LocalCourse>? cachedCourses { get; set; } = null; private IEnumerable<LocalCourse>? cachedCourses { get; set; } = null;
@@ -19,8 +21,8 @@ public class LocalStorageActor : ReceiveActor
{ {
serviceProvider = serviceProviderArg; serviceProvider = serviceProviderArg;
scope = serviceProvider.CreateScope(); scope = serviceProvider.CreateScope();
logger = scope.ServiceProvider.GetRequiredService<ILogger<CanvasQueueActor>>(); logger = scope.ServiceProvider.GetRequiredService<MyLogger<CanvasQueueActor>>();
storage = scope.ServiceProvider.GetRequiredService<FileStorageManager>(); storage = scope.ServiceProvider.GetRequiredService<FileStorageService>();
Receive<EmptyDirectoryAsk>(m => Receive<EmptyDirectoryAsk>(m =>
{ {
@@ -31,15 +33,14 @@ public class LocalStorageActor : ReceiveActor
ReceiveAsync<SavedCoursesAsk>(async m => ReceiveAsync<SavedCoursesAsk>(async m =>
{ {
var secondsFromLastLoad = (DateTime.Now - cacheTime)?.Seconds; var secondsFromLastLoad = (DateTime.Now - cacheTime)?.TotalSeconds;
if (cachedCourses != null && secondsFromLastLoad < cacheSeconds) if (cachedCourses != null && secondsFromLastLoad < cacheSeconds)
{ {
logger.LogInformation("returning cached courses from file"); logger.Log("returning cached courses from file");
Sender.Tell(cachedCourses); Sender.Tell(cachedCourses);
return; return;
} }
cachedCourses = await storage.LoadSavedCourses(); cachedCourses = await storage.LoadSavedCourses();
cacheTime = DateTime.Now; cacheTime = DateTime.Now;
Sender.Tell(cachedCourses); Sender.Tell(cachedCourses);

View File

@@ -2,7 +2,7 @@ using Akka.Actor;
using LocalModels; using LocalModels;
public class LocalStorageCache(IActorRef storageActor) : IFileStorageManager public class LocalStorageActorWrapper(IActorRef storageActor) : IFileStorageManager
{ {
private readonly IActorRef storageActor = storageActor; private readonly IActorRef storageActor = storageActor;

View File

@@ -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<LocalCourse>? cachedCourses { get; set; } = null;
// private ILogger<FileStorageManagerCached> logger { get; }
// private readonly int cacheSeconds = 2;
// public FileStorageManagerCached(FileStorageManager manager, ILogger<FileStorageManagerCached> logger)
// {
// this.manager = manager;
// this.logger = logger;
// }
// public Task<IEnumerable<string>> GetEmptyDirectories()
// {
// return manager.GetEmptyDirectories();
// }
// public async Task<IEnumerable<LocalCourse>> 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);
// }
// }

View File

@@ -1,19 +1,19 @@
using LocalModels; using LocalModels;
using Management.Services; using Management.Services;
public class FileStorageManager public class FileStorageService
{ {
private readonly MyLogger<FileStorageManager> logger; private readonly MyLogger<FileStorageService> logger;
private readonly CourseMarkdownLoader _courseMarkdownLoader; private readonly CourseMarkdownLoader _courseMarkdownLoader;
private readonly MarkdownCourseSaver _saveMarkdownCourse; private readonly MarkdownCourseSaver _saveMarkdownCourse;
private readonly ILogger<FileStorageManager> _otherLogger; private readonly ILogger<FileStorageService> _otherLogger;
private readonly string _basePath; private readonly string _basePath;
public FileStorageManager( public FileStorageService(
MyLogger<FileStorageManager> logger, MyLogger<FileStorageService> logger,
CourseMarkdownLoader courseMarkdownLoader, CourseMarkdownLoader courseMarkdownLoader,
MarkdownCourseSaver saveMarkdownCourse, MarkdownCourseSaver saveMarkdownCourse,
ILogger<FileStorageManager> otherLogger, ILogger<FileStorageService> otherLogger,
FileConfiguration fileConfig FileConfiguration fileConfig
) )
{ {
@@ -36,6 +36,8 @@ public class FileStorageManager
public async Task<IEnumerable<LocalCourse>> LoadSavedCourses() public async Task<IEnumerable<LocalCourse>> LoadSavedCourses()
{ {
Console.WriteLine("loading pages from file system");
return await _courseMarkdownLoader.LoadSavedCourses(); return await _courseMarkdownLoader.LoadSavedCourses();
} }

View File

@@ -24,6 +24,7 @@ public class CourseMarkdownLoader
return File.Exists(settingsPath); return File.Exists(settingsPath);
}) })
.Select(async d => await LoadCourseByPath(d)) .Select(async d => await LoadCourseByPath(d))
.ToArray()
); );
return courses.OrderBy(c => c.Settings.Name); return courses.OrderBy(c => c.Settings.Name);
} }
@@ -70,6 +71,7 @@ public class CourseMarkdownLoader
var modules = await Task.WhenAll( var modules = await Task.WhenAll(
modulePaths modulePaths
.Select(loadModuleFromPath) .Select(loadModuleFromPath)
.ToArray()
); );
return modules.OrderBy(m => m.Name); return modules.OrderBy(m => m.Name);
} }
@@ -79,7 +81,7 @@ public class CourseMarkdownLoader
var moduleName = Path.GetFileName(modulePath); var moduleName = Path.GetFileName(modulePath);
var assignments = await loadAssignmentsFromPath(modulePath); var assignments = await loadAssignmentsFromPath(modulePath);
var quizzes = await loadQuizzesFromPath(modulePath); var quizzes = await loadQuizzesFromPath(modulePath);
var pages = await loadPagesFromPath(modulePath); var pages = await loadModulePagesFromPath(modulePath);
return new LocalModule() return new LocalModule()
{ {
@@ -125,13 +127,13 @@ public class CourseMarkdownLoader
{ {
var rawQuiz = (await File.ReadAllTextAsync(path)).Replace("\r\n", "\n"); var rawQuiz = (await File.ReadAllTextAsync(path)).Replace("\r\n", "\n");
return LocalQuiz.ParseMarkdown(rawQuiz); return LocalQuiz.ParseMarkdown(rawQuiz);
}); })
.ToArray();
return await Task.WhenAll(quizPromises); return await Task.WhenAll(quizPromises);
} }
private async Task<IEnumerable<LocalCoursePage>> loadPagesFromPath(string modulePath) private async Task<IEnumerable<LocalCoursePage>> loadModulePagesFromPath(string modulePath)
{ {
using var activity = DiagnosticsConfig.Source?.StartActivity("loading Pages from path");
var pagesPath = $"{modulePath}/pages"; var pagesPath = $"{modulePath}/pages";
if (!Directory.Exists(pagesPath)) if (!Directory.Exists(pagesPath))
{ {
@@ -145,7 +147,8 @@ public class CourseMarkdownLoader
{ {
var rawPage = (await File.ReadAllTextAsync(path)).Replace("\r\n", "\n"); var rawPage = (await File.ReadAllTextAsync(path)).Replace("\r\n", "\n");
return LocalCoursePage.ParseMarkdown(rawPage); return LocalCoursePage.ParseMarkdown(rawPage);
}); })
.ToArray();
return await Task.WhenAll(pagePromises); return await Task.WhenAll(pagePromises);
} }

View File

@@ -33,7 +33,7 @@ public class MyLogger<T>
var finalMessage = $"[{typeof(T)}.{memberName}] {message}"; var finalMessage = $"[{typeof(T)}.{memberName}] {message}";
_baseLogger.Log(logLevel, finalMessage); _baseLogger.Log(logLevel, finalMessage);
Console.WriteLine(finalMessage); // Console.WriteLine(finalMessage);
} }
public void Error( public void Error(
string message, string message,