-
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