feat(replay): add BattleHistoryWriter with 50-row per-viewer retention

Idempotent on (ViewerId, BattleId); evicts oldest CreateTime row when
at cap. No-op when ctx is null (server-restart safety).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
gamer147
2026-06-10 07:43:50 -04:00
parent 869f9ce13d
commit 2b6c7bd6a4
4 changed files with 188 additions and 0 deletions

View File

@@ -0,0 +1,16 @@
namespace SVSim.Database.Services.Replay;
/// <summary>
/// Persists battle finishes to ViewerBattleHistory for the /replay/info list view.
/// </summary>
public interface IBattleHistoryWriter
{
/// <summary>
/// Insert a history row for (viewerId, ctx.BattleId). No-op when ctx is null
/// (missing context = server restart mid-battle; warn-log and continue).
/// Idempotent on the composite PK — duplicate calls skip silently.
/// Enforces 50-row per-viewer retention by evicting the oldest CreateTime row
/// when at cap before insert.
/// </summary>
Task RecordAsync(long viewerId, BattleContext? ctx, bool isWin, CancellationToken ct);
}