using Microsoft.AspNetCore.Mvc; using SVSim.EmulatedEntrypoint.Models.Dtos.BattlePass; using SVSim.EmulatedEntrypoint.Models.Dtos.Requests; using SVSim.EmulatedEntrypoint.Services; namespace SVSim.EmulatedEntrypoint.Controllers; /// /// /battle_pass/* — season metadata, premium-pass purchase. Wire shapes mirror /// Wizard/BattlePass{Info,PurchaseInfo,Buy}Task.cs. /// [Route("battle_pass")] public class BattlePassController : SVSimController { private readonly IBattlePassService _battlePass; public BattlePassController(IBattlePassService battlePass) { _battlePass = battlePass; } [HttpPost("info")] public async Task Info(BaseRequest request, CancellationToken ct) { if (!TryGetViewerId(out long viewerId)) return Unauthorized(); var info = await _battlePass.GetInfoAsync(viewerId, ct); if (info is null) return Ok(new { }); // off-season: empty payload return Ok(info); } [HttpPost("item_list")] public async Task ItemList(BaseRequest request, CancellationToken ct) { if (!TryGetViewerId(out long viewerId)) return Unauthorized(); var list = await _battlePass.GetItemListAsync(viewerId, ct); if (list is null) return Ok(new { }); return Ok(list); } [HttpPost("buy")] public async Task Buy(BattlePassBuyRequest request, CancellationToken ct) { if (!TryGetViewerId(out long viewerId)) return Unauthorized(); var outcome = await _battlePass.BuyPremiumAsync(viewerId, request.SeasonId, request.Id, ct); var response = new BattlePassBuyResponse { ResultCode = outcome.ResultCode, AchievedInfo = new BattlePassAchievedInfoDto { BattlePassRewardList = outcome.AchievedRewards .Select(g => new BattlePassReceivedRewardDto { RewardType = g.RewardType, RewardDetailId = g.RewardId, RewardNumber = g.RewardNum, }).ToList(), }, RewardList = outcome.PostStateTotals .Select(g => new BattlePassRewardListEntryDto { RewardType = g.RewardType, RewardId = g.RewardId, RewardNum = g.RewardNum, }).ToList(), }; return Ok(response); } }