Chapter officers can merge a markdown note onto filtered students, teams, or events and save the recipe. Extra student-note columns are additional fields (any ## … fields heading) so they work as print tokens whether imported or typed by hand. Co-authored-by: Cursor <cursoragent@cursor.com>
65 lines
2.3 KiB
C#
65 lines
2.3 KiB
C#
using Core.Models;
|
|
using Core.Services;
|
|
|
|
namespace WebApp.Services;
|
|
|
|
/// <summary>
|
|
/// Creates or updates #Student:{id} notes when additional 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;
|
|
}
|
|
}
|