Store leftover CSV columns on hidden student notes, move catalog import to /events/import, and persist Students index columns from Chapter Settings. Co-authored-by: Cursor <cursoragent@cursor.com>
55 lines
1.5 KiB
C#
55 lines
1.5 KiB
C#
using Core.Models;
|
|
|
|
namespace Core.Services;
|
|
|
|
/// <summary>
|
|
/// Decides which parsed student notes should be created or updated.
|
|
/// Unchanged merges are omitted so a re-import does not write history.
|
|
/// </summary>
|
|
public static class StudentNotesImportPlan
|
|
{
|
|
/// <summary>
|
|
/// Builds persist actions from a parse result. Only matches with field changes are included.
|
|
/// </summary>
|
|
public static IReadOnlyList<StudentNotePersistAction> Create(
|
|
StudentNotesImportResult parseResult,
|
|
IReadOnlySet<int> studentIdsWithExistingNotes)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(parseResult);
|
|
ArgumentNullException.ThrowIfNull(studentIdsWithExistingNotes);
|
|
|
|
List<StudentNotePersistAction> actions = [];
|
|
foreach (var match in parseResult.Matches)
|
|
{
|
|
if (!match.Merge.Changed)
|
|
continue;
|
|
|
|
actions.Add(new StudentNotePersistAction
|
|
{
|
|
StudentId = match.Student.Id,
|
|
Markdown = match.Merge.Markdown,
|
|
Kind = studentIdsWithExistingNotes.Contains(match.Student.Id)
|
|
? StudentNotePersistKind.Update
|
|
: StudentNotePersistKind.Create
|
|
});
|
|
}
|
|
|
|
return actions;
|
|
}
|
|
}
|
|
|
|
public enum StudentNotePersistKind
|
|
{
|
|
Create,
|
|
Update
|
|
}
|
|
|
|
public class StudentNotePersistAction
|
|
{
|
|
public required int StudentId { get; init; }
|
|
|
|
public required string Markdown { get; init; }
|
|
|
|
public required StudentNotePersistKind Kind { get; init; }
|
|
}
|