using DeepDrftModels.Enums; namespace DeepDrftModels.Entities; /// /// Append-only log row for one recorded play (Phase 16 §4.2). Written once at session close, after the /// engagement floor is crossed; never updated or deleted. Deliberately NOT a BaseEntity: events /// have no soft-delete lifecycle, no UpdatedAt — they are immutable facts. The release link is /// resolved server-side from the track key at write time (§2.3 / D4) and stored here so release-total /// plays are a cheap sum over this column. /// public class PlayEvent { public long Id { get; set; } /// The played track's vault entry key (the only target the client sends). public required string TrackEntryKey { get; set; } /// /// The owning release's SQL id, resolved from at write time. Null when /// the track is loose (no release) or the key did not resolve to a live track at write time. /// public long? ReleaseId { get; set; } /// The completion bucket computed client-side from the high-water fraction (§1a / D1). public PlayBucket Bucket { get; set; } /// /// Anonymous listener token (Phase 16 §3, wave 16.3). Reserved nullable; nothing writes it in wave /// 16.1 — the client sends none and the column stays NULL. Wave 16.3 lights it up for the /// distinct-listener count. /// public string? AnonId { get; set; } public DateTime CreatedAt { get; set; } }