Translation middleware now extracts viewer_id/steam_id/steam_session_ticket from the decrypted msgpack dict into HttpContext.Items before the typed DTO deserialize. The Steam handler reads from there instead of re-parsing Request.Body — so authed action DTOs no longer need to inherit BaseRequest to keep the auth fields alive through the msgpack→DTO→JSON pivot. Retires the recurring footgun documented in docs/superpowers/specs/2026-06-02-baseRequest-auth-footgun-improvement.md (2026-05-25 basic-puzzle, 2026-05-28 deck-code, 2026-06-02 Phase 3 Bot, 2026-06-10 profile/index + item_acquire_history/info + user_mypage/update). Pinned by AuthDecouplingTests — posts an encrypted msgpack body to /profile/index (DTO does not inherit BaseRequest) through the real translation middleware + auth handler and asserts 200. Adds an EncryptedMsgpackHelper + useRealAuthHandler factory flag, reusable for future wire-shape tests. ProfileIndexRequest, ItemAcquireHistoryInfoRequest, and UserMyPageUpdateRequest revert to the naked shape — the per-DTO workarounds become vestigial under the new architecture. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
31 lines
1.3 KiB
C#
31 lines
1.3 KiB
C#
using System.Text.Json.Serialization;
|
|
using MessagePack;
|
|
|
|
namespace SVSim.EmulatedEntrypoint.Models.Dtos.UserMyPage;
|
|
|
|
/// <summary>
|
|
/// Body of <c>POST /user_mypage/update</c>. Client task: <c>MyPageSettingUpdateTask</c>
|
|
/// (Shadowverse_Code_2026-05-23/Wizard/MyPageSettingUpdateTask.cs). Note that
|
|
/// <c>select_type</c> is the only int on the wire — id fields are strings. Does not inherit
|
|
/// BaseRequest: the translation middleware stashes the auth tuple into HttpContext.Items
|
|
/// before the typed DTO deserialize, so the Steam handler reads them from there.
|
|
/// </summary>
|
|
[MessagePackObject]
|
|
public sealed class UserMyPageUpdateRequest
|
|
{
|
|
/// <summary>BGType enum: 0=Deck, 1=CustomBG, 2=RandomBG. Client sends as an int.</summary>
|
|
[JsonPropertyName("select_type")]
|
|
[Key("select_type")]
|
|
public int SelectType { get; set; }
|
|
|
|
/// <summary>Chosen BG id when SelectType=CustomBG; empty or "0" otherwise.</summary>
|
|
[JsonPropertyName("mypage_id")]
|
|
[Key("mypage_id")]
|
|
public string MyPageId { get; set; } = "0";
|
|
|
|
/// <summary>Saved rotation pool, in slot order; client sends the full list on every call.</summary>
|
|
[JsonPropertyName("mypage_id_list")]
|
|
[Key("mypage_id_list")]
|
|
public List<string> MyPageIdList { get; set; } = new();
|
|
}
|