feat: import leftover student fields into notes and show them on the roster
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>
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
using Core.Models;
|
||||
using Core.Services;
|
||||
|
||||
namespace WebApp.Services;
|
||||
|
||||
/// <summary>
|
||||
/// Creates or updates #Student:{id} notes when imported fields actually change.
|
||||
/// </summary>
|
||||
public class StudentNotesImportSaveService : IStudentNotesImportSaveService
|
||||
{
|
||||
private readonly INotesService _notesService;
|
||||
private readonly INoteNamingService _noteNamingService;
|
||||
private readonly ILogger<StudentNotesImportSaveService> _logger;
|
||||
|
||||
public StudentNotesImportSaveService(
|
||||
INotesService notesService,
|
||||
INoteNamingService noteNamingService,
|
||||
ILogger<StudentNotesImportSaveService> logger)
|
||||
{
|
||||
_notesService = notesService;
|
||||
_noteNamingService = noteNamingService;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task<StudentNotesImportSaveResult> SaveAsync(
|
||||
StudentNotesImportResult parseResult,
|
||||
CancellationToken cancellationToken = default)
|
||||
{
|
||||
var result = new StudentNotesImportSaveResult();
|
||||
var existingNotes = await _notesService.GetStudentNotesAsync(
|
||||
parseResult.Matches.Select(m => m.Student.Id));
|
||||
var actions = StudentNotesImportPlan.Create(parseResult, existingNotes.Keys.ToHashSet());
|
||||
result.StudentsUnchanged = parseResult.Matches.Count - actions.Count;
|
||||
|
||||
foreach (var action in actions)
|
||||
{
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
if (action.Kind == StudentNotePersistKind.Update
|
||||
&& existingNotes.TryGetValue(action.StudentId, out var existing))
|
||||
{
|
||||
existing.Content = action.Markdown;
|
||||
await _notesService.UpdateNoteAsync(existing);
|
||||
result.NotesUpdated++;
|
||||
continue;
|
||||
}
|
||||
|
||||
await _notesService.CreateNoteAsync(new Core.Entities.Note
|
||||
{
|
||||
Title = _noteNamingService.GetStudentNoteTitle(action.StudentId),
|
||||
Content = action.Markdown
|
||||
});
|
||||
result.NotesCreated++;
|
||||
}
|
||||
|
||||
_logger.LogInformation(
|
||||
"Student notes import saved. Created={Created}, Updated={Updated}, Unchanged={Unchanged}",
|
||||
result.NotesCreated,
|
||||
result.NotesUpdated,
|
||||
result.StudentsUnchanged);
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user