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 ClaimAsync(DatabaseContext context, long userId)
        {
            var rewards = await context.Rewards
                          .Where(o => o.UserId == userId)
                          .AsTracking()
                          .Where(o => o.Claimed == null)
                          .ToListAsync();

            foreach (var reward in rewards)
            {
                reward.Claimed = dateTimeProvider.Now;
                context.AddRange(rewardFactory.Claim(reward).ToList());
            }
        }