Commit Graph

  • e1f5b9b6c3 feat(pack): gacha-point exchange (debit + grant) gamer147 2026-05-28 23:37:00 -04:00
  • c7fb56f95f test(pack): cover additive accrual on existing gacha-point balance gamer147 2026-05-28 23:27:56 -04:00
  • 723a97e3af feat(pack): gacha-point accrual with per-child override gamer147 2026-05-28 23:23:33 -04:00
  • e41ceff0be refactor(pack): clarify gacha-point leader detection and drop unused grants injection gamer147 2026-05-28 23:20:33 -04:00
  • 66c0b1c951 feat(pack): gacha-point catalog read (legendaries + leader cards) gamer147 2026-05-28 23:11:48 -04:00
  • ef1af8259e feat(pack): gacha-point endpoint DTOs gamer147 2026-05-28 22:56:33 -04:00
  • 96f1d73e35 docs: fix memory-reference name in gacha-point model docstrings gamer147 2026-05-28 22:54:46 -04:00
  • 21adc68e28 feat(db): add gacha-point balance + received tables gamer147 2026-05-28 22:50:22 -04:00
  • 261ce67cee fix(story): tutorial section is_finished derives from viewer tutorial_step gamer147 2026-05-28 22:01:50 -04:00
  • 22c01ed11a fix(viewer): fresh signups start with empty DisplayName gamer147 2026-05-28 21:19:03 -04:00
  • b18bb9502a fix(pack): /pack/info reads ItemId via shadow FK, not nav property gamer147 2026-05-28 21:15:40 -04:00
  • 177b4925a1 fix(session): bound the SID→UDID dict with FIFO eviction gamer147 2026-05-28 21:13:47 -04:00
  • 91412ff821 fix(account): /account/update_name validates name input gamer147 2026-05-28 21:11:27 -04:00
  • d13082a8ca fix(gift): receive response is idempotent and echoes persisted state gamer147 2026-05-28 21:10:06 -04:00
  • 86759125a9 fix(gift): tutorial gift_receive ThenIncludes OwnedItemEntry.Item gamer147 2026-05-28 21:08:19 -04:00
  • 82d9668c9b fix(pack): /tutorial/pack_open restricted to starter pack + pre-END viewer gamer147 2026-05-28 20:31:23 -04:00
  • 6fd8705990 fix(tutorial): /tutorial/update preserves max TutorialState gamer147 2026-05-28 20:22:59 -04:00
  • ac077dfc13 fix(pack): tutorial pack_open ThenIncludes OwnedItemEntry.Item gamer147 2026-05-28 20:15:31 -04:00
  • b50a884af9 fix(viewer): RegisterViewer defaults to post-tutorial TutorialState=100 gamer147 2026-05-28 20:07:05 -04:00
  • c2c6a95170 @ fix(tests): SeedViewerAsync tutorialState param is no longer sentinel-overloaded gamer147 2026-05-28 19:56:06 -04:00
  • ad5c9e91ae feat(download_time): stub start/end endpoints gamer147 2026-05-28 18:04:28 -04:00
  • 27ebb5114c fix(pack): tutorial flow display + open end-to-end gamer147 2026-05-28 18:04:13 -04:00
  • b5e33c15f6 fix(mypage): populate user_item_list from viewer.Items gamer147 2026-05-28 18:03:50 -04:00
  • d3ef76324f fix(load/index): UserInfo dates as nullable yyyy-MM-dd HH:mm:ss strings gamer147 2026-05-28 18:03:32 -04:00
  • f4f2ec380c feat(envelope): push required_res_ver from ResourceConfig on game_start gamer147 2026-05-28 18:03:15 -04:00
  • 1af0e03eeb fix(viewer): fresh signup defaults match prod tutorial capture gamer147 2026-05-28 18:02:52 -04:00
  • 6e6c8ee779 fix(signup): prestore client SID→UDID mapping so game_start can decrypt gamer147 2026-05-28 13:34:05 -04:00
  • 190b50cbaf fix(tutorial): gift_receive reward_list carries post-state totals, not deltas gamer147 2026-05-28 13:16:51 -04:00
  • 5d8a6626bb test(tutorial): add end-to-end capture-replay smoke gamer147 2026-05-28 13:00:18 -04:00
  • 6819e65160 feat(tutorial): /tutorial/pack_open emits tutorial_step=100, advances viewer state gamer147 2026-05-28 12:46:43 -04:00
  • ca678b56d1 feat(tutorial): alias /tutorial/pack_info to /pack/info gamer147 2026-05-28 12:27:35 -04:00
  • f6f9216162 feat(tutorial): add /tutorial/gift_receive — grant + receipt + idempotent re-claim gamer147 2026-05-28 12:13:12 -04:00
  • 2034034c1b feat(tutorial): add /tutorial/gift_top with hardcoded starter present list gamer147 2026-05-28 12:02:54 -04:00
  • 0f6b3f231a feat(account): add /account/update_name endpoint gamer147 2026-05-28 11:54:14 -04:00
  • bc9ffe1d31 feat(tutorial): add /tutorial/update — echo step + persist to viewer gamer147 2026-05-28 11:47:09 -04:00
  • 703f7ff3d7 feat(tutorial): add /tutorial/update_action fire-and-forget endpoint gamer147 2026-05-28 11:37:24 -04:00
  • f233a8c8d6 fix(viewer): fresh signups start at tutorial_state=0, not 100 gamer147 2026-05-28 11:27:37 -04:00
  • 36dd25826b fix(deck-builder): wire key is cardID/phantomCardID, not snake_case gamer147 2026-05-28 09:25:17 -04:00
  • 5aac24d2b9 feat(deck-builder): /deck_code mint + /deck resolve with 3-min in-memory TTL gamer147 2026-05-28 09:11:21 -04:00
  • 71b0c66631 test(card): snapshot-mismatch + protect-load round-trip gamer147 2026-05-28 02:21:57 -04:00
  • 433408dddb test(card): /card/protect controller integration gamer147 2026-05-28 02:05:28 -04:00
  • 1ee31c1689 controller(card): POST /card/protect gamer147 2026-05-28 01:56:47 -04:00
  • ecf819ca61 repo(card): SetProtected with zero-count-row preservation gamer147 2026-05-28 01:48:29 -04:00
  • b64123a9aa repo(card): ICardInventoryRepository.SetProtected surface gamer147 2026-05-28 01:42:50 -04:00
  • bac10b91ff test(card): /card/create controller integration gamer147 2026-05-28 01:38:42 -04:00
  • 9b5fe6dd83 controller(card): POST /card/create gamer147 2026-05-28 01:31:44 -04:00
  • 442399b268 dto(card): CardCreate request and response gamer147 2026-05-28 01:25:28 -04:00
  • 1eb34c7830 test(card): CreateCards validation matrix gamer147 2026-05-28 01:22:03 -04:00
  • e1becca659 repo(card): CreateCards happy path gamer147 2026-05-28 01:09:56 -04:00
  • dd80f5187a repo(card): ICardInventoryRepository.CreateCards surface gamer147 2026-05-28 01:03:41 -04:00
  • a851e6aa20 test(card): SetRedEtherAsync helper for create-path tests gamer147 2026-05-28 01:01:26 -04:00
  • 0867c5bd05 refactor(card): rename TryParseDestructDict to TryParseCardCountDict gamer147 2026-05-28 00:59:07 -04:00
  • 6e106d646b models(card): MaxCopies constant on OwnedCardEntry gamer147 2026-05-28 00:56:20 -04:00
  • 39b38e3c80 Battlepass fix gamer147 2026-05-28 00:54:46 -04:00
  • 0f44a3482c fix(shops): smoke-test fallout from today's shop-cluster ship gamer147 2026-05-27 23:57:12 -04:00
  • 7ef5f03eb3 feat(spot-card-exchange): /spot_card_exchange/{top,exchange} + SpotPoints currency gamer147 2026-05-27 23:23:07 -04:00
  • a5999a3e9c feat(leader-skin): shop catalog + 5 endpoints (/products, /buy, /buy_set, /buy_set_item, /ids) gamer147 2026-05-27 22:55:09 -04:00
  • 559a170957 feat(item-purchase): /item_purchase/{info,purchase} + catalog gamer147 2026-05-27 22:41:02 -04:00
  • f237851e42 feat(sleeve): shop catalog + /sleeve/{info,buy} endpoints gamer147 2026-05-27 22:09:45 -04:00
  • 6a03ff1bf6 feat(items): catalog import with Type + ThumbnailPath columns gamer147 2026-05-27 21:44:24 -04:00
  • 529fd13668 signup: close two concurrency holes from final review gamer147 2026-05-27 14:46:19 -04:00
  • 26bb0ac268 auth: link Steam to UDID-keyed viewer on first authenticated request gamer147 2026-05-27 14:31:06 -04:00
  • 68367db214 feat(tool/signup): anonymous viewer creation keyed on UDID gamer147 2026-05-27 14:24:55 -04:00
  • 7be0dabf87 dto: SignupRequest + empty SignupResponse gamer147 2026-05-27 14:16:11 -04:00
  • 859980af02 wire: echo UDID in DataHeaders on every response gamer147 2026-05-27 14:11:47 -04:00
  • c8ee1e487f ext: HttpContext.GetUdid() over SID-mapping service gamer147 2026-05-27 14:07:42 -04:00
  • f85589d208 repo(viewer): restore dropped rationale comment, add link-idempotency assertion gamer147 2026-05-27 14:06:35 -04:00
  • 30874c681f repo(viewer): add UDID lookup, anonymous register, Steam link helpers gamer147 2026-05-27 14:01:02 -04:00
  • dffd7a9746 db: add nullable Viewer.Udid with partial unique index gamer147 2026-05-27 13:54:15 -04:00
  • 8e35501954 feat(missions): emit progress events on story/finish and practice/finish gamer147 2026-05-27 10:51:05 -04:00
  • 5693ec0302 feat(missions): /load/index materializes viewer mission/achievement state gamer147 2026-05-27 10:45:31 -04:00
  • 640a77ec6c feat(achievements): /achievement/receive_reward — RewardGrantService + level advance + cap gamer147 2026-05-27 10:41:49 -04:00
  • b65a437102 feat(missions): /mission/info, /mission/retire, /mission/change_receive_setting gamer147 2026-05-27 10:35:40 -04:00
  • 574e9ca58b feat(missions): MissionAssembler — single DTO builder reused by all 4 endpoints gamer147 2026-05-27 10:31:38 -04:00
  • df65b7a9c8 feat(missions): common DTOs (UserMission, UserAchievement, BPMonthlyMission, MissionInfoData) gamer147 2026-05-27 10:30:29 -04:00
  • c9534d8fac feat(missions): ViewerMissionStateService — lazy materialize achievements + assign slots gamer147 2026-05-27 10:29:30 -04:00
  • aad604a589 feat(missions): MissionProgressService — counter upsert + achievement claimable on threshold gamer147 2026-05-27 10:25:13 -04:00
  • b38be1d953 feat(missions): JstPeriod helper — 02:00 JST anchored day/week/month keys gamer147 2026-05-27 10:21:51 -04:00
  • 6fbf7cbc94 feat(missions): mission catalog + viewer mission repositories gamer147 2026-05-27 10:21:07 -04:00
  • 8fd6bc10c1 chore(bootstrap): register 3 mission/achievement importers gamer147 2026-05-27 10:19:57 -04:00
  • 90cc5a9f5d feat(bp-monthly): BattlePassMonthlyMissionImporter, idempotent by (Y, M, order) gamer147 2026-05-27 10:18:03 -04:00
  • 6db800f286 feat(achievements): AchievementCatalogImporter, idempotent by (type, level) gamer147 2026-05-27 10:17:06 -04:00
  • 5df1822217 feat(missions): MissionCatalogImporter, idempotent upsert by id gamer147 2026-05-27 10:14:58 -04:00
  • f486c15d32 seed(bp-monthly): bp-monthly-missions.json — May 2026 (5 rows) gamer147 2026-05-27 10:13:51 -04:00
  • 8da91783b1 seed(achievements): achievement-catalog.json — 53 tiers / 52 types gamer147 2026-05-27 10:13:12 -04:00
  • 6a66170677 seed(missions): mission-catalog.json — 5 missions gamer147 2026-05-27 10:12:15 -04:00
  • ebba3c0eef feat(missions): wire 6 entities into DbContext + AddMissionsAndAchievements migration gamer147 2026-05-27 10:11:25 -04:00
  • 062adefb99 feat(missions): add 3 viewer entities + Viewer collections gamer147 2026-05-27 10:08:11 -04:00
  • 9988ed85df feat(missions): add 3 catalog entities (mission, achievement, BP monthly) gamer147 2026-05-27 10:01:27 -04:00
  • c303d3040d fix(bp): convert seed JST dates to UTC for Postgres timestamp-with-tz gamer147 2026-05-27 00:05:48 -04:00
  • c7dfd43daa review(bp): doc fixes + sales_period_info non-nullable + drop checked cast + TODO gamer147 2026-05-27 00:00:24 -04:00
  • 9147ab0ec7 feat(bp): AddPointsAsync plumbing + level-cross auto-grant + weekly cap gamer147 2026-05-26 23:47:30 -04:00
  • 4438e81e37 review(bp): post-state reward_list from RewardGrantService, not deltas gamer147 2026-05-26 23:42:06 -04:00
  • 2cb8c271a8 feat(bp): /battle_pass/buy — crystal-cost + retroactive premium grants gamer147 2026-05-26 23:36:18 -04:00
  • 0ceab721e9 feat(bp): /battle_pass/item_list — derives product per active season gamer147 2026-05-26 23:26:46 -04:00
  • d877febcb8 review(bp): move SaveChanges into repo with race protection; JST constant gamer147 2026-05-26 23:22:48 -04:00
  • 8a35f8c40b feat(bp): /battle_pass/info — service + controller + 3 tests gamer147 2026-05-26 23:14:26 -04:00
  • 6ed61ea9f1 feat(bp): /battle_pass/info response DTOs — string-typed wire numerics gamer147 2026-05-26 23:05:51 -04:00
  • 7abdfe27cb review(bp): drop fragile cast, thread CT, internalize cache reset gamer147 2026-05-26 23:01:26 -04:00
  • 9bec1df52f feat(load-index): populate battle_pass_level_info from IBattlePassService gamer147 2026-05-26 22:56:41 -04:00