Commit Graph

  • 1960e28298 refactor(auth): decouple Steam handler from request DTO shape master gamer147 2026-06-10 12:29:10 -04:00
  • b18b24b085 test(ranking): literal-prod-JSON wire-shape parity gamer147 2026-06-10 10:48:51 -04:00
  • f743b27696 feat(ranking): stub /ranking/* (6 endpoints) gamer147 2026-06-10 10:46:00 -04:00
  • 80f249f8a2 feat(ranking): add RankingPeriodSchedule helper gamer147 2026-06-10 10:36:51 -04:00
  • b4aa07577f fix(friend): add BaseRequest body param to 6 body-less actions gamer147 2026-06-10 08:54:50 -04:00
  • b54a47f333 test(replay): literal-prod-JSON wire-shape parity for /replay/info gamer147 2026-06-10 08:24:24 -04:00
  • 0996074287 feat(replay): wire arena two-pick finish hook gamer147 2026-06-10 08:22:19 -04:00
  • 81aac701f4 feat(replay): wire finish hook for rank-battle family gamer147 2026-06-10 08:15:12 -04:00
  • a81289311f feat(replay): stash battle context at /ai_*/start time gamer147 2026-06-10 08:10:01 -04:00
  • b44354315a fix(replay-tests): supply BaseRequest auth fields in PostAsJsonAsync bodies gamer147 2026-06-10 08:06:36 -04:00
  • 216dcab316 fix(replay): add BaseRequest body param to /replay/info gamer147 2026-06-10 08:03:37 -04:00
  • c6259e5a14 feat(replay): add ReplayController for /replay/{info,detail} gamer147 2026-06-10 07:59:51 -04:00
  • 2f7a2305da feat(replay): add /replay/info and /replay/detail DTOs gamer147 2026-06-10 07:51:00 -04:00
  • 86d86f6ead feat(replay): add ReplayHistoryReader for newest-first list query gamer147 2026-06-10 07:48:18 -04:00
  • 2b6c7bd6a4 feat(replay): add BattleHistoryWriter with 50-row per-viewer retention gamer147 2026-06-10 07:43:50 -04:00
  • 869f9ce13d feat(replay): add BattleContextStore for start->finish handoff gamer147 2026-06-10 07:38:37 -04:00
  • 0bb0f46abc feat(replay): add ViewerBattleHistory entity + migration gamer147 2026-06-10 07:32:05 -04:00
  • 2d65fcd91c test(friend): end-to-end multi-viewer apply→approve→friendship flow gamer147 2026-06-09 22:14:45 -04:00
  • d848f4a03f test(friend): literal wire-shape round-trip gamer147 2026-06-09 22:13:16 -04:00
  • 2d13f0b72d feat(friend): FriendController with 12 endpoints + integration tests gamer147 2026-06-09 22:12:00 -04:00
  • a6e5c9f0bc feat(friend): wire DTOs for /friend/* endpoints gamer147 2026-06-09 22:06:36 -04:00
  • b5b4781693 feat(friend): bulk apply ops + IPlayedTogetherWriter with retention cap gamer147 2026-06-09 22:04:04 -04:00
  • 17591a6ebd feat(friend): implement single-target write methods on FriendService gamer147 2026-06-09 21:59:32 -04:00
  • d078f275f8 feat(friend): implement 5 read methods on FriendService + register DI + read test suite gamer147 2026-06-09 21:53:10 -04:00
  • 300eee36e9 feat(friend): IFriendService + IPlayedTogetherWriter + DTO records gamer147 2026-06-09 21:44:51 -04:00
  • f40ecb8ca7 feat(friend): migration for friend system tables gamer147 2026-06-09 21:42:41 -04:00
  • 1813217c16 feat(friend): add ViewerFriend + ViewerFriendApply + ViewerPlayedTogether entities gamer147 2026-06-09 21:40:08 -04:00
  • c1eec9057a test(gift): claim Card/Sleeve presents; reject unsupported types gamer147 2026-06-09 20:58:53 -04:00
  • 742058403c refactor(campaign): delegate gift-reward-type check to GiftRewardTypes gamer147 2026-06-09 20:52:47 -04:00
  • b2a5b69423 fix(gift): wire reward_type is UserGoodsType integer, not legacy 1/4/9 encoding gamer147 2026-06-09 20:45:49 -04:00
  • 366a71688d feat(gift): add GiftRewardTypes supported-set helper gamer147 2026-06-09 20:39:10 -04:00
  • 0d32d2167b feat(campaign): CampaignController.RegisterSerialCode + DTOs + tests gamer147 2026-06-09 18:51:03 -04:00
  • 9f7e78691b feat(serial-code): migration for SerialCode tables gamer147 2026-06-09 18:45:18 -04:00
  • 206be77a86 feat(serial-code): add SerialCode + SerialCodeReward + ViewerSerialCodeRedemption entities gamer147 2026-06-09 18:42:10 -04:00
  • b117fe825c test(profile): literal wire-shape round-trip for UserClass gamer147 2026-06-09 17:41:11 -04:00
  • 11215bd69f feat(profile): ProfileController + DTOs + integration tests gamer147 2026-06-09 17:37:35 -04:00
  • f204656f4d refactor(user-class): require owned skin list, read IsRandomLeaderSkin from data gamer147 2026-06-09 17:31:06 -04:00
  • da6b448598 feat(viewer): migration for ViewerClassData.IsRandomLeaderSkin gamer147 2026-06-09 17:27:16 -04:00
  • 2f4420bf15 feat(viewer): add ViewerClassData.IsRandomLeaderSkin column gamer147 2026-06-09 17:24:32 -04:00
  • b50d69d3a5 test(user-mypage): assert /user_mypage/update returns 401 without auth gamer147 2026-06-09 17:04:12 -04:00
  • 483cc1c1e0 feat(mypage): /mypage/index reflects persisted bg selection gamer147 2026-06-09 16:53:34 -04:00
  • 6123a64b37 test(user-mypage): explain Clear() + cover unparseable rotation entries gamer147 2026-06-09 16:50:38 -04:00
  • 9ff6c70faf feat(user-mypage): UserMyPageController + DTOs + persistence tests gamer147 2026-06-09 16:46:49 -04:00
  • b447f5032d fix(mypage): wire mypage_id/select_type/mypage_id_list as strings gamer147 2026-06-09 16:40:38 -04:00
  • 51ef460d39 feat(viewer): migration for mypage bg selection gamer147 2026-06-09 16:33:12 -04:00
  • ee808a60a2 feat(viewer): add MyPageBgSelectType + MyPageBgId scalars + MyPageBgRotation owned collection gamer147 2026-06-09 16:26:48 -04:00
  • 8de78ba7ed test(inventory): lock Unknown-source fallthrough behaviour gamer147 2026-06-09 15:33:04 -04:00
  • 5334263793 feat(inventory): tag remaining BeginAsync call sites for acquire history gamer147 2026-06-09 15:09:43 -04:00
  • c2c3abc6f0 feat(gift): tag receive-gift tx as AdminGrant for acquire history gamer147 2026-06-09 15:08:27 -04:00
  • 6ec6a9c3fc feat(spot-card): tag exchange tx as GachaPointExchange for acquire history gamer147 2026-06-09 15:08:03 -04:00
  • d759465cf2 feat(achievement): tag receive-reward tx as AchievementReward for acquire history gamer147 2026-06-09 15:07:42 -04:00
  • 349d7f32cd feat(leader-skin): tag buy tx as LeaderSkinBuy for acquire history gamer147 2026-06-09 15:07:19 -04:00
  • 30cb4727f6 feat(sleeve): tag buy tx as SleeveBuy for acquire history gamer147 2026-06-09 15:06:47 -04:00
  • 38a21e5e72 feat(build-deck): tag buy tx as BuildDeckBuy for acquire history gamer147 2026-06-09 15:06:23 -04:00
  • 5cf3cf70e8 feat(item-purchase): tag purchase tx as ItemPurchase for acquire history gamer147 2026-06-09 15:05:59 -04:00
  • 259e3ebe29 feat(2pick): tag finish-reward tx as ArenaTwoPickFinish for acquire history gamer147 2026-06-09 15:05:37 -04:00
  • c72b692560 feat(battle-pass): tag claim tx as BattlePassClaim for acquire history gamer147 2026-06-09 15:05:09 -04:00
  • d767944a83 feat(story): tag finish-reward tx as StoryFinish for acquire history gamer147 2026-06-09 15:04:11 -04:00
  • 21ee113d21 feat(puzzle): tag inventory tx as PuzzleReward for acquire history gamer147 2026-06-09 15:03:45 -04:00
  • 4aa1367b6f feat(pack): tag gacha-point exchange tx for acquire history gamer147 2026-06-09 15:03:21 -04:00
  • f1d96ff554 feat(pack): tag inventory tx as PackOpen for acquire history gamer147 2026-06-09 15:02:56 -04:00
  • 9130d6de11 test(inventory): pack-open shape produces acquire history gamer147 2026-06-09 14:59:39 -04:00
  • d01294ebb4 test(item-acquire-history): literal wire-shape round-trip gamer147 2026-06-09 14:57:18 -04:00
  • 37d89aa602 refactor(inventory): share retention cap + invariant-culture date format gamer147 2026-06-09 14:55:43 -04:00
  • f9a971a546 feat(item-acquire-history): controller + DTOs gamer147 2026-06-09 14:49:43 -04:00
  • 00fbf1a185 docs(inventory): explain two-phase prune query (SQLite constraint) gamer147 2026-06-09 14:44:57 -04:00
  • 77ad614258 feat(inventory): prune acquire history above 300-row cap gamer147 2026-06-09 14:41:04 -04:00
  • fb1e6829b7 refactor(inventory): consolidate IsCurrency, skip num=0 grants in history gamer147 2026-06-09 14:37:50 -04:00
  • bea5a1efd4 feat(inventory): write acquire history rows on commit gamer147 2026-06-09 14:32:51 -04:00
  • 015c7ce259 feat(inventory): thread GrantSource into InventoryTransaction gamer147 2026-06-09 14:28:05 -04:00
  • f394529c8c feat(inventory): migration for viewer_acquire_history gamer147 2026-06-09 14:24:36 -04:00
  • 51595b0c7d refactor(inventory): drop redundant index name + IsRequired on ViewerAcquireHistory gamer147 2026-06-09 14:22:53 -04:00
  • 0d036e1bff feat(inventory): add ViewerAcquireHistoryEntry entity + DbSet gamer147 2026-06-09 14:19:00 -04:00
  • 82dc877639 feat(inventory): add Source to InventoryLoadConfig gamer147 2026-06-09 14:13:56 -04:00
  • 645c32e11c docs(inventory): annotate GrantSource gap + For() exception gamer147 2026-06-09 14:11:45 -04:00
  • 9f65326449 feat(inventory): add GrantSource enum + message lookup gamer147 2026-06-09 14:08:01 -04:00
  • 998402ebc3 refactor(tutorial-presents): promote static catalogue to seed-driven TutorialPresentEntries table gamer147 2026-06-09 09:53:10 -04:00
  • 7118b92522 refactor(pack): type PackChildGachaEntry.TypeDetail as CardPackType enum gamer147 2026-06-09 08:48:16 -04:00
  • 833bd85d36 data(seed): regenerate packs.json including free-pack children from event-crate capture gamer147 2026-06-08 21:51:05 -04:00
  • 57d231cd56 feat(pack): /pack/open supports type_detail=10 FREE_PACKS with per-campaign daily quota gamer147 2026-06-08 21:43:04 -04:00
  • 6c7e8ae8ad feat(pack): /pack/info filters spent free-pack children and emits campaign metadata gamer147 2026-06-08 21:38:26 -04:00
  • b9c29b53d9 feat(pack): add free-pack metadata fields to PackChildGachaDto gamer147 2026-06-08 21:34:49 -04:00
  • 7d7cf699f8 feat(viewer): add FreePackClaims owned collection for daily-free quota tracking gamer147 2026-06-08 21:34:20 -04:00
  • d762c5766f feat(pack): persist daily_free_gacha_count on PackChildGachaEntry gamer147 2026-06-08 21:31:02 -04:00
  • 7e4a9654b2 feat(seed): add DailyFreeGachaCount to PackChildGachaSeed gamer147 2026-06-08 21:23:14 -04:00
  • feee6e7c09 test(tutorial-e2e): seed tutorial presents — RegisterViewer no longer auto-seeds gamer147 2026-06-08 20:51:42 -04:00
  • 83e89455e2 test(signup): assert tutorial presents seeded by RegisterAnonymousViewer gamer147 2026-06-08 20:46:27 -04:00
  • 7a582f310e test(gift): prod-URL coverage and state=3 delete behavior gamer147 2026-06-08 20:45:49 -04:00
  • f1d881b26a fix(gift): drop RowVersion (SQLite incompatible) + restore wire reward_type map gamer147 2026-06-08 20:44:52 -04:00
  • ca36792be3 feat(db): migration — add viewer_presents, drop viewer_claimed_tutorial_gifts gamer147 2026-06-08 20:38:44 -04:00
  • 6098682162 refactor(db): remove ViewerClaimedTutorialGift — replaced by ViewerPresent.Status gamer147 2026-06-08 20:38:09 -04:00
  • fafd7ea183 test(gift): add SeedTutorialPresentsAsync helper gamer147 2026-06-08 20:37:26 -04:00
  • 2b35ae0890 feat(gift): unified GiftController over ViewerPresent + route aliases gamer147 2026-06-08 20:36:44 -04:00
  • c1d7cd2441 feat(dtos): add PresentMapper.ToWire(ViewerPresent) gamer147 2026-06-08 20:35:59 -04:00
  • bf51dabcff refactor(dtos): promote PresentDto to Common/ gamer147 2026-06-08 20:35:42 -04:00
  • 2ce399ff87 feat(signup): seed tutorial gifts as ViewerPresent rows on /tool/signup gamer147 2026-06-08 20:34:48 -04:00
  • f991ef762f feat(db): add TutorialPresents seed list gamer147 2026-06-08 20:34:11 -04:00
  • eea596c6ec feat(db): wire ViewerPresent into SVSimDbContext with indexes gamer147 2026-06-08 20:33:50 -04:00
  • a6a8c6b1a4 feat(db): add ViewerPresent entity for unified gift inbox gamer147 2026-06-08 20:33:10 -04:00
  • ce32a9c6b7 feat(home-dialog): seed file + importer + bootstrap hookup gamer147 2026-06-08 18:57:38 -04:00