diff --git a/Management.Web/Pages/QuizFormPage.razor b/Management.Web/Pages/QuizFormPage.razor index 41fc042..f127e15 100644 --- a/Management.Web/Pages/QuizFormPage.razor +++ b/Management.Web/Pages/QuizFormPage.razor @@ -16,7 +16,7 @@ @inject CanvasService canvas @inject CoursePlanner planner @inject QuizEditorContext quizContext -@inject ILogger logger +@inject MyLogger logger @inject NavigationManager Navigation @code { @@ -45,12 +45,12 @@ if (loading) { loading = false; - logger.LogInformation($"loading quiz {CourseName} {QuizName}"); + logger.Log($"loading quiz {CourseName} {QuizName}"); if (planner.LocalCourse == null) { var courses = await fileStorageManager.LoadSavedCourses(); planner.LocalCourse = courses.First(c => c.Settings.Name == CourseName); - logger.LogInformation($"set course to '{planner.LocalCourse?.Settings.Name}'"); + logger.Log($"set course to '{planner.LocalCourse?.Settings.Name}'"); } if (quizContext.Quiz == null) @@ -62,7 +62,7 @@ .FirstOrDefault(q => q.Name == QuizName); quizContext.Quiz = quiz; - logger.LogInformation($"set quiz to '{quizContext.Quiz?.Name}'"); + logger.Log($"set quiz to '{quizContext.Quiz?.Name}'"); } StateHasChanged(); diff --git a/Management.Web/Program.cs b/Management.Web/Program.cs index ae013bd..200c0f7 100644 --- a/Management.Web/Program.cs +++ b/Management.Web/Program.cs @@ -15,6 +15,8 @@ global using Management.Web.Shared.Components.Forms; using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Web; using dotenv.net; +using Microsoft.AspNetCore.Hosting.Server; +using Microsoft.AspNetCore.Hosting.Server.Features; DotEnv.Load(); @@ -60,6 +62,8 @@ builder.Services.AddSignalR(e => e.MaximumReceiveMessageSize = 102400000; }); + + var app = builder.Build(); // Configure the HTTP request pipeline. @@ -79,4 +83,14 @@ app.UseRouting(); app.MapBlazorHub(); app.MapFallbackToPage("/_Host"); -app.Run(); + +app.Start(); + +var addresses = app.Services.GetService().Features.Get().Addresses; + +foreach (var address in addresses) +{ + Console.WriteLine("Running at: " + address); +} + +app.WaitForShutdown(); \ No newline at end of file diff --git a/Management.Web/Shared/Components/AssignmentForm/AssignmentForm.razor b/Management.Web/Shared/Components/AssignmentForm/AssignmentForm.razor index deba470..a7560ba 100644 --- a/Management.Web/Shared/Components/AssignmentForm/AssignmentForm.razor +++ b/Management.Web/Shared/Components/AssignmentForm/AssignmentForm.razor @@ -167,31 +167,16 @@
@if (assignmentContext.Assignment != null) { -
- - -
- - + /> *@
- - @*
- -
-
- -
-
*@ }
diff --git a/Management.Web/Shared/Components/AssignmentForm/AssignmentMarkdownEditor.razor b/Management.Web/Shared/Components/AssignmentForm/AssignmentMarkdownEditor.razor index 8817a2a..bf975ae 100644 --- a/Management.Web/Shared/Components/AssignmentForm/AssignmentMarkdownEditor.razor +++ b/Management.Web/Shared/Components/AssignmentForm/AssignmentMarkdownEditor.razor @@ -55,15 +55,6 @@ { StateHasChanged(); } - - @* if (assignmentContext.Assignment != null) - { - var newAssignment = assignmentContext.Assignment with - { - Description = newRawAssignment - }; - assignmentContext.SaveAssignment(newAssignment); - } *@ } StateHasChanged(); } diff --git a/Management.Web/Shared/CurrentFiles.razor b/Management.Web/Shared/CurrentFiles.razor index ea44e58..202be57 100644 --- a/Management.Web/Shared/CurrentFiles.razor +++ b/Management.Web/Shared/CurrentFiles.razor @@ -3,7 +3,7 @@ @inject FileStorageManager fileStorageManager @inject CoursePlanner planner @inject NavigationManager Navigation -@inject ILogger logger +@inject MyLogger logger @code { @@ -17,10 +17,8 @@ void handleClick(MouseEventArgs e, LocalCourse course) { - @* logger.LogInformation("here"); *@ planner.LocalCourse = course; Navigation.NavigateTo("/course/" + course.Settings.Name); - Console.WriteLine("navigated to course detail"); } } diff --git a/Management.Web/Shared/Semester/Day/AssignmentInDay.razor b/Management.Web/Shared/Semester/Day/AssignmentInDay.razor index d3ecd5c..7003f31 100644 --- a/Management.Web/Shared/Semester/Day/AssignmentInDay.razor +++ b/Management.Web/Shared/Semester/Day/AssignmentInDay.razor @@ -5,7 +5,7 @@ @inject NavigationManager Navigation @inject AssignmentEditorContext assignmentContext -@inject ILogger logger +@inject MyLogger logger @inherits DroppableAssignment @code { @@ -38,7 +38,7 @@ { assignmentContext.Assignment = Assignment; Navigation.NavigateTo("/course/" + planner.LocalCourse.Settings.Name + "/assignment/" + Assignment.Name); - logger.LogInformation("navigating to assignment page"); + logger.Log("navigating to assignment page"); } } } diff --git a/Management.Web/appsettings.Development.json b/Management.Web/appsettings.Development.json index f042c67..a740079 100644 --- a/Management.Web/appsettings.Development.json +++ b/Management.Web/appsettings.Development.json @@ -2,8 +2,8 @@ "DetailedErrors": true, "Logging": { "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" + "Default": "Error", + "Microsoft.AspNetCore": "Error" } } } diff --git a/Management.Web/appsettings.json b/Management.Web/appsettings.json index 4d56694..04986a1 100644 --- a/Management.Web/appsettings.json +++ b/Management.Web/appsettings.json @@ -1,7 +1,7 @@ { "Logging": { "LogLevel": { - "Default": "Information", + "Default": "Error", "Microsoft.AspNetCore": "Warning" } }, diff --git a/Management/Features/Configuration/AssignmentEditorContext.cs b/Management/Features/Configuration/AssignmentEditorContext.cs index c5df014..5cd4db2 100644 --- a/Management/Features/Configuration/AssignmentEditorContext.cs +++ b/Management/Features/Configuration/AssignmentEditorContext.cs @@ -49,15 +49,15 @@ public class AssignmentEditorContext ? currentModule with { Assignments = currentModule.Assignments - .Select(a => a == Assignment ? newAssignment : a) + .Select(a => a.Name == Assignment.Name ? newAssignment : a) .ToArray() } : m ) .ToArray(); + planner.LocalCourse = planner.LocalCourse with { Modules = updatedModules }; Assignment = newAssignment; - planner.LocalCourse = planner.LocalCourse with { Modules = updatedModules }; } } diff --git a/Management/Features/Configuration/CoursePlanner.cs b/Management/Features/Configuration/CoursePlanner.cs index 60a69b3..bb3120d 100644 --- a/Management/Features/Configuration/CoursePlanner.cs +++ b/Management/Features/Configuration/CoursePlanner.cs @@ -7,17 +7,20 @@ using CanvasModel.Modules; using Management.Services.Canvas; using System.Text.RegularExpressions; using CanvasModel.Quizzes; +using Management.Services; namespace Management.Planner; public class CoursePlanner { + private readonly MyLogger logger; private readonly FileStorageManager fileStorageManager; private readonly CanvasService canvas; public bool LoadingCanvasData { get; internal set; } = false; - public CoursePlanner(FileStorageManager fileStorageManager, CanvasService canvas) + public CoursePlanner(MyLogger logger, FileStorageManager fileStorageManager, CanvasService canvas) { + this.logger = logger; this.fileStorageManager = fileStorageManager; this.canvas = canvas; } @@ -41,6 +44,14 @@ public class CoursePlanner var verifiedCourse = value.GeneralCourseCleanup(); + if (_localCourse == null) + { + _localCourse = verifiedCourse; + _lastSavedCourse = verifiedCourse; + StateHasChanged?.Invoke(); + return; + } + _debounceTimer?.Dispose(); _debounceTimer = new Timer( async (_) => await saveCourseToFile(verifiedCourse), @@ -61,16 +72,25 @@ public class CoursePlanner // ignore initial load of course if (LocalCourse == null) { - Console.WriteLine("saving course as of debounce call time"); + logger.Trace("saving course as of debounce call time"); await fileStorageManager.SaveCourseAsync(courseAsOfDebounce, null); _lastSavedCourse = courseAsOfDebounce; } else { - Console.WriteLine("Saving latest version of file"); + if (_lastSavedCourse == null) + { + logger.Trace("not saving course, no prevous saved course"); + _lastSavedCourse = LocalCourse ?? courseAsOfDebounce; + return; + } + + + logger.Trace("Saving latest version of file"); var courseToSave = LocalCourse; await fileStorageManager.SaveCourseAsync(courseToSave, _lastSavedCourse); _lastSavedCourse = courseToSave; + } } @@ -115,7 +135,7 @@ public class CoursePlanner public async Task CreateModule(LocalModule newModule) { - if(LocalCourse == null) + if (LocalCourse == null) return; var canvasCourseId = LocalCourse.Settings.CanvasId ?? throw new Exception("no course canvas id to use to create module"); @@ -132,13 +152,13 @@ public class CoursePlanner public async Task SyncAssignmentGroups() { - if(LocalCourse == null) + if (LocalCourse == null) return; var canvasCourseId = LocalCourse.Settings.CanvasId ?? throw new Exception("no course canvas id to use to create module"); - - + + CanvasAssignmentGroups = await canvas.AssignmentGroups.GetAll(canvasCourseId); await LocalCourse.EnsureAllAssignmentGroupsExistInCanvas(canvasCourseId, CanvasAssignmentGroups, canvas); diff --git a/Management/Services/Canvas/CanvasAssignmentGroupService.cs b/Management/Services/Canvas/CanvasAssignmentGroupService.cs index aa4dd24..d0f6267 100644 --- a/Management/Services/Canvas/CanvasAssignmentGroupService.cs +++ b/Management/Services/Canvas/CanvasAssignmentGroupService.cs @@ -8,17 +8,17 @@ public class CanvasAssignmentGroupService { private readonly IWebRequestor webRequestor; private readonly CanvasServiceUtils utils; - private readonly ILogger log; + private readonly MyLogger logger; public CanvasAssignmentGroupService( IWebRequestor webRequestor, CanvasServiceUtils utils, - ILogger logger + MyLogger logger ) { this.webRequestor = webRequestor; this.utils = utils; - this.log = logger; + this.logger = logger; } public async Task> GetAll(ulong courseId) { @@ -35,7 +35,7 @@ public class CanvasAssignmentGroupService LocalAssignmentGroup localAssignmentGroup ) { - log.LogInformation($"creating assignment group: {localAssignmentGroup.Name}"); + logger.Log($"creating assignment group: {localAssignmentGroup.Name}"); var url = $"courses/{canvasCourseId}/assignment_groups"; var request = new RestRequest(url); var body = new @@ -59,7 +59,7 @@ public class CanvasAssignmentGroupService LocalAssignmentGroup localAssignmentGroup ) { - log.LogInformation($"updating assignment group: {localAssignmentGroup.Name}"); + logger.Log($"updating assignment group: {localAssignmentGroup.Name}"); if (localAssignmentGroup.CanvasId == null) throw new Exception("cannot update assignment group if canvas id is null"); var url = $"courses/{canvasCourseId}/assignment_groups/{localAssignmentGroup.CanvasId}"; diff --git a/Management/Services/Canvas/CanvasService.cs b/Management/Services/Canvas/CanvasService.cs index f25a816..0c3c90c 100644 --- a/Management/Services/Canvas/CanvasService.cs +++ b/Management/Services/Canvas/CanvasService.cs @@ -12,7 +12,7 @@ public class CanvasService { private readonly IWebRequestor webRequestor; private readonly CanvasServiceUtils utils; - private readonly ILogger logger; + private readonly MyLogger logger; public CanvasAssignmentService Assignments { get; } public CanvasAssignmentGroupService AssignmentGroups { get; } @@ -26,7 +26,7 @@ public class CanvasService CanvasAssignmentGroupService AssignmentGroups, CanvasModuleService Modules, CanvasQuizService Quizzes, - ILogger logger + MyLogger logger ) { this.webRequestor = webRequestor; @@ -64,8 +64,8 @@ public class CanvasService if (data == null) { - logger.LogError(response.Content); - logger.LogError(response.ResponseUri?.ToString()); + logger.Error(response.Content); + logger.Error(response.ResponseUri?.ToString()); throw new Exception("error getting course from canvas"); } return data; @@ -95,7 +95,7 @@ public class CanvasService CanvasModuleItem item ) { - logger.LogInformation($"updating module item {item.Title}"); + logger.Log($"updating module item {item.Title}"); var url = $"courses/{canvasCourseId}/modules/{canvasModuleId}/items/{item.Id}"; var body = new { module_item = new { title = item.Title, position = item.Position } }; var request = new RestRequest(url); @@ -114,7 +114,7 @@ public class CanvasService ulong contentId ) { - logger.LogInformation($"creating new module item {title}"); + logger.Log($"creating new module item {title}"); var url = $"courses/{canvasCourseId}/modules/{canvasModuleId}/items"; var body = new { diff --git a/Management/Services/Files/FileStorageManager.cs b/Management/Services/Files/FileStorageManager.cs index 7c6b6a7..ed4b581 100644 --- a/Management/Services/Files/FileStorageManager.cs +++ b/Management/Services/Files/FileStorageManager.cs @@ -23,7 +23,7 @@ public class FileStorageManager this.logger.Log("Using storage directory: " + _basePath); } - public async Task SaveCourseAsync(LocalCourse course, LocalCourse? previouslyStoredCourse) + public async Task SaveCourseAsync(LocalCourse course, LocalCourse previouslyStoredCourse) { await _saveMarkdownCourse.Save(course, previouslyStoredCourse); } diff --git a/Management/Services/Files/SaveMarkdownCourse.cs b/Management/Services/Files/SaveMarkdownCourse.cs index 446f136..6f161d6 100644 --- a/Management/Services/Files/SaveMarkdownCourse.cs +++ b/Management/Services/Files/SaveMarkdownCourse.cs @@ -1,3 +1,4 @@ +using System.Threading.Tasks.Sources; using LocalModels; using Management.Services; @@ -12,16 +13,16 @@ public class MarkdownCourseSaver _basePath = FileConfiguration.GetBasePath(); } - public async Task Save(LocalCourse course, LocalCourse? previouslyStoredCourse) + public async Task Save(LocalCourse course, LocalCourse previouslyStoredCourse) { var courseDirectory = $"{_basePath}/{course.Settings.Name}"; if (!Directory.Exists(courseDirectory)) Directory.CreateDirectory(courseDirectory); await saveSettings(course, courseDirectory); - await saveModules(course, courseDirectory); + await saveModules(course, courseDirectory, previouslyStoredCourse); } - private async Task saveModules(LocalCourse course, string courseDirectory) + private async Task saveModules(LocalCourse course, string courseDirectory, LocalCourse previouslyStoredCourse) { foreach (var module in course.Modules) { @@ -30,7 +31,7 @@ public class MarkdownCourseSaver Directory.CreateDirectory(moduleDirectory); await saveQuizzes(course, module); - await saveAssignments(course, module); + await saveAssignments(course, module, previouslyStoredCourse); } var moduleNames = course.Modules.Select(m => m.Name); @@ -91,7 +92,7 @@ public class MarkdownCourseSaver } - private async Task saveAssignments(LocalCourse course, LocalModule module) + private async Task saveAssignments(LocalCourse course, LocalModule module, LocalCourse? previouslyStoredCourse) { var assignmentsDirectory = $"{_basePath}/{course.Settings.Name}/{module.Name}/assignments"; if (!Directory.Exists(assignmentsDirectory)) @@ -99,11 +100,18 @@ public class MarkdownCourseSaver foreach (var assignment in module.Assignments) { - var assignmentMarkdown = assignment.ToMarkdown(); - var filePath = assignmentsDirectory + "/" + assignment.Name + ".md"; - await File.WriteAllTextAsync(filePath, assignmentMarkdown); - Console.WriteLine("saving file"); + var previousModule = previouslyStoredCourse?.Modules.FirstOrDefault(m => m.Name == module.Name); + var previousAssignment = previousModule?.Assignments.FirstOrDefault(a => a == assignment); + + if (previousAssignment == null) + { + var assignmentMarkdown = assignment.ToMarkdown(); + + var filePath = assignmentsDirectory + "/" + assignment.Name + ".md"; + await File.WriteAllTextAsync(filePath, assignmentMarkdown); + logger.Trace("saving assignment " + filePath); + } } removeOldAssignments(assignmentsDirectory, module); } diff --git a/Management/Services/Logger.cs b/Management/Services/Logger.cs deleted file mode 100644 index 172ae62..0000000 --- a/Management/Services/Logger.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Runtime.CompilerServices; - -namespace Management.Services; - - -public class MyLogger -{ - private readonly ILogger baseLogger; - - public MyLogger(ILogger baseLogger) - { - this.baseLogger = baseLogger; - } - - public void Log( - string message, - LogLevel logLevel = LogLevel.Information, - [CallerMemberName] string memberName = "" - ) - { - var finalMessage = $"[{typeof(T)}.{memberName}] {message}"; - - // baseLogger.Log(logLevel, finalMessage); - Console.WriteLine(finalMessage); - } -} \ No newline at end of file diff --git a/Management/Services/MyLogger.cs b/Management/Services/MyLogger.cs new file mode 100644 index 0000000..6bb22b5 --- /dev/null +++ b/Management/Services/MyLogger.cs @@ -0,0 +1,49 @@ +using System.Runtime.CompilerServices; + +namespace Management.Services; + + +public class MyLogger +{ + private readonly ILogger baseLogger; + + public MyLogger(ILogger baseLogger) + { + this.baseLogger = baseLogger; + } + + public void Log( + string message, + LogLevel logLevel = LogLevel.Information, + [CallerMemberName] string memberName = "" + ) + { + var finalMessage = $"[{typeof(T)}.{memberName}] {message}"; + + baseLogger.Log(logLevel, finalMessage); + Console.WriteLine(finalMessage); + } + + public void Trace( + string message, + LogLevel logLevel = LogLevel.Trace, + [CallerMemberName] string memberName = "" + ) + { + var finalMessage = $"[{typeof(T)}.{memberName}] {message}"; + + baseLogger.Log(logLevel, finalMessage); + Console.WriteLine(finalMessage); + } + public void Error( + string message, + LogLevel logLevel = LogLevel.Error, + [CallerMemberName] string memberName = "" + ) + { + var finalMessage = $"ERROR: [{typeof(T)}.{memberName}] {message}"; + + baseLogger.Log(logLevel, finalMessage); + Console.WriteLine(finalMessage); + } +} \ No newline at end of file