From 483cc1c1e063e1972a7282c00ab1afb77caefefc Mon Sep 17 00:00:00 2001 From: gamer147 Date: Tue, 9 Jun 2026 16:53:34 -0400 Subject: [PATCH] feat(mypage): /mypage/index reflects persisted bg selection MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Wires MyPageController.Index to read Viewer.MyPageBgId/SelectType/BgRotation instead of emitting an empty MyPageBgSetting placeholder; adds Include for MyPageBgRotation in ViewerRepository.GetViewerByShortUdid; adds fresh-viewer zero-defaults test and write→read round-trip test (9/9 controller tests pass). Co-Authored-By: Claude Sonnet 4.6 --- .../Repositories/Viewer/ViewerRepository.cs | 1 + .../Controllers/MyPageController.cs | 12 ++++- .../Controllers/UserMyPageControllerTests.cs | 47 +++++++++++++++++++ 3 files changed, 58 insertions(+), 2 deletions(-) diff --git a/SVSim.Database/Repositories/Viewer/ViewerRepository.cs b/SVSim.Database/Repositories/Viewer/ViewerRepository.cs index 7dfbf23..daf2490 100644 --- a/SVSim.Database/Repositories/Viewer/ViewerRepository.cs +++ b/SVSim.Database/Repositories/Viewer/ViewerRepository.cs @@ -66,6 +66,7 @@ public class ViewerRepository : IViewerRepository .Include(v => v.Degrees) .Include(v => v.LeaderSkins).ThenInclude(ls => ls.Class) .Include(v => v.MyPageBackgrounds) + .Include(v => v.MyPageBgRotation) .FirstOrDefaultAsync(viewer => viewer.ShortUdid == shortUdid); } diff --git a/SVSim.EmulatedEntrypoint/Controllers/MyPageController.cs b/SVSim.EmulatedEntrypoint/Controllers/MyPageController.cs index 1beb1c2..7d7f9e3 100644 --- a/SVSim.EmulatedEntrypoint/Controllers/MyPageController.cs +++ b/SVSim.EmulatedEntrypoint/Controllers/MyPageController.cs @@ -112,9 +112,17 @@ public class MyPageController : SVSimController Quest = new Quest(), // TODO(mypage-stub): active Quest event + viewer flags MasterPointRankingPeriod = BuildMasterPointRankingPeriod(masterPointPeriod), PreReleaseStatus = 0, // TODO(mypage-stub): derive from PreReleaseInfo - UserMyPageInfo = new UserMyPageInfo // TODO(mypage-stub): viewer mypage BG selection + UserMyPageInfo = new UserMyPageInfo { - UserMyPageSetting = new MyPageBgSetting(), + UserMyPageSetting = new MyPageBgSetting + { + MyPageId = viewer.MyPageBgId.ToString(), + SelectType = viewer.MyPageBgSelectType.ToString(), + MyPageIdList = viewer.MyPageBgRotation + .OrderBy(r => r.Slot) + .Select(r => r.BgId.ToString()) + .ToList(), + }, }, BasicPuzzle = new Models.Dtos.Common.BadgeFlag { IsDisplayBadge = false }, // TODO(mypage-stub): viewer practice-puzzle progress IsBattlePassPeriod = rotation.IsBattlePassPeriod, diff --git a/SVSim.UnitTests/Controllers/UserMyPageControllerTests.cs b/SVSim.UnitTests/Controllers/UserMyPageControllerTests.cs index bb26b2c..92a19bb 100644 --- a/SVSim.UnitTests/Controllers/UserMyPageControllerTests.cs +++ b/SVSim.UnitTests/Controllers/UserMyPageControllerTests.cs @@ -165,4 +165,51 @@ public class UserMyPageControllerTests Assert.That(pool, Is.EqualTo(new[] { 1001, 0, 0, 1002 }), "garbage and empty entries are stored as 0; valid entries unaffected"); } + + [Test] + public async Task MyPageIndex_for_fresh_viewer_returns_zero_defaults() + { + using var factory = new SVSimTestFactory(); + long viewerId = await factory.SeedViewerAsync(); + using var client = factory.CreateAuthenticatedClient(viewerId); + + var body = JsonBody("""{"viewer_id":"0","steam_id":0,"steam_session_ticket":""}"""); + var response = await client.PostAsync("/mypage/index", body); + var raw = await response.Content.ReadAsStringAsync(); + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK), raw); + + using var doc = JsonDocument.Parse(raw); + var setting = doc.RootElement.GetProperty("user_mypage_info").GetProperty("user_mypage_setting"); + Assert.That(setting.GetProperty("mypage_id").GetString(), Is.EqualTo("0")); + Assert.That(setting.GetProperty("select_type").GetString(), Is.EqualTo("0")); + Assert.That(setting.GetProperty("mypage_id_list").GetArrayLength(), Is.EqualTo(0)); + } + + [Test] + public async Task Update_then_MyPageIndex_round_trips_full_state() + { + using var factory = new SVSimTestFactory(); + long viewerId = await factory.SeedViewerAsync(); + using var client = factory.CreateAuthenticatedClient(viewerId); + + var updateBody = JsonBody(""" + {"select_type":1,"mypage_id":"1213410310","mypage_id_list":["1211410310","1212410310","1213410310","1214410310","1215410310","1216410310","1217410310","1218410310"]} + """); + var updateResp = await client.PostAsync("/user_mypage/update", updateBody); + Assert.That(updateResp.StatusCode, Is.EqualTo(HttpStatusCode.OK)); + + var indexBody = JsonBody("""{"viewer_id":"0","steam_id":0,"steam_session_ticket":""}"""); + var indexResp = await client.PostAsync("/mypage/index", indexBody); + var raw = await indexResp.Content.ReadAsStringAsync(); + Assert.That(indexResp.StatusCode, Is.EqualTo(HttpStatusCode.OK), raw); + + using var doc = JsonDocument.Parse(raw); + var setting = doc.RootElement.GetProperty("user_mypage_info").GetProperty("user_mypage_setting"); + Assert.That(setting.GetProperty("mypage_id").GetString(), Is.EqualTo("1213410310")); + Assert.That(setting.GetProperty("select_type").GetString(), Is.EqualTo("1")); + var list = setting.GetProperty("mypage_id_list"); + Assert.That(list.GetArrayLength(), Is.EqualTo(8)); + Assert.That(list[0].GetString(), Is.EqualTo("1211410310")); + Assert.That(list[7].GetString(), Is.EqualTo("1218410310")); + } }