Ejemplo n.º 1
0
        private async Task PayRewardAsync(RewardDto reward, string userId)
        {
            var gameContext = _serviceProvider.GetRequiredService <GameContext>();
            var rosters     = await gameContext.Rosters.GetAsync(x => x.UserId == userId);

            if (rosters.Count() == 1)
            {
                var roster = rosters.First();
                gameContext.Rosters.Update(
                    x => x.Id == roster.Id,
                    Builders <Roster> .Update.Set(x => x.Experience, Math.Min(roster.Experience + reward.Experience, MaxExperience)));
                await gameContext.ApplyChangesAsync();
            }
        }
        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));
        }