public async Task <ResultsEngineStatuses> Process(ITeamResultEngineContext context, IGameResults request, ResultsEngineResponse response) { var ok = true; var ruleSet = await context.GetRuleSet(); RuleSetXRule rule = await context.GetRuleSpecification(Entities.Rule.Rules.CheckMaximumGamesForHigherRankedCompetition); if (ruleSet.Competitions.Count > 0) { int maxGames = rule.DataInt1.Value; ITeamMatchModel match = await context.Fixture.GetMatch(request.MatchID); BowlsResults.Common.Domain.Entities.Team homeTeam = match.Data.Home; BowlsResults.Common.Domain.Entities.Team awayTeam = match.Data.Away; var statistics = await context.GetCompetitionPlayerGameStatistic(request, match); var competitionIDs = ruleSet.Competitions.Select(x => x.CompetitionID).ToList(); // Get index of the competition var index = competitionIDs.FindIndex(x => x == context.Competition.ID); // Remove all other competitions to leave only higher ones competitionIDs.RemoveRange(index, competitionIDs.Count - index); var allPlayers = context.GetAllPlayersWithTeam(request, match); foreach (var(playerID, team) in allPlayers) { ok &= await this.Validate(context, response, statistics, competitionIDs, maxGames, playerID); } } return(ResultEngineStatusMapper.MapFromBool(ok)); }
public async Task <ResultsEngineStatuses> Process(ITeamResultEngineContext context, IGameResults request, ResultsEngineResponse response) { var ok = true; RuleSetXRule rule = await context.GetRuleSpecification(Entities.Rule.Rules.CheckMaximumGamesForHigherRankedTeamPerCompetition); int maxGames = rule.DataInt1.Value; ITeamMatchModel match = await context.Fixture.GetMatch(request.MatchID); BowlsResults.Common.Domain.Entities.Team homeTeam = match.Data.Home; BowlsResults.Common.Domain.Entities.Team awayTeam = match.Data.Away; var statistics = await context.GetCompetitionPlayerGameStatistic(request, match); var teams = await this._competitionRepository.GetCompetitionTeams(context.Competition.ID); foreach (var gameResult in request.GameResults) { IEnumerable <int> homeIDs = GetHigherRankedTeamIDs(teams, homeTeam); IEnumerable <int> awayIDs = GetHigherRankedTeamIDs(teams, awayTeam); foreach (var playerID in gameResult.HomePlayers) { ok &= this.Validate(context, response, statistics, homeIDs, maxGames, playerID); } foreach (var playerID in gameResult.AwayPlayers) { ok &= this.Validate(context, response, statistics, awayIDs, maxGames, playerID); } } return(ResultEngineStatusMapper.MapFromBool(ok)); }
private bool Validate(ITeamResultEngineContext context, ResultsEngineResponse response, ReadOnlyCollection <CompetitionPlayerGameStatistic> statistics, int playerID, BowlsResults.Common.Domain.Entities.Team team) { var ok = true; var otherClub = statistics.FirstOrDefault(x => x.PlayerID == playerID && x.Team.Club.ID != team.Club.ID); if (otherClub != null) { var player = context.GetPreloadedPlayer(playerID); response.ValidationResult.Errors.Add(new ValidationFailure($"SingleClubPlayer{playerID}", $"{player.DisplayName} has already played for {otherClub.Team.Club.Name} in this competition.")); ok = false; } return(ok); }
private static IEnumerable <int> GetHigherRankedTeamIDs(List <CompetitionTeam> teams, BowlsResults.Common.Domain.Entities.Team team) { var otherTeams = teams.Where(x => x.Team.Club.ID == team.Club.ID).OrderBy(x => x.Team.Suffix).ToList(); // Get index of the team var index = otherTeams.FindIndex(x => x.Team.ID == team.ID); // Remove all other teams to leave only higher ones otherTeams.RemoveRange(index, otherTeams.Count - index); return(otherTeams.Select(x => x.Team.ID)); }