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)); }