namespace SVSim.Database.Models; /// /// One row per gift in a viewer's inbox. Replaces the tutorial-only /// ViewerClaimedTutorialGift receipts model with a unified status-enum row that /// serves both /gift/top + /gift/receive_gift (prod) and /tutorial/gift_top + /// /tutorial/gift_receive (tutorial alias). /// public class ViewerPresent { public long Id { get; set; } public long ViewerId { get; set; } public Viewer Viewer { get; set; } = null!; /// Wire id ("71409625" in the prod capture). String to match the wire. public string PresentId { get; set; } = string.Empty; public PresentStatus Status { get; set; } /// UserGoodsType-compatible int. Wire is stringified — see PresentMapper. public int RewardType { get; set; } public long RewardDetailId { get; set; } public long RewardCount { get; set; } public int ConditionNumber { get; set; } public int PresentLimitType { get; set; } public long RewardLimitTime { get; set; } public int? ItemType { get; set; } public string Message { get; set; } = string.Empty; public DateTime CreatedAt { get; set; } public DateTime? ClaimedAt { get; set; } /// /// Free-form provenance tag for future producers ("tutorial", "challenge_win", /// "payment_refund:<txid>", "event:<id>"). Nothing in the receive handler reads /// this today — the tutorial-step advance is route-gated, not Source-gated. /// public string? Source { get; set; } } public enum PresentStatus : byte { Unclaimed = 0, Claimed = 1, Deleted = 2, Expired = 3, }