public async Task <IActionResult> AppendMatchStats([FromBody] MatchStatsBody matchStats) { try { await service.AppendMatchStats(GetApiUserIdentityContainer(), matchStats); return(Ok()); } catch (Exception) { return(Error(new ErrorResult { Classification = ErrorClassification.InternalError, Message = "Failed saving match statistics" })); } }
private async Task <List <UpdatedMatchPlayer> > GetMatchPlayersToUpdate(MatchStatsBody matchStats) { // Find existing match players var updatedMatchPlayers = await(from mp in this.dbContext.MatchPlayer join ps in matchStats.Players on mp.SteamId equals ps.SteamId where mp.MatchId == matchStats.MatchId select new UpdatedMatchPlayer { Model = mp, Body = ps }) .ToListAsync(); // Find new match players (non existing) var newMatchPlayers = matchStats.Players .Except(updatedMatchPlayers.Select(ump => ump.Body)) .Select(ps => new UpdatedMatchPlayer { Model = new MatchPlayerModel { MatchId = matchStats.MatchId, Name = ps.GetBase64DecodedName(), SteamId = ps.SteamId }, Body = ps }).ToList(); if (newMatchPlayers.Count > 0) { // Insert new match players to the DB await this.dbContext.MatchPlayer.AddRangeAsync(newMatchPlayers.Select(nmp => nmp.Model)); // Save the new match players to the DB await this.dbContext.SaveChangesAsync(); // Add the list of new match players to the list of updated match players updatedMatchPlayers.AddRange(newMatchPlayers); } return(updatedMatchPlayers); }
public async Task AppendMatchStats(GameServerIdentityContainer apiUserIdentity, MatchStatsBody matchStats) { await this.dbContext.ValidateGameServerIdentity(apiUserIdentity); await this.dbContext.ValidateMatchNotEnded(matchStats.MatchId); if (matchStats.Players == null || matchStats.Players.Length == 0) { return; } try { using (var dbTransaction = await this.dbContext.Database.BeginTransactionAsync()) { var updatedMatchPlayers = await GetMatchPlayersToUpdate(matchStats); foreach (var updatedMatchPlayer in updatedMatchPlayers) { await AppendMatchPlayerWeaponTargets(updatedMatchPlayer); } await this.dbContext.SaveChangesAsync(); dbTransaction.Commit(); } } catch (Exception e) { throw new DataException("Failed appending match statistics."); } }