mirror of
https://github.com/alexmickelson/canvasManagement.git
synced 2026-03-25 23:28:33 -06:00
refactor was really not needed
This commit is contained in:
@@ -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]
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
@@ -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);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user