using System.ComponentModel.DataAnnotations; namespace DorkNet.Server.Data.Entities; /// /// One push-notification token per (player, platform). Backs /// POST api/messages/v1/IOSSaveDeviceToken + /// IOSClearDeviceToken. Stored so an APNS / FCM proxy could /// fan out push notifications to mobile clients; on a private /// server we just persist for audit + future use. /// public class PushTokenEntity { public long Id { get; set; } public long PlayerId { get; set; } /// Platform: "ios", "android", "fcm", etc. [MaxLength(16)] public string Platform { get; set; } = "ios"; [MaxLength(256)] public string Token { get; set; } = string.Empty; public DateTime CreatedAt { get; set; } = DateTime.UtcNow; public DateTime UpdatedAt { get; set; } = DateTime.UtcNow; } /// /// One row per (player, platform user id) that the player has /// chosen to ignore even before they appear in /// . Backs /// POST api/relationships/v1/bulkignoreplatformusers — when /// a Steam friend joins later, the relationship is auto-set to /// Ignored. Lets the import stick across friend-discovery cycles. /// public class PlatformIgnoreEntity { public long Id { get; set; } public long PlayerId { get; set; } /// PlatformType enum: 0=Steam, 1=Oculus, 2=PlayStation, /// 3=Microsoft, 5=IOS. public int Platform { get; set; } [MaxLength(64)] public string PlatformUserId { get; set; } = string.Empty; public DateTime CreatedAt { get; set; } = DateTime.UtcNow; } /// /// One row per "card" displayed on the watch's home screen / cards /// tab. Backs GET api/cards/v1/all. Cards are short tappable /// tiles ("Daily Login", "New Room: Foo", "Friend invited you to /// X") seeded by the server and consumed by the client. /// public class CardEntity { public long Id { get; set; } /// If null, the card is global (shown to everyone). /// If set, only visible to that specific player. public long? PlayerId { get; set; } [MaxLength(128)] public string Title { get; set; } = string.Empty; [MaxLength(2000)] public string Body { get; set; } = string.Empty; [MaxLength(256)] public string ImageName { get; set; } = string.Empty; [MaxLength(512)] public string ActionUrl { get; set; } = string.Empty; /// Card category — "announcement", "daily", "event", /// "system". Drives the icon the watch renders. [MaxLength(32)] public string Category { get; set; } = "announcement"; public int Priority { get; set; } = 0; public DateTime CreatedAt { get; set; } = DateTime.UtcNow; public DateTime? ExpiresAt { get; set; } }