Backstop for /tool/signup idempotency: signup-created viewers carry the client's UDID (the AES key for that client's wire traffic); admin-imported viewers stay null. Partial unique index allows the column to coexist with pre-existing null rows. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
83 lines
2.8 KiB
C#
83 lines
2.8 KiB
C#
using System.ComponentModel.DataAnnotations.Schema;
|
|
using SVSim.Database.Common;
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
namespace SVSim.Database.Models;
|
|
|
|
/// <summary>
|
|
/// A user within the game system.
|
|
/// </summary>
|
|
[Index(nameof(ShortUdid))]
|
|
[Index(nameof(Udid), IsUnique = true)]
|
|
public class Viewer : BaseEntity<long>
|
|
{
|
|
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
|
|
public override long Id { get; set; }
|
|
|
|
/// <summary>
|
|
/// This user's name displayed in game.
|
|
/// </summary>
|
|
public string DisplayName { get; set; } = String.Empty;
|
|
|
|
/// <summary>
|
|
/// This user's short identifier.
|
|
/// </summary>
|
|
public long ShortUdid { get; set; }
|
|
|
|
/// <summary>
|
|
/// The client's full UDID (AES key for the wire protocol). Set when the viewer is created
|
|
/// via <c>/tool/signup</c>; null for viewers created via the admin Steam-import path. Unique
|
|
/// when present — the partial filter is declared in the migration.
|
|
/// </summary>
|
|
public Guid? Udid { get; set; }
|
|
|
|
public DateTime LastLogin { get; set; }
|
|
|
|
#region Owned
|
|
|
|
public ViewerInfo Info { get; set; } = new ViewerInfo();
|
|
|
|
public ViewerMissionData MissionData { get; set; } = new ViewerMissionData();
|
|
|
|
public ViewerCurrency Currency { get; set; } = new ViewerCurrency();
|
|
|
|
public List<ViewerClassData> Classes { get; set; } = new List<ViewerClassData>();
|
|
|
|
#endregion
|
|
|
|
#region Collection
|
|
|
|
public List<ShadowverseDeckEntry> Decks { get; set; } = new List<ShadowverseDeckEntry>();
|
|
|
|
public List<OwnedCardEntry> Cards { get; set; } = new List<OwnedCardEntry>();
|
|
|
|
public List<LeaderSkinEntry> LeaderSkins { get; set; } = new List<LeaderSkinEntry>();
|
|
|
|
public List<DegreeEntry> Degrees { get; set; } = new List<DegreeEntry>();
|
|
|
|
public List<EmblemEntry> Emblems { get; set; } = new List<EmblemEntry>();
|
|
|
|
public List<OwnedItemEntry> Items { get; set; } = new List<OwnedItemEntry>();
|
|
|
|
public List<SleeveEntry> Sleeves { get; set; } = new List<SleeveEntry>();
|
|
|
|
public List<MyPageBackgroundEntry> MyPageBackgrounds { get; set; } = new List<MyPageBackgroundEntry>();
|
|
|
|
public List<ViewerPackOpenCount> PackOpenCounts { get; set; } = new List<ViewerPackOpenCount>();
|
|
|
|
public List<ViewerBuildDeckProductPurchase> BuildDeckPurchases { get; set; } = new List<ViewerBuildDeckProductPurchase>();
|
|
|
|
public List<ViewerMission> Missions { get; set; } = new List<ViewerMission>();
|
|
|
|
public List<ViewerAchievement> Achievements { get; set; } = new List<ViewerAchievement>();
|
|
|
|
public List<ViewerEventCounter> EventCounters { get; set; } = new List<ViewerEventCounter>();
|
|
|
|
#endregion
|
|
|
|
#region Navigation Properties
|
|
|
|
public List<SocialAccountConnection> SocialAccountConnections { get; set; } = new List<SocialAccountConnection>();
|
|
|
|
#endregion
|
|
} |