extracted a lot of canvas interfaces

This commit is contained in:
2024-05-03 15:22:26 -06:00
parent 353bd6df82
commit 9bae17a2a6
34 changed files with 183 additions and 130 deletions

View File

@@ -7,7 +7,7 @@
// namespace Management.Test; // namespace Management.Test;
// public class CanvasServiceTests // public class ICanvasServiceTests
// { // {
// [Test] // [Test]
// public async Task CanReadCanvasSemesters() // public async Task CanReadCanvasSemesters()
@@ -22,7 +22,7 @@
// }; // };
// Mock<IWebRequestor> mockRequestor = getTermsMock(expectedTerms); // Mock<IWebRequestor> mockRequestor = getTermsMock(expectedTerms);
// var service = new CanvasService(mockRequestor.Object); // var service = new ICanvasService(mockRequestor.Object);
// var canvasTerms = await service.GetTerms(); // var canvasTerms = await service.GetTerms();
// canvasTerms.Should().BeEquivalentTo(expectedTerms); // canvasTerms.Should().BeEquivalentTo(expectedTerms);
@@ -58,7 +58,7 @@
// ), // ),
// }; // };
// Mock<IWebRequestor> mockRequestor = getTermsMock(expectedTerms); // Mock<IWebRequestor> mockRequestor = getTermsMock(expectedTerms);
// var service = new CanvasService(mockRequestor.Object); // var service = new ICanvasService(mockRequestor.Object);
// var queryDate = new DateTime(2022, 6, 1); // var queryDate = new DateTime(2022, 6, 1);
// var canvasTerms = await service.GetCurrentTermsFor(queryDate); // var canvasTerms = await service.GetCurrentTermsFor(queryDate);

View File

@@ -9,10 +9,10 @@
<PackageReference Include="dotenv.net" Version="3.1.2" /> <PackageReference Include="dotenv.net" Version="3.1.2" />
<PackageReference Include="Markdig" Version="0.31.0" /> <PackageReference Include="Markdig" Version="0.31.0" />
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="8.0.3" /> <PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="8.0.3" />
<PackageReference Include="OpenTelemetry.Exporter.Console" Version="1.7.0" /> <PackageReference Include="OpenTelemetry.Exporter.Console" Version="1.8.1" />
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.7.0" /> <PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.8.1" />
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.7.0" /> <PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.8.1" />
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.7.0" /> <PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.8.1" />
</ItemGroup> </ItemGroup>
<PropertyGroup> <PropertyGroup>

View File

@@ -3,7 +3,7 @@
@using CanvasModel.Assignments @using CanvasModel.Assignments
@inject CoursePlanner planner @inject CoursePlanner planner
@inject CanvasService canvas @inject ICanvasService canvas
@inject NavigationManager Navigation @inject NavigationManager Navigation
@inject AssignmentEditorContext assignmentContext @inject AssignmentEditorContext assignmentContext
@@ -144,15 +144,15 @@
private async Task deleteFromCanvas() private async Task deleteFromCanvas()
{ {
if (assignmentInCanvas == null if (assignmentInCanvas == null
|| planner?.LocalCourse?.Settings.CanvasId == null || planner?.LocalCourse?.Settings.CanvasId == null
|| assignmentContext.Assignment == null || assignmentContext.Assignment == null
) )
return; return;
deletingAssignmentFromCanvas = true; deletingAssignmentFromCanvas = true;
await canvas.Assignments.Delete( await canvas.Assignments.Delete(
(ulong)planner.LocalCourse.Settings.CanvasId, (ulong)planner.LocalCourse.Settings.CanvasId,
assignmentInCanvas.Id, assignmentInCanvas.Id,
assignmentContext.Assignment.Name assignmentContext.Assignment.Name
); );
@@ -186,8 +186,8 @@
Toggle Help Toggle Help
</button> </button>
<ConfirmationModal Label="Delete" Class="btn btn-danger" OnConfirmAsync="HandleDelete" /> <ConfirmationModal Label="Delete" Class="btn btn-danger" OnConfirmAsync="HandleDelete" />
<button <button
class="btn btn-outline-secondary mx-3" class="btn btn-outline-secondary mx-3"
disabled="@(addingAssignmentToCanvas || deletingAssignmentFromCanvas)" disabled="@(addingAssignmentToCanvas || deletingAssignmentFromCanvas)"
@onclick="addToCanvas" @onclick="addToCanvas"
> >
@@ -195,26 +195,26 @@
</button> </button>
@if (assignmentInCanvas != null) @if (assignmentInCanvas != null)
{ {
<a <a
class="btn btn-outline-secondary me-1" class="btn btn-outline-secondary me-1"
href="@canvasAssignmentUrl" href="@canvasAssignmentUrl"
target="_blank" target="_blank"
disabled="@(addingAssignmentToCanvas || deletingAssignmentFromCanvas)" disabled="@(addingAssignmentToCanvas || deletingAssignmentFromCanvas)"
> >
View in Canvas View in Canvas
</a> </a>
<button <button
class="btn btn-outline-secondary mx-3" class="btn btn-outline-secondary mx-3"
disabled="@(addingAssignmentToCanvas || deletingAssignmentFromCanvas)" disabled="@(addingAssignmentToCanvas || deletingAssignmentFromCanvas)"
@onclick="updateInCanvas" @onclick="updateInCanvas"
> >
Update In Canvas Update In Canvas
</button> </button>
<ConfirmationModal <ConfirmationModal
Disabled="@(addingAssignmentToCanvas || deletingAssignmentFromCanvas)" Disabled="@(addingAssignmentToCanvas || deletingAssignmentFromCanvas)"
Label="Delete from Canvas" Label="Delete from Canvas"
Class="btn btn-outline-danger mx-3" Class="btn btn-outline-danger mx-3"
OnConfirmAsync="deleteFromCanvas" OnConfirmAsync="deleteFromCanvas"
/> />
} }
<button class="btn btn-primary mx-2" @onclick="@(() => { <button class="btn btn-primary mx-2" @onclick="@(() => {
@@ -225,5 +225,5 @@
</button> </button>
</div> </div>
</div> </div>

View File

@@ -8,7 +8,7 @@
@using Management.Web.Shared.Components @using Management.Web.Shared.Components
@inject FileStorageManager fileStorageManager @inject FileStorageManager fileStorageManager
@inject CanvasService canvas @inject ICanvasService canvas
@inject CoursePlanner planner @inject CoursePlanner planner
@inject AssignmentEditorContext assignmentContext @inject AssignmentEditorContext assignmentContext
@inject ILogger<AssignmentFormPage> logger @inject ILogger<AssignmentFormPage> logger

View File

@@ -1,7 +1,7 @@
@page "/test" @page "/test"
@rendermode InteractiveServer @rendermode InteractiveServer
@inject CanvasService canvas @inject ICanvasService canvas
@inject CoursePlanner planner @inject CoursePlanner planner
@inject FileStorageManager fileStorageManager @inject FileStorageManager fileStorageManager
@inject NavigationManager Navigation @inject NavigationManager Navigation

View File

@@ -1,5 +1,5 @@
@using Management.Web.Shared.Components @using Management.Web.Shared.Components
@inject CanvasService canvas @inject ICanvasService canvas
@inject CoursePlanner planner @inject CoursePlanner planner
@@ -42,7 +42,7 @@
private Action<ChangeEventArgs> saveGroupName(string groupId) private Action<ChangeEventArgs> saveGroupName(string groupId)
{ {
return (e) => return (e) =>
{ {
if(planner.LocalCourse != null) if(planner.LocalCourse != null)
{ {
@@ -54,17 +54,17 @@
); );
planner.LocalCourse = planner.LocalCourse with planner.LocalCourse = planner.LocalCourse with
{ {
Settings = planner.LocalCourse.Settings with Settings = planner.LocalCourse.Settings with
{ {
AssignmentGroups = newGroups AssignmentGroups = newGroups
} }
}; };
} }
}; };
} }
private Action<ChangeEventArgs> saveGroupWeight(string groupId) private Action<ChangeEventArgs> saveGroupWeight(string groupId)
{ {
return (e) => return (e) =>
{ {
if(planner.LocalCourse != null) if(planner.LocalCourse != null)
{ {
@@ -76,13 +76,13 @@
); );
planner.LocalCourse = planner.LocalCourse with planner.LocalCourse = planner.LocalCourse with
{ {
Settings = planner.LocalCourse.Settings with Settings = planner.LocalCourse.Settings with
{ {
AssignmentGroups = newGroups AssignmentGroups = newGroups
} }
}; };
} }
}; };
} }
private async Task SyncAssignmentGroupsWithCanvas() private async Task SyncAssignmentGroupsWithCanvas()
@@ -105,13 +105,13 @@
<div class="row"> <div class="row">
<div class="col-auto"> <div class="col-auto">
<label class="form-label">Group Name</label> <label class="form-label">Group Name</label>
<input <input
class="form-control" class="form-control"
@bind="groupName" @oninput="nameInputCallback"> @bind="groupName" @oninput="nameInputCallback">
</div> </div>
<div class="col-auto"> <div class="col-auto">
<label class="form-label">Weight</label> <label class="form-label">Weight</label>
<input <input
class="form-control" class="form-control"
@bind="weight" @bind="weight"
@oninput="weightInputCallback" @oninput="weightInputCallback"
@@ -120,7 +120,7 @@
</div> </div>
} }
<div class="d-flex justify-content-end"> <div class="d-flex justify-content-end">
<button <button
class="btn btn-outline-primary" class="btn btn-outline-primary"
@onclick="AddAssignmentGroup" @onclick="AddAssignmentGroup"
> >
@@ -128,7 +128,7 @@
</button> </button>
</div> </div>
<button <button
class="btn btn-outline-secondary" class="btn btn-outline-secondary"
@onclick="SyncAssignmentGroupsWithCanvas" @onclick="SyncAssignmentGroupsWithCanvas"
disabled="@syncingAssignmentGroups" disabled="@syncingAssignmentGroups"

View File

@@ -8,7 +8,7 @@
@inject FileStorageManager fileStorageManager @inject FileStorageManager fileStorageManager
@inject CanvasService canvas @inject ICanvasService canvas
@inject CoursePlanner planner @inject CoursePlanner planner
@inject NavigationManager navigtion @inject NavigationManager navigtion
@inject IConfiguration config @inject IConfiguration config

View File

@@ -3,7 +3,7 @@
@using Management.Web.Pages.Course.Module @using Management.Web.Pages.Course.Module
@using Management.Web.Pages.Course.CourseCalendar @using Management.Web.Pages.Course.CourseCalendar
@inject CanvasService canvas @inject ICanvasService canvas
@inject CoursePlanner planner @inject CoursePlanner planner
@code @code

View File

@@ -1,5 +1,5 @@
@using Management.Web.Shared.Components @using Management.Web.Shared.Components
@inject CanvasService canvas @inject ICanvasService canvas
@inject CoursePlanner planner @inject CoursePlanner planner
@code @code
@@ -19,23 +19,23 @@
} }
private IEnumerable<EnrollmentTermModel>? terms { get; set; } = null; private IEnumerable<EnrollmentTermModel>? terms { get; set; } = null;
private ulong? _selectedTermId {get; set;} private ulong? _selectedTermId {get; set;}
private ulong? selectedTermId { private ulong? selectedTermId {
get => _selectedTermId; get => _selectedTermId;
set set
{ {
_selectedTermId = value; _selectedTermId = value;
if(selectedTerm != null && planner.LocalCourse != null) if(selectedTerm != null && planner.LocalCourse != null)
{ {
planner.LocalCourse = planner.LocalCourse with planner.LocalCourse = planner.LocalCourse with
{ {
Settings = planner.LocalCourse.Settings with Settings = planner.LocalCourse.Settings with
{ {
StartDate=selectedTerm.StartAt ?? new DateTime(), StartDate=selectedTerm.StartAt ?? new DateTime(),
EndDate=selectedTerm.EndAt ?? new DateTime(), EndDate=selectedTerm.EndAt ?? new DateTime(),
} }
}; };
} }
} }
} }
private EnrollmentTermModel? selectedTerm private EnrollmentTermModel? selectedTerm
{ {
@@ -59,8 +59,8 @@
} }
<button <button
class="btn btn-outline-secondary" class="btn btn-outline-secondary"
@onclick="@(() => modal.Show())" @onclick="@(() => modal.Show())"
> >
Edit Course Settings Edit Course Settings
@@ -71,7 +71,7 @@
<h1>Course Settings</h1> <h1>Course Settings</h1>
</Title> </Title>
<Body> <Body>
<h5 class="text-center">Select Days Of Week</h5> <h5 class="text-center">Select Days Of Week</h5>
<div class="row m-3"> <div class="row m-3">
@foreach (DayOfWeek day in (DayOfWeek[])Enum.GetValues(typeof(DayOfWeek))) @foreach (DayOfWeek day in (DayOfWeek[])Enum.GetValues(typeof(DayOfWeek)))
@@ -80,16 +80,16 @@
<button <button
class="@( class="@(
planner.LocalCourse?.Settings.DaysOfWeek.Contains(day) ?? false planner.LocalCourse?.Settings.DaysOfWeek.Contains(day) ?? false
? "btn btn-secondary" ? "btn btn-secondary"
: "btn btn-outline-secondary" : "btn btn-outline-secondary"
)" )"
@onclick="() => @onclick="() =>
{ {
if(planner.LocalCourse?.Settings.DaysOfWeek.Contains(day) ?? false) if(planner.LocalCourse?.Settings.DaysOfWeek.Contains(day) ?? false)
{ {
planner.LocalCourse = planner.LocalCourse with planner.LocalCourse = planner.LocalCourse with
{ {
Settings = planner.LocalCourse.Settings with Settings = planner.LocalCourse.Settings with
{ {
DaysOfWeek = planner.LocalCourse.Settings.DaysOfWeek.Where((d) => d != day) DaysOfWeek = planner.LocalCourse.Settings.DaysOfWeek.Where((d) => d != day)
} }
@@ -99,16 +99,16 @@
{ {
if (planner.LocalCourse != null) if (planner.LocalCourse != null)
{ {
planner.LocalCourse = planner.LocalCourse with planner.LocalCourse = planner.LocalCourse with
{ {
Settings = planner.LocalCourse.Settings with Settings = planner.LocalCourse.Settings with
{ {
DaysOfWeek = planner.LocalCourse.Settings.DaysOfWeek.Append(day) DaysOfWeek = planner.LocalCourse.Settings.DaysOfWeek.Append(day)
} }
}; };
} }
} }
}" }"
> >
@day @day
</button> </button>
@@ -138,15 +138,15 @@
</div> </div>
} }
@if(planner.LocalCourse != null) @if(planner.LocalCourse != null)
{ {
<div class="row justify-content-center m-3 text-center"> <div class="row justify-content-center m-3 text-center">
<div class="col-auto"> <div class="col-auto">
<div>Default Assignment Due Time</div> <div>Default Assignment Due Time</div>
<TimePicker Time="planner.LocalCourse.Settings.DefaultDueTime" UpdateTime="@((newTime) => <TimePicker Time="planner.LocalCourse.Settings.DefaultDueTime" UpdateTime="@((newTime) =>
planner.LocalCourse = planner.LocalCourse =
planner.LocalCourse with planner.LocalCourse with
{ Settings = planner.LocalCourse.Settings with { DefaultDueTime=newTime } } { Settings = planner.LocalCourse.Settings with { DefaultDueTime=newTime } }
)" )"
/> />
@@ -156,11 +156,11 @@
<AssignmentGroups /> <AssignmentGroups />
</Body> </Body>
<Footer> <Footer>
<button <button
class="btn btn-outline-secondary" class="btn btn-outline-secondary"
@onclick="@(() => modal.Hide())" @onclick="@(() => modal.Hide())"
> >
Done Editing Course Settings Done Editing Course Settings
</button> </button>
</Footer> </Footer>
</Modal> </Modal>

View File

@@ -1,5 +1,5 @@
@inject CoursePlanner planner @inject CoursePlanner planner
@inject CanvasService canvas @inject ICanvasService canvas
@code { @code {
@@ -19,7 +19,7 @@
Name=Name Name=Name
}; };
planner.LocalCourse = planner.LocalCourse with planner.LocalCourse = planner.LocalCourse with
{ {
Modules = planner.LocalCourse.Modules.Append(newModule) Modules = planner.LocalCourse.Modules.Append(newModule)
}; };

View File

@@ -2,7 +2,7 @@
@using CanvasModel.Pages @using CanvasModel.Pages
@inject CoursePlanner planner @inject CoursePlanner planner
@inject CanvasService canvas @inject ICanvasService canvas
@inject NavigationManager Navigation @inject NavigationManager Navigation
@inject PageEditorContext pageContext @inject PageEditorContext pageContext

View File

@@ -8,7 +8,7 @@
@using Management.Web.Shared.Components @using Management.Web.Shared.Components
@inject FileStorageManager fileStorageManager @inject FileStorageManager fileStorageManager
@inject CanvasService canvas @inject ICanvasService canvas
@inject CoursePlanner planner @inject CoursePlanner planner
@inject PageEditorContext pageContext @inject PageEditorContext pageContext
@inject ILogger<CoursePageFormPage> logger @inject ILogger<CoursePageFormPage> logger

View File

@@ -6,7 +6,7 @@
@using Management.Web.Pages.Course.Module.ModuleItems @using Management.Web.Pages.Course.Module.ModuleItems
@using Management.Web.Shared.Components @using Management.Web.Shared.Components
@inject CanvasService canvas @inject ICanvasService canvas
@inject CoursePlanner planner @inject CoursePlanner planner

View File

@@ -9,7 +9,7 @@
@using Management.Web.Pages.Course.Module.ModuleItems @using Management.Web.Pages.Course.Module.ModuleItems
@inject FileStorageManager fileStorageManager @inject FileStorageManager fileStorageManager
@inject CanvasService canvas @inject ICanvasService canvas
@inject CoursePlanner planner @inject CoursePlanner planner
@inject QuizEditorContext quizContext @inject QuizEditorContext quizContext
@inject MyLogger<QuizFormPage> logger @inject MyLogger<QuizFormPage> logger

View File

@@ -73,12 +73,12 @@ builder.Services.AddScoped(typeof(MyLogger<>));
builder.Services.AddScoped<IWebRequestor, WebRequestor>(); builder.Services.AddScoped<IWebRequestor, WebRequestor>();
builder.Services.AddScoped<CanvasServiceUtils>(); builder.Services.AddScoped<CanvasServiceUtils>();
builder.Services.AddScoped<CanvasAssignmentService>(); builder.Services.AddScoped<ICanvasAssignmentService, CanvasAssignmentService>();
builder.Services.AddScoped<CanvasCoursePageService>(); builder.Services.AddScoped<ICanvasCoursePageService, CanvasCoursePageService>();
builder.Services.AddScoped<CanvasAssignmentGroupService>(); builder.Services.AddScoped<ICanvasAssignmentGroupService, CanvasAssignmentGroupService>();
builder.Services.AddScoped<CanvasQuizService>(); builder.Services.AddScoped<ICanvasQuizService, CanvasQuizService>();
builder.Services.AddScoped<CanvasModuleService>(); builder.Services.AddScoped<ICanvasModuleService, CanvasModuleService>();
builder.Services.AddScoped<CanvasService, CanvasService>(); builder.Services.AddScoped<ICanvasService, CanvasService>();
builder.Services.AddScoped<MarkdownCourseSaver>(); builder.Services.AddScoped<MarkdownCourseSaver>();
builder.Services.AddScoped<CourseMarkdownLoader>(); builder.Services.AddScoped<CourseMarkdownLoader>();
@@ -122,7 +122,6 @@ app.UseRouting();
app.UseResponseCompression(); app.UseResponseCompression();
app.MapBlazorHub(); app.MapBlazorHub();
app.MapHub<SignalRHub>("/SignalRHub");
app.MapFallbackToPage("/_Host"); app.MapFallbackToPage("/_Host");

View File

@@ -4,7 +4,7 @@
@using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage @using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage
@using LocalModels @using LocalModels
@inject CanvasService canvas @inject ICanvasService canvas
@inject FileStorageManager fileStorageManager @inject FileStorageManager fileStorageManager

View File

@@ -8,12 +8,12 @@ public class AssignmentEditorContext
{ {
public event Action? StateHasChanged; public event Action? StateHasChanged;
public CanvasService canvas { get; } public ICanvasService canvas { get; }
private CoursePlanner planner { get; } private CoursePlanner planner { get; }
public AssignmentEditorContext( public AssignmentEditorContext(
MyLogger<AssignmentEditorContext> logger, MyLogger<AssignmentEditorContext> logger,
CanvasService canvas, ICanvasService canvas,
CoursePlanner planner CoursePlanner planner
) )
{ {

View File

@@ -16,7 +16,7 @@ public class CoursePlanner
{ {
private readonly MyLogger<CoursePlanner> logger; private readonly MyLogger<CoursePlanner> logger;
private readonly FileStorageManager fileStorageManager; private readonly FileStorageManager fileStorageManager;
private readonly CanvasService canvas; private readonly ICanvasService canvas;
private readonly ILogger<CoursePlanner> _otherLogger; private readonly ILogger<CoursePlanner> _otherLogger;
public bool LoadingCanvasData { get; internal set; } = false; public bool LoadingCanvasData { get; internal set; } = false;
@@ -24,7 +24,7 @@ public class CoursePlanner
public CoursePlanner( public CoursePlanner(
MyLogger<CoursePlanner> logger, MyLogger<CoursePlanner> logger,
FileStorageManager fileStorageManager, FileStorageManager fileStorageManager,
CanvasService canvas, ICanvasService canvas,
ILogger<CoursePlanner> otherLogger ILogger<CoursePlanner> otherLogger
) )
{ {

View File

@@ -6,12 +6,12 @@ using Management.Services.Canvas;
public class PageEditorContext( public class PageEditorContext(
CoursePlanner planner, CoursePlanner planner,
CanvasService canvas, ICanvasService canvas,
MyLogger<PageEditorContext> logger) MyLogger<PageEditorContext> logger)
{ {
public event Action? StateHasChanged; public event Action? StateHasChanged;
private CoursePlanner planner { get; } = planner; private CoursePlanner planner { get; } = planner;
private CanvasService canvas { get; } = canvas; private ICanvasService canvas { get; } = canvas;
private readonly MyLogger<PageEditorContext> logger = logger; private readonly MyLogger<PageEditorContext> logger = logger;

View File

@@ -7,12 +7,12 @@ using Management.Services.Canvas;
public class QuizEditorContext( public class QuizEditorContext(
CoursePlanner planner, CoursePlanner planner,
CanvasService canvas, ICanvasService canvas,
MyLogger<QuizEditorContext> logger) MyLogger<QuizEditorContext> logger)
{ {
public event Action? StateHasChanged; public event Action? StateHasChanged;
private CoursePlanner planner { get; } = planner; private CoursePlanner planner { get; } = planner;
private CanvasService canvas { get; } = canvas; private ICanvasService canvas { get; } = canvas;
private readonly MyLogger<QuizEditorContext> logger = logger; private readonly MyLogger<QuizEditorContext> logger = logger;

View File

@@ -11,7 +11,7 @@ public static partial class AssignmentGroupSyncronizationExtensions
this LocalCourse localCourse, this LocalCourse localCourse,
ulong courseCanvasId, ulong courseCanvasId,
IEnumerable<CanvasAssignmentGroup> canvasAssignmentGroups, IEnumerable<CanvasAssignmentGroup> canvasAssignmentGroups,
CanvasService canvas ICanvasService canvas
) )
{ {
var canvasAssignmentGroupIds = canvasAssignmentGroups.Select(g => g.Id).ToArray(); var canvasAssignmentGroupIds = canvasAssignmentGroups.Select(g => g.Id).ToArray();

View File

@@ -16,7 +16,7 @@ public static partial class AssignmentSyncronizationExtensions
ulong canvasCourseId, ulong canvasCourseId,
LocalAssignment localAssignment, LocalAssignment localAssignment,
IEnumerable<CanvasAssignment> canvasAssignments, IEnumerable<CanvasAssignment> canvasAssignments,
CanvasService canvas ICanvasService canvas
) )
{ {
var canvasAssignment = canvasAssignments.FirstOrDefault( var canvasAssignment = canvasAssignments.FirstOrDefault(
@@ -42,7 +42,7 @@ public static partial class AssignmentSyncronizationExtensions
ulong canvasCourseId, ulong canvasCourseId,
LocalAssignment localAssignment, LocalAssignment localAssignment,
CanvasAssignment canvasAssignment, CanvasAssignment canvasAssignment,
CanvasService canvas, ICanvasService canvas,
ulong? canvasAssignmentGroupId ulong? canvasAssignmentGroupId
) )
{ {

View File

@@ -12,7 +12,7 @@ public static partial class ModuleSyncronizationExtensions
// this LocalCourse localCourse, // this LocalCourse localCourse,
// ulong canvasId, // ulong canvasId,
// IEnumerable<CanvasModule> canvasModules, // IEnumerable<CanvasModule> canvasModules,
// CanvasService canvas // ICanvasService canvas
// ) // )
// { // {
// var currentCanvasPositions = canvasModules.ToDictionary(m => m.Id, m => m.Position); // var currentCanvasPositions = canvasModules.ToDictionary(m => m.Id, m => m.Position);
@@ -34,7 +34,7 @@ public static partial class ModuleSyncronizationExtensions
this LocalModule localModule, this LocalModule localModule,
ulong canvasId, ulong canvasId,
ulong moduleCanvasId, ulong moduleCanvasId,
CanvasService canvas ICanvasService canvas
) )
{ {
var canvasModuleItems = await canvas.Modules.GetModuleItems(canvasId, moduleCanvasId); var canvasModuleItems = await canvas.Modules.GetModuleItems(canvasId, moduleCanvasId);
@@ -79,7 +79,7 @@ public static partial class ModuleSyncronizationExtensions
ulong canvasId, ulong canvasId,
CanvasModule canvasModule, CanvasModule canvasModule,
Dictionary<CanvasModule, IEnumerable<CanvasModuleItem>> canvasModulesItems, Dictionary<CanvasModule, IEnumerable<CanvasModuleItem>> canvasModulesItems,
CanvasService canvas, ICanvasService canvas,
IEnumerable<CanvasAssignment> canvasAssignments IEnumerable<CanvasAssignment> canvasAssignments
) )
{ {

View File

@@ -7,7 +7,7 @@ public static class PageSynchronizationExtension
public static async Task<CanvasPage?> AddPageToCanvas( public static async Task<CanvasPage?> AddPageToCanvas(
this LocalCourse localCourse, this LocalCourse localCourse,
LocalCoursePage localPage, LocalCoursePage localPage,
CanvasService canvas ICanvasService canvas
) )
{ {
if (localCourse.Settings.CanvasId == null) if (localCourse.Settings.CanvasId == null)

View File

@@ -17,7 +17,7 @@ public static partial class QuizSyncronizationExtensions
public static async Task<ulong?> AddQuizToCanvas( public static async Task<ulong?> AddQuizToCanvas(
this LocalCourse localCourse, this LocalCourse localCourse,
LocalQuiz localQuiz, LocalQuiz localQuiz,
CanvasService canvas ICanvasService canvas
) )
{ {
if (localCourse.Settings.CanvasId == null) if (localCourse.Settings.CanvasId == null)

View File

@@ -4,7 +4,15 @@ using RestSharp;
namespace Management.Services.Canvas; namespace Management.Services.Canvas;
public class CanvasAssignmentGroupService
public interface ICanvasAssignmentGroupService
{
Task<IEnumerable<CanvasAssignmentGroup>> GetAll(ulong courseId);
Task<LocalAssignmentGroup> Create(ulong canvasCourseId, LocalAssignmentGroup localAssignmentGroup);
Task Update(ulong canvasCourseId, LocalAssignmentGroup localAssignmentGroup);
}
public class CanvasAssignmentGroupService: ICanvasAssignmentGroupService
{ {
private readonly IWebRequestor webRequestor; private readonly IWebRequestor webRequestor;
private readonly CanvasServiceUtils utils; private readonly CanvasServiceUtils utils;

View File

@@ -3,12 +3,28 @@ using LocalModels;
using RestSharp; using RestSharp;
namespace Management.Services.Canvas; namespace Management.Services.Canvas;
public interface ICanvasAssignmentService
{
Task<IEnumerable<CanvasAssignment>> GetAll(ulong courseId);
Task<ulong> 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( public class CanvasAssignmentService(
IWebRequestor webRequestor, IWebRequestor webRequestor,
CanvasServiceUtils utils, CanvasServiceUtils utils,
MyLogger<CanvasAssignmentService> logger MyLogger<CanvasAssignmentService> logger
) ): ICanvasAssignmentService
{ {
private readonly IWebRequestor webRequestor = webRequestor; private readonly IWebRequestor webRequestor = webRequestor;
private readonly CanvasServiceUtils utils = utils; private readonly CanvasServiceUtils utils = utils;

View File

@@ -6,11 +6,18 @@ using LocalModels;
using RestSharp; using RestSharp;
namespace Management.Services.Canvas; namespace Management.Services.Canvas;
public interface ICanvasCoursePageService
{
Task<IEnumerable<CanvasPage>> GetAll(ulong courseId);
Task<CanvasPage> Create(ulong canvasCourseId, LocalCoursePage localCourse);
Task Update(ulong courseId, ulong canvasPageId, LocalCoursePage localCoursePage);
Task Delete(ulong courseId, ulong canvasPageId);
}
public class CanvasCoursePageService( public class CanvasCoursePageService(
IWebRequestor webRequestor, IWebRequestor webRequestor,
CanvasServiceUtils utils, CanvasServiceUtils utils,
MyLogger<CanvasCoursePageService> logger MyLogger<CanvasCoursePageService> logger
) ) : ICanvasCoursePageService
{ {
private readonly IWebRequestor webRequestor = webRequestor; private readonly IWebRequestor webRequestor = webRequestor;
private readonly CanvasServiceUtils utils = utils; private readonly CanvasServiceUtils utils = utils;

View File

@@ -5,7 +5,18 @@ using RestSharp;
namespace Management.Services.Canvas; namespace Management.Services.Canvas;
public class CanvasModuleService
public interface ICanvasModuleService
{
Task<IEnumerable<CanvasModule>> GetModules(ulong courseId);
Task<CanvasModule> CreateModule(ulong courseId, string name);
Task UpdateModule(ulong courseId, ulong moduleId, string name, uint position);
Task<IEnumerable<CanvasModuleItem>> GetModuleItems(ulong courseId, ulong moduleId);
Task<Dictionary<CanvasModule, IEnumerable<CanvasModuleItem>>> GetAllModulesItems(ulong courseId, IEnumerable<CanvasModule> modules);
}
public class CanvasModuleService: ICanvasModuleService
{ {
private readonly IWebRequestor webRequestor; private readonly IWebRequestor webRequestor;

View File

@@ -4,16 +4,23 @@ using RestSharp;
namespace Management.Services.Canvas; namespace Management.Services.Canvas;
public interface ICanvasQuizService
{
Task<IEnumerable<CanvasQuiz>> GetAll(ulong courseId);
Task<ulong> Create(ulong canvasCourseId, LocalQuiz localQuiz, ulong? canvasAssignmentGroupId);
Task CreateQuizQuestions(ulong canvasCourseId, ulong canvasQuizId, LocalQuiz localQuiz);
}
public class CanvasQuizService( public class CanvasQuizService(
IWebRequestor webRequestor, IWebRequestor webRequestor,
CanvasServiceUtils utils, CanvasServiceUtils utils,
CanvasAssignmentService assignments, ICanvasAssignmentService assignments,
ILogger<CanvasQuizService> logger ILogger<CanvasQuizService> logger
) ): ICanvasQuizService
{ {
private readonly IWebRequestor webRequestor = webRequestor; private readonly IWebRequestor webRequestor = webRequestor;
private readonly CanvasServiceUtils utils = utils; private readonly CanvasServiceUtils utils = utils;
private readonly CanvasAssignmentService assignments = assignments; private readonly ICanvasAssignmentService assignments = assignments;
private readonly ILogger<CanvasQuizService> logger = logger; private readonly ILogger<CanvasQuizService> logger = logger;
public async Task<IEnumerable<CanvasQuiz>> GetAll(ulong courseId) public async Task<IEnumerable<CanvasQuiz>> GetAll(ulong courseId)

View File

@@ -9,26 +9,43 @@ using RestSharp;
namespace Management.Services.Canvas; namespace Management.Services.Canvas;
public interface ICanvasService
{
ICanvasAssignmentService Assignments { get; }
ICanvasAssignmentGroupService AssignmentGroups { get; }
ICanvasModuleService Modules { get; }
ICanvasQuizService Quizzes { get; }
ICanvasCoursePageService Pages { get; }
Task<IEnumerable<EnrollmentTermModel>> GetTerms();
Task<IEnumerable<CourseModel>> GetCourses(ulong termId);
Task<CourseModel> GetCourse(ulong courseId);
Task<IEnumerable<EnrollmentTermModel>> 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( public class CanvasService(
IWebRequestor webRequestor, IWebRequestor webRequestor,
CanvasServiceUtils utils, CanvasServiceUtils utils,
CanvasAssignmentService Assignments, ICanvasAssignmentService Assignments,
CanvasAssignmentGroupService AssignmentGroups, ICanvasAssignmentGroupService AssignmentGroups,
CanvasModuleService Modules, ICanvasModuleService Modules,
CanvasQuizService Quizzes, ICanvasQuizService Quizzes,
CanvasCoursePageService Pages, ICanvasCoursePageService Pages,
MyLogger<CanvasService> logger MyLogger<ICanvasService> logger
) ):ICanvasService
{ {
private readonly IWebRequestor webRequestor = webRequestor; private readonly IWebRequestor webRequestor = webRequestor;
private readonly CanvasServiceUtils utils = utils; private readonly CanvasServiceUtils utils = utils;
private readonly MyLogger<CanvasService> logger = logger; private readonly MyLogger<ICanvasService> logger = logger;
public CanvasAssignmentService Assignments { get; } = Assignments; public ICanvasAssignmentService Assignments { get; } = Assignments;
public CanvasAssignmentGroupService AssignmentGroups { get; } = AssignmentGroups; public ICanvasAssignmentGroupService AssignmentGroups { get; } = AssignmentGroups;
public CanvasModuleService Modules { get; } = Modules; public ICanvasModuleService Modules { get; } = Modules;
public CanvasQuizService Quizzes { get; } = Quizzes; public ICanvasQuizService Quizzes { get; } = Quizzes;
public CanvasCoursePageService Pages { get; } = Pages; public ICanvasCoursePageService Pages { get; } = Pages;
public async Task<IEnumerable<EnrollmentTermModel>> GetTerms() public async Task<IEnumerable<EnrollmentTermModel>> GetTerms()
{ {

View File

@@ -2,6 +2,7 @@ using RestSharp;
namespace Management.Services.Canvas; namespace Management.Services.Canvas;
public class CanvasServiceUtils public class CanvasServiceUtils
{ {
private const string BaseUrl = "https://snow.instructure.com/api/v1/"; private const string BaseUrl = "https://snow.instructure.com/api/v1/";

View File

@@ -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();
}
}

View File

@@ -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) 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 holiday schedule
multi-seciton support for due dates/times