diff --git a/Management.Test/Services/CanvasServiceTests.cs b/Management.Test/Services/CanvasServiceTests.cs index 5afbcbe..1504306 100644 --- a/Management.Test/Services/CanvasServiceTests.cs +++ b/Management.Test/Services/CanvasServiceTests.cs @@ -7,7 +7,7 @@ // namespace Management.Test; -// public class CanvasServiceTests +// public class ICanvasServiceTests // { // [Test] // public async Task CanReadCanvasSemesters() @@ -22,7 +22,7 @@ // }; // Mock mockRequestor = getTermsMock(expectedTerms); -// var service = new CanvasService(mockRequestor.Object); +// var service = new ICanvasService(mockRequestor.Object); // var canvasTerms = await service.GetTerms(); // canvasTerms.Should().BeEquivalentTo(expectedTerms); @@ -58,7 +58,7 @@ // ), // }; // Mock mockRequestor = getTermsMock(expectedTerms); -// var service = new CanvasService(mockRequestor.Object); +// var service = new ICanvasService(mockRequestor.Object); // var queryDate = new DateTime(2022, 6, 1); // var canvasTerms = await service.GetCurrentTermsFor(queryDate); diff --git a/Management.Web/Management.Web.csproj b/Management.Web/Management.Web.csproj index 4213e61..510e607 100644 --- a/Management.Web/Management.Web.csproj +++ b/Management.Web/Management.Web.csproj @@ -9,10 +9,10 @@ - - - - + + + + diff --git a/Management.Web/Pages/AssignmentForm/AssignmentForm.razor b/Management.Web/Pages/AssignmentForm/AssignmentForm.razor index f39b278..883bb10 100644 --- a/Management.Web/Pages/AssignmentForm/AssignmentForm.razor +++ b/Management.Web/Pages/AssignmentForm/AssignmentForm.razor @@ -3,7 +3,7 @@ @using CanvasModel.Assignments @inject CoursePlanner planner -@inject CanvasService canvas +@inject ICanvasService canvas @inject NavigationManager Navigation @inject AssignmentEditorContext assignmentContext @@ -144,15 +144,15 @@ private async Task deleteFromCanvas() { - if (assignmentInCanvas == null - || planner?.LocalCourse?.Settings.CanvasId == null + if (assignmentInCanvas == null + || planner?.LocalCourse?.Settings.CanvasId == null || assignmentContext.Assignment == null ) return; - + deletingAssignmentFromCanvas = true; await canvas.Assignments.Delete( - (ulong)planner.LocalCourse.Settings.CanvasId, + (ulong)planner.LocalCourse.Settings.CanvasId, assignmentInCanvas.Id, assignmentContext.Assignment.Name ); @@ -186,8 +186,8 @@ Toggle Help - @if (assignmentInCanvas != null) { - View in Canvas - - } - @@ -138,15 +138,15 @@ } - + @if(planner.LocalCourse != null) {
Default Assignment Due Time
- @@ -156,11 +156,11 @@
-
- \ No newline at end of file + diff --git a/Management.Web/Pages/Course/Module/NewItemsButtons/NewModule.razor b/Management.Web/Pages/Course/Module/NewItemsButtons/NewModule.razor index ca056db..a34a00b 100644 --- a/Management.Web/Pages/Course/Module/NewItemsButtons/NewModule.razor +++ b/Management.Web/Pages/Course/Module/NewItemsButtons/NewModule.razor @@ -1,5 +1,5 @@ @inject CoursePlanner planner -@inject CanvasService canvas +@inject ICanvasService canvas @code { @@ -19,7 +19,7 @@ Name=Name }; - planner.LocalCourse = planner.LocalCourse with + planner.LocalCourse = planner.LocalCourse with { Modules = planner.LocalCourse.Modules.Append(newModule) }; diff --git a/Management.Web/Pages/CoursePageForm/CoursePageForm.razor b/Management.Web/Pages/CoursePageForm/CoursePageForm.razor index 0eea06e..6a3cc88 100644 --- a/Management.Web/Pages/CoursePageForm/CoursePageForm.razor +++ b/Management.Web/Pages/CoursePageForm/CoursePageForm.razor @@ -2,7 +2,7 @@ @using CanvasModel.Pages @inject CoursePlanner planner -@inject CanvasService canvas +@inject ICanvasService canvas @inject NavigationManager Navigation @inject PageEditorContext pageContext diff --git a/Management.Web/Pages/CoursePageForm/CoursePageFormPage.razor b/Management.Web/Pages/CoursePageForm/CoursePageFormPage.razor index be3e1e6..ad001c8 100644 --- a/Management.Web/Pages/CoursePageForm/CoursePageFormPage.razor +++ b/Management.Web/Pages/CoursePageForm/CoursePageFormPage.razor @@ -8,7 +8,7 @@ @using Management.Web.Shared.Components @inject FileStorageManager fileStorageManager -@inject CanvasService canvas +@inject ICanvasService canvas @inject CoursePlanner planner @inject PageEditorContext pageContext @inject ILogger logger diff --git a/Management.Web/Pages/Index.razor b/Management.Web/Pages/Index.razor index ab9db05..76aca8a 100644 --- a/Management.Web/Pages/Index.razor +++ b/Management.Web/Pages/Index.razor @@ -6,7 +6,7 @@ @using Management.Web.Pages.Course.Module.ModuleItems @using Management.Web.Shared.Components -@inject CanvasService canvas +@inject ICanvasService canvas @inject CoursePlanner planner diff --git a/Management.Web/Pages/QuizForm/QuizFormPage.razor b/Management.Web/Pages/QuizForm/QuizFormPage.razor index e6a7431..065819e 100644 --- a/Management.Web/Pages/QuizForm/QuizFormPage.razor +++ b/Management.Web/Pages/QuizForm/QuizFormPage.razor @@ -9,7 +9,7 @@ @using Management.Web.Pages.Course.Module.ModuleItems @inject FileStorageManager fileStorageManager -@inject CanvasService canvas +@inject ICanvasService canvas @inject CoursePlanner planner @inject QuizEditorContext quizContext @inject MyLogger logger diff --git a/Management.Web/Program.cs b/Management.Web/Program.cs index fb927bd..c19d8a9 100644 --- a/Management.Web/Program.cs +++ b/Management.Web/Program.cs @@ -73,12 +73,12 @@ builder.Services.AddScoped(typeof(MyLogger<>)); builder.Services.AddScoped(); builder.Services.AddScoped(); -builder.Services.AddScoped(); -builder.Services.AddScoped(); -builder.Services.AddScoped(); -builder.Services.AddScoped(); -builder.Services.AddScoped(); -builder.Services.AddScoped(); +builder.Services.AddScoped(); +builder.Services.AddScoped(); +builder.Services.AddScoped(); +builder.Services.AddScoped(); +builder.Services.AddScoped(); +builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); @@ -122,7 +122,6 @@ app.UseRouting(); app.UseResponseCompression(); app.MapBlazorHub(); -app.MapHub("/SignalRHub"); app.MapFallbackToPage("/_Host"); diff --git a/Management.Web/Shared/InitializeNewCourse.razor b/Management.Web/Shared/InitializeNewCourse.razor index 71e2849..98ac49e 100644 --- a/Management.Web/Shared/InitializeNewCourse.razor +++ b/Management.Web/Shared/InitializeNewCourse.razor @@ -4,7 +4,7 @@ @using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage @using LocalModels -@inject CanvasService canvas +@inject ICanvasService canvas @inject FileStorageManager fileStorageManager diff --git a/Management/Features/Configuration/AssignmentEditorContext.cs b/Management/Features/Configuration/AssignmentEditorContext.cs index d33411d..5b3f527 100644 --- a/Management/Features/Configuration/AssignmentEditorContext.cs +++ b/Management/Features/Configuration/AssignmentEditorContext.cs @@ -8,12 +8,12 @@ public class AssignmentEditorContext { public event Action? StateHasChanged; - public CanvasService canvas { get; } + public ICanvasService canvas { get; } private CoursePlanner planner { get; } public AssignmentEditorContext( MyLogger logger, - CanvasService canvas, + ICanvasService canvas, CoursePlanner planner ) { diff --git a/Management/Features/Configuration/CoursePlanner.cs b/Management/Features/Configuration/CoursePlanner.cs index 2e042e8..91f4889 100644 --- a/Management/Features/Configuration/CoursePlanner.cs +++ b/Management/Features/Configuration/CoursePlanner.cs @@ -16,7 +16,7 @@ public class CoursePlanner { private readonly MyLogger logger; private readonly FileStorageManager fileStorageManager; - private readonly CanvasService canvas; + private readonly ICanvasService canvas; private readonly ILogger _otherLogger; public bool LoadingCanvasData { get; internal set; } = false; @@ -24,7 +24,7 @@ public class CoursePlanner public CoursePlanner( MyLogger logger, FileStorageManager fileStorageManager, - CanvasService canvas, + ICanvasService canvas, ILogger otherLogger ) { diff --git a/Management/Features/Configuration/PageEditorContext.cs b/Management/Features/Configuration/PageEditorContext.cs index 9f46e0c..3475029 100644 --- a/Management/Features/Configuration/PageEditorContext.cs +++ b/Management/Features/Configuration/PageEditorContext.cs @@ -6,12 +6,12 @@ using Management.Services.Canvas; public class PageEditorContext( CoursePlanner planner, - CanvasService canvas, + ICanvasService canvas, MyLogger logger) { public event Action? StateHasChanged; private CoursePlanner planner { get; } = planner; - private CanvasService canvas { get; } = canvas; + private ICanvasService canvas { get; } = canvas; private readonly MyLogger logger = logger; diff --git a/Management/Features/Configuration/QuizEditorContext.cs b/Management/Features/Configuration/QuizEditorContext.cs index 1e966a4..9f860e7 100644 --- a/Management/Features/Configuration/QuizEditorContext.cs +++ b/Management/Features/Configuration/QuizEditorContext.cs @@ -7,12 +7,12 @@ using Management.Services.Canvas; public class QuizEditorContext( CoursePlanner planner, - CanvasService canvas, + ICanvasService canvas, MyLogger logger) { public event Action? StateHasChanged; private CoursePlanner planner { get; } = planner; - private CanvasService canvas { get; } = canvas; + private ICanvasService canvas { get; } = canvas; private readonly MyLogger logger = logger; diff --git a/Management/Features/Configuration/Synchronization/AssignemntGroupSyncronizationExtensions.cs b/Management/Features/Configuration/Synchronization/AssignemntGroupSyncronizationExtensions.cs index 8e4dadb..89568f2 100644 --- a/Management/Features/Configuration/Synchronization/AssignemntGroupSyncronizationExtensions.cs +++ b/Management/Features/Configuration/Synchronization/AssignemntGroupSyncronizationExtensions.cs @@ -11,7 +11,7 @@ public static partial class AssignmentGroupSyncronizationExtensions this LocalCourse localCourse, ulong courseCanvasId, IEnumerable canvasAssignmentGroups, - CanvasService canvas + ICanvasService canvas ) { var canvasAssignmentGroupIds = canvasAssignmentGroups.Select(g => g.Id).ToArray(); diff --git a/Management/Features/Configuration/Synchronization/AssignmentSyncronizationExtensions.cs b/Management/Features/Configuration/Synchronization/AssignmentSyncronizationExtensions.cs index c3469bf..3250a7c 100644 --- a/Management/Features/Configuration/Synchronization/AssignmentSyncronizationExtensions.cs +++ b/Management/Features/Configuration/Synchronization/AssignmentSyncronizationExtensions.cs @@ -16,7 +16,7 @@ public static partial class AssignmentSyncronizationExtensions ulong canvasCourseId, LocalAssignment localAssignment, IEnumerable canvasAssignments, - CanvasService canvas + ICanvasService canvas ) { var canvasAssignment = canvasAssignments.FirstOrDefault( @@ -42,7 +42,7 @@ public static partial class AssignmentSyncronizationExtensions ulong canvasCourseId, LocalAssignment localAssignment, CanvasAssignment canvasAssignment, - CanvasService canvas, + ICanvasService canvas, ulong? canvasAssignmentGroupId ) { diff --git a/Management/Features/Configuration/Synchronization/ModuleSyncronizationExtensions.cs b/Management/Features/Configuration/Synchronization/ModuleSyncronizationExtensions.cs index 06010ef..1b30db1 100644 --- a/Management/Features/Configuration/Synchronization/ModuleSyncronizationExtensions.cs +++ b/Management/Features/Configuration/Synchronization/ModuleSyncronizationExtensions.cs @@ -12,7 +12,7 @@ public static partial class ModuleSyncronizationExtensions // this LocalCourse localCourse, // ulong canvasId, // IEnumerable canvasModules, - // CanvasService canvas + // ICanvasService canvas // ) // { // var currentCanvasPositions = canvasModules.ToDictionary(m => m.Id, m => m.Position); @@ -34,7 +34,7 @@ public static partial class ModuleSyncronizationExtensions this LocalModule localModule, ulong canvasId, ulong moduleCanvasId, - CanvasService canvas + ICanvasService canvas ) { var canvasModuleItems = await canvas.Modules.GetModuleItems(canvasId, moduleCanvasId); @@ -79,7 +79,7 @@ public static partial class ModuleSyncronizationExtensions ulong canvasId, CanvasModule canvasModule, Dictionary> canvasModulesItems, - CanvasService canvas, + ICanvasService canvas, IEnumerable canvasAssignments ) { diff --git a/Management/Features/Configuration/Synchronization/PageSynchronizationExtension.cs b/Management/Features/Configuration/Synchronization/PageSynchronizationExtension.cs index 2e71a16..be8c7be 100644 --- a/Management/Features/Configuration/Synchronization/PageSynchronizationExtension.cs +++ b/Management/Features/Configuration/Synchronization/PageSynchronizationExtension.cs @@ -7,7 +7,7 @@ public static class PageSynchronizationExtension public static async Task AddPageToCanvas( this LocalCourse localCourse, LocalCoursePage localPage, - CanvasService canvas + ICanvasService canvas ) { if (localCourse.Settings.CanvasId == null) diff --git a/Management/Features/Configuration/Synchronization/QuizSyncronizationExtensions.cs b/Management/Features/Configuration/Synchronization/QuizSyncronizationExtensions.cs index 0b66c9a..cb77d8f 100644 --- a/Management/Features/Configuration/Synchronization/QuizSyncronizationExtensions.cs +++ b/Management/Features/Configuration/Synchronization/QuizSyncronizationExtensions.cs @@ -17,7 +17,7 @@ public static partial class QuizSyncronizationExtensions public static async Task AddQuizToCanvas( this LocalCourse localCourse, LocalQuiz localQuiz, - CanvasService canvas + ICanvasService canvas ) { if (localCourse.Settings.CanvasId == null) diff --git a/Management/Services/Canvas/CanvasAssignmentGroupService.cs b/Management/Services/Canvas/CanvasAssignmentGroupService.cs index 17b3670..91d7d9d 100644 --- a/Management/Services/Canvas/CanvasAssignmentGroupService.cs +++ b/Management/Services/Canvas/CanvasAssignmentGroupService.cs @@ -4,7 +4,15 @@ using RestSharp; namespace Management.Services.Canvas; -public class CanvasAssignmentGroupService + +public interface ICanvasAssignmentGroupService +{ + Task> GetAll(ulong courseId); + Task Create(ulong canvasCourseId, LocalAssignmentGroup localAssignmentGroup); + Task Update(ulong canvasCourseId, LocalAssignmentGroup localAssignmentGroup); + +} +public class CanvasAssignmentGroupService: ICanvasAssignmentGroupService { private readonly IWebRequestor webRequestor; private readonly CanvasServiceUtils utils; diff --git a/Management/Services/Canvas/CanvasAssignmentService.cs b/Management/Services/Canvas/CanvasAssignmentService.cs index 89dfc8e..c9a2828 100644 --- a/Management/Services/Canvas/CanvasAssignmentService.cs +++ b/Management/Services/Canvas/CanvasAssignmentService.cs @@ -3,12 +3,28 @@ using LocalModels; using RestSharp; namespace Management.Services.Canvas; - +public interface ICanvasAssignmentService +{ + Task> GetAll(ulong courseId); + Task Create( + ulong canvasCourseId, + LocalAssignment localAssignment, + ulong? canvasAssignmentGroupId + ); + Task Update( + ulong courseId, + ulong canvasAssignmentId, + LocalAssignment localAssignment, + ulong? canvasAssignmentGroupId + ); + Task Delete(ulong courseId, ulong assignmentCanvasId, string assignmentName); + Task CreateRubric(ulong courseId, ulong assignmentCanvasId, LocalAssignment localAssignment); +} public class CanvasAssignmentService( IWebRequestor webRequestor, CanvasServiceUtils utils, MyLogger logger - ) + ): ICanvasAssignmentService { private readonly IWebRequestor webRequestor = webRequestor; private readonly CanvasServiceUtils utils = utils; diff --git a/Management/Services/Canvas/CanvasCoursePageService.cs b/Management/Services/Canvas/CanvasCoursePageService.cs index fdbd730..985e899 100644 --- a/Management/Services/Canvas/CanvasCoursePageService.cs +++ b/Management/Services/Canvas/CanvasCoursePageService.cs @@ -6,11 +6,18 @@ using LocalModels; using RestSharp; namespace Management.Services.Canvas; +public interface ICanvasCoursePageService +{ + Task> GetAll(ulong courseId); + Task Create(ulong canvasCourseId, LocalCoursePage localCourse); + Task Update(ulong courseId, ulong canvasPageId, LocalCoursePage localCoursePage); + Task Delete(ulong courseId, ulong canvasPageId); +} public class CanvasCoursePageService( IWebRequestor webRequestor, CanvasServiceUtils utils, MyLogger logger - ) + ) : ICanvasCoursePageService { private readonly IWebRequestor webRequestor = webRequestor; private readonly CanvasServiceUtils utils = utils; diff --git a/Management/Services/Canvas/CanvasModuleService.cs b/Management/Services/Canvas/CanvasModuleService.cs index 6a864de..53ff61c 100644 --- a/Management/Services/Canvas/CanvasModuleService.cs +++ b/Management/Services/Canvas/CanvasModuleService.cs @@ -5,7 +5,18 @@ using RestSharp; namespace Management.Services.Canvas; -public class CanvasModuleService + +public interface ICanvasModuleService +{ + Task> GetModules(ulong courseId); + Task CreateModule(ulong courseId, string name); + Task UpdateModule(ulong courseId, ulong moduleId, string name, uint position); + Task> GetModuleItems(ulong courseId, ulong moduleId); + Task>> GetAllModulesItems(ulong courseId, IEnumerable modules); + +} + +public class CanvasModuleService: ICanvasModuleService { private readonly IWebRequestor webRequestor; diff --git a/Management/Services/Canvas/CanvasQuizService.cs b/Management/Services/Canvas/CanvasQuizService.cs index 35eaa2e..1b94291 100644 --- a/Management/Services/Canvas/CanvasQuizService.cs +++ b/Management/Services/Canvas/CanvasQuizService.cs @@ -4,16 +4,23 @@ using RestSharp; namespace Management.Services.Canvas; +public interface ICanvasQuizService +{ + Task> GetAll(ulong courseId); + Task Create(ulong canvasCourseId, LocalQuiz localQuiz, ulong? canvasAssignmentGroupId); + Task CreateQuizQuestions(ulong canvasCourseId, ulong canvasQuizId, LocalQuiz localQuiz); + +} public class CanvasQuizService( IWebRequestor webRequestor, CanvasServiceUtils utils, - CanvasAssignmentService assignments, + ICanvasAssignmentService assignments, ILogger logger -) +): ICanvasQuizService { private readonly IWebRequestor webRequestor = webRequestor; private readonly CanvasServiceUtils utils = utils; - private readonly CanvasAssignmentService assignments = assignments; + private readonly ICanvasAssignmentService assignments = assignments; private readonly ILogger logger = logger; public async Task> GetAll(ulong courseId) diff --git a/Management/Services/Canvas/CanvasService.cs b/Management/Services/Canvas/CanvasService.cs index 95619ab..3f961db 100644 --- a/Management/Services/Canvas/CanvasService.cs +++ b/Management/Services/Canvas/CanvasService.cs @@ -9,26 +9,43 @@ using RestSharp; namespace Management.Services.Canvas; +public interface ICanvasService +{ + ICanvasAssignmentService Assignments { get; } + ICanvasAssignmentGroupService AssignmentGroups { get; } + ICanvasModuleService Modules { get; } + ICanvasQuizService Quizzes { get; } + ICanvasCoursePageService Pages { get; } + Task> GetTerms(); + Task> GetCourses(ulong termId); + Task GetCourse(ulong courseId); + Task> GetCurrentTermsFor(DateTime? queryDate = null); + Task UpdateModuleItem(ulong canvasCourseId, ulong canvasModuleId, CanvasModuleItem item); + Task CreateModuleItem(ulong canvasCourseId, ulong canvasModuleId, string title, string type, ulong contentId); + Task CreateModuleItem(ulong canvasCourseId, ulong canvasModuleId, string title, string type, string contentId); + Task CreatePageModuleItem(ulong canvasCourseId, ulong canvasModuleId, string title, CanvasPage canvasPage); +} + public class CanvasService( IWebRequestor webRequestor, CanvasServiceUtils utils, - CanvasAssignmentService Assignments, - CanvasAssignmentGroupService AssignmentGroups, - CanvasModuleService Modules, - CanvasQuizService Quizzes, - CanvasCoursePageService Pages, - MyLogger logger -) + ICanvasAssignmentService Assignments, + ICanvasAssignmentGroupService AssignmentGroups, + ICanvasModuleService Modules, + ICanvasQuizService Quizzes, + ICanvasCoursePageService Pages, + MyLogger logger +):ICanvasService { private readonly IWebRequestor webRequestor = webRequestor; private readonly CanvasServiceUtils utils = utils; - private readonly MyLogger logger = logger; + private readonly MyLogger logger = logger; - public CanvasAssignmentService Assignments { get; } = Assignments; - public CanvasAssignmentGroupService AssignmentGroups { get; } = AssignmentGroups; - public CanvasModuleService Modules { get; } = Modules; - public CanvasQuizService Quizzes { get; } = Quizzes; - public CanvasCoursePageService Pages { get; } = Pages; + public ICanvasAssignmentService Assignments { get; } = Assignments; + public ICanvasAssignmentGroupService AssignmentGroups { get; } = AssignmentGroups; + public ICanvasModuleService Modules { get; } = Modules; + public ICanvasQuizService Quizzes { get; } = Quizzes; + public ICanvasCoursePageService Pages { get; } = Pages; public async Task> GetTerms() { diff --git a/Management/Services/Canvas/CanvasServiceUtils.cs b/Management/Services/Canvas/CanvasServiceUtils.cs index 936fc71..24ccdb0 100644 --- a/Management/Services/Canvas/CanvasServiceUtils.cs +++ b/Management/Services/Canvas/CanvasServiceUtils.cs @@ -2,6 +2,7 @@ using RestSharp; namespace Management.Services.Canvas; + public class CanvasServiceUtils { private const string BaseUrl = "https://snow.instructure.com/api/v1/"; diff --git a/Management/SignalRHub.cs b/Management/SignalRHub.cs deleted file mode 100644 index 5379340..0000000 --- a/Management/SignalRHub.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Microsoft.AspNetCore.SignalR; - -public class SignalRHub : Hub -{ - public async Task SendMessage(string user, string message) - { - await Clients.All.SendAsync("ReceiveMessage", user, message); - } - public override Task OnConnectedAsync() - { - var connectionId = Context.ConnectionId; - // Store the connection ID for later use, e.g., in a database or in-memory store - return base.OnConnectedAsync(); - } -} diff --git a/README.md b/README.md index 26ab2be..6022bf0 100644 --- a/README.md +++ b/README.md @@ -46,3 +46,5 @@ make the ux easier to change course pages schedule planning view? just outline concepts? (maybe some non-canvas scheduled thing that only shows up in planner? like a note, could be de-emphasized in webpage) holiday schedule + +multi-seciton support for due dates/times