public async Task <ActionResult <RewardContentDto> > ClaimAll() { var userId = User.Claims.GetUserId(); if (userId == null) { return(Forbid()); } var rewards = await Context.Rewards .AsTracking() .Where(o => o.Claimed == null && o.UserId == userId) .ToListAsync(); if (!rewards.Any()) { return(BadRequest()); } var rewarded = new List <IReward>(); foreach (var reward in rewards) { reward.Claimed = dateTimeProvider.Now; var items = rewardFactory.Claim(reward).ToList(); rewarded.AddRange(items); foreach (var item in items) { Context.Add(item); } } await Context.SaveChangesAsync(); var content = new RewardContentDto() { Items = Mapper.Map <ICollection <ItemDto> >(rewarded.OfType <Item>()), Equipment = Mapper.Map <ICollection <EquipmentDto> >(rewarded.OfType <Equipment>()), }; return(Ok(content)); }
public async Task <ActionResult <RewardContentDto> > ClaimReward([FromBody] RewardDto dto) { var userId = User.Claims.GetUserId(); if (userId == null) { return(Forbid()); } var reward = await Context.Rewards .AsTracking() .Where(o => o.Claimed == null) .FirstOrDefaultAsync(o => o.Id == dto.Id && o.RewardPoolId == dto.PoolId && o.UserId == userId); if (reward == null) { return(BadRequest(new InvalidRewardException())); } reward.Claimed = dateTimeProvider.Now; var items = rewardFactory.Claim(reward).ToList(); foreach (var item in items) { Context.Add(item); } await Context.SaveChangesAsync(); var content = new RewardContentDto() { Items = Mapper.Map <ICollection <ItemDto> >(items.OfType <Item>()), Equipment = Mapper.Map <ICollection <EquipmentDto> >(items.OfType <Equipment>()), }; return(Ok(content)); }
public async Task <ActionResult <RewardContentDto> > Buy([FromBody] ShopItemDto dto, [FromServices] IEquipmentGenerator equipmentGenerator) { var userId = User.Claims.GetUserId(); if (userId == null) { return(Forbid()); } var item = ShopInventory.Items.FirstOrDefault(o => o.ItemId == dto.ItemId && o.Rarity == dto.Rarity); if (item == null) { return(BadRequest()); } foreach (var price in item.Prices) { var currencies = await Context.Items .Where(o => o.UserId == userId) .Where(o => o.ItemId == price.CurrencyItemId) .Take(price.Quantity) .ToListAsync(); if (currencies.Count != price.Quantity) { return(BadRequest()); } Context.RemoveRange(currencies); } var content = new RewardContentDto(); if (EquipmentConstants.IsEquipmentConstant(item.ItemId)) { var fighterLevel = await Context.Fighters .Where(o => o.UserId == userId) .MaxAsync(o => o.Level); var itemLevel = fighterLevel.NearestBase(8); if (itemLevel < 1) { itemLevel = 1; } var equipment = equipmentGenerator.GenerateEquipment(item.ItemId, itemLevel, item.Rarity, userId.Value); Context.Add(equipment); content.Equipment.Add(Mapper.Map <EquipmentDto>(equipment)); } else { var boughtItem = new Item() { ItemId = item.ItemId, UserId = userId.Value, }; Context.Items.Add(boughtItem); content.Items.Add(Mapper.Map <ItemDto>(boughtItem)); } await Context.SaveChangesAsync(); return(Ok(content)); }