diff --git a/SVSim.Database/Models/Config/CardMasterConfig.cs b/SVSim.Database/Models/Config/CardMasterConfig.cs new file mode 100644 index 00000000..e3f25c9d --- /dev/null +++ b/SVSim.Database/Models/Config/CardMasterConfig.cs @@ -0,0 +1,35 @@ +namespace SVSim.Database.Models.Config; + +/// +/// Tunables for serving the card-master payload at POST /immutable_data/card_master. +/// V1 ships the captured prod blob verbatim; the hash here pins to that capture's prod hash +/// so any client whose cardmaster/card_master_1 was seeded from a prod dump skips +/// re-download. +/// +[ConfigSection("CardMasterConfig")] +public class CardMasterConfig +{ + /// + /// Emitted on /load/index response's inner data.card_master_hash when the + /// request's card_master_hash body field doesn't match this value. Client treats + /// the string as opaque (presence-only check, value is echoed back unchanged on the next + /// /immutable_data/card_master request). Format <sha1 hex>:<CardMasterId>. + /// + /// Default value is the prod-captured hash paired with the blob at + /// SVSim.EmulatedEntrypoint/Data/card_master_2026-06-03.txt. When swapping the + /// blob, update this string in lockstep — the hash is otherwise free-form (the client + /// never validates its structure). + /// + /// + public string CurrentHash { get; set; } = "94b5c44edc51ff76c0af8fcc894af12f979dd38c:1"; + + /// + /// Kill switch. When false, /immutable_data/card_master returns 503 and + /// /load/index never emits card_master_hash. Useful for shaving the 1.27 MB + /// download out of test-only deployments where the test viewers already have a seeded + /// local cache. + /// + public bool EnableServing { get; set; } = true; + + public static CardMasterConfig ShippedDefaults() => new(); +}