am syncing assignment groups

This commit is contained in:
2023-08-23 14:06:40 -06:00
parent 8c3ab09f38
commit bbae0c054d
18 changed files with 327 additions and 11 deletions

View File

@@ -17,7 +17,6 @@ public class AssignmentEditorContext
get => _assignment;
set
{
Console.WriteLine("saving");
_assignment = value;
StateHasChanged?.Invoke();
}

View File

@@ -72,6 +72,7 @@ public class CoursePlanner
public event Action? StateHasChanged;
public IEnumerable<CanvasAssignment>? CanvasAssignments { get; internal set; }
public IEnumerable<CanvasAssignmentGroup>? CanvasAssignmentGroups { get; internal set; }
public IEnumerable<CanvasQuiz>? CanvasQuizzes { get; internal set; }
public IEnumerable<CanvasModule>? CanvasModules { get; internal set; }
public Dictionary<ulong, IEnumerable<CanvasModuleItem>>? CanvasModulesItems { get; internal set; }
@@ -80,7 +81,8 @@ public class CoursePlanner
IEnumerable<CanvasAssignment> CanvasAssignments,
IEnumerable<CanvasModule> CanvasModules,
Dictionary<ulong, IEnumerable<CanvasModuleItem>> CanvasModulesItems,
IEnumerable<CanvasQuiz> canvasQuizzes
IEnumerable<CanvasQuiz> canvasQuizzes,
IEnumerable<CanvasAssignmentGroup> canvasAssignmentGroups
)> LoadCanvasData()
{
LoadingCanvasData = true;
@@ -92,16 +94,18 @@ public class CoursePlanner
var assignmentsTask = canvas.Assignments.GetAll(canvasId);
var quizzesTask = canvas.Quizzes.GetAll(canvasId);
var modulesTask = canvas.GetModules(canvasId);
var assignmentGroupsTask = canvas.AssignmentGroups.GetAll(canvasId);
CanvasAssignments = await assignmentsTask;
CanvasQuizzes = await quizzesTask;
CanvasModules = await modulesTask;
CanvasAssignmentGroups = await assignmentGroupsTask;
CanvasModulesItems = await canvas.GetAllModulesItems(canvasId, CanvasModules);
LoadingCanvasData = false;
StateHasChanged?.Invoke();
return (CanvasAssignments, CanvasModules, CanvasModulesItems, CanvasQuizzes);
return (CanvasAssignments, CanvasModules, CanvasModulesItems, CanvasQuizzes, CanvasAssignmentGroups);
}
public async Task SyncWithCanvas()
@@ -119,18 +123,31 @@ public class CoursePlanner
LoadingCanvasData = true;
StateHasChanged?.Invoke();
var (canvasAssignments, canvasModules, canvasModuleItems, canvasQuizzes) = await LoadCanvasData();
var (
canvasAssignments,
canvasModules,
canvasModuleItems,
canvasQuizzes,
canvasAssignmentGroups
) = await LoadCanvasData();
LoadingCanvasData = true;
StateHasChanged?.Invoke();
LocalCourse = LocalCourse.deleteCanvasIdsThatNoLongerExist(
canvasModules,
canvasAssignments,
canvasAssignmentGroups,
canvasQuizzes
);
var canvasId =
LocalCourse.CanvasId ?? throw new Exception("no course canvas id to sync with canvas");
var newAssignmentGroups = await LocalCourse.EnsureAllAssignmentGroupsExistInCanvas(
canvasId, canvasAssignmentGroups, canvas);
LocalCourse = LocalCourse with { AssignmentGroups = newAssignmentGroups };
var newModules = await LocalCourse.EnsureAllModulesExistInCanvas(
canvasId,
CanvasModules,

View File

@@ -47,6 +47,7 @@ public static class CoursePlannerExtensions
this LocalCourse localCourse,
IEnumerable<CanvasModule> canvasModules,
IEnumerable<CanvasAssignment> canvasAssignments,
IEnumerable<CanvasAssignmentGroup> canvasAssignmentGroups,
IEnumerable<CanvasQuiz> canvasQuizzes
)
{
@@ -56,9 +57,21 @@ public static class CoursePlannerExtensions
.Select((m) => m.validateCanvasIds(canvasModules, canvasAssignments, canvasQuizzes))
.ToArray();
var canvasAssignmentGroupIds = canvasAssignmentGroups.Select(g => g.Id).ToArray();
var correctAssignmentGroups = localCourse.AssignmentGroups.Select(
g =>
{
var groupCanvasId = g.CanvasId ?? 0;
return canvasAssignmentGroupIds.Contains(groupCanvasId)
? g
: g with { CanvasId = null };
}
).ToArray();
return localCourse with
{
Modules = correctedModules
Modules = correctedModules,
AssignmentGroups = correctAssignmentGroups,
};
}

View File

@@ -0,0 +1,40 @@
using CanvasModel.Assignments;
using CanvasModel.Modules;
using LocalModels;
using Management.Services.Canvas;
namespace Management.Planner;
public static partial class AssignmentGroupSyncronizationExtensions
{
internal static async Task<IEnumerable<LocalAssignmentGroup>> EnsureAllAssignmentGroupsExistInCanvas(
this LocalCourse localCourse,
ulong courseCanvasId,
IEnumerable<CanvasAssignmentGroup> canvasAssignmentGroups,
CanvasService canvas
)
{
var canvasAssignmentGroupIds = canvasAssignmentGroups.Select(g => g.Id).ToArray();
var assignmentGroups = await Task.WhenAll((Task<LocalAssignmentGroup>[])localCourse.AssignmentGroups.Select(
async assignmentGroup =>
{
var canvasGroupWithSameName = canvasAssignmentGroups.FirstOrDefault(
cg => cg.Name.Equals(assignmentGroup.Name)
);
if (canvasGroupWithSameName == null)
return await canvas.AssignmentGroups.Create(courseCanvasId, assignmentGroup);
var correctGroup = assignmentGroup with { CanvasId = canvasGroupWithSameName.Id };
var needsUpdate = canvasGroupWithSameName.GroupWeight != correctGroup.Weight;
if (needsUpdate)
await canvas.AssignmentGroups.Update(courseCanvasId, assignmentGroup);
return correctGroup;
}
).ToArray());
return assignmentGroups;
}
}