public async Task <IActionResult> AddGameSummary([FromBody] CreateGameSummaryRequest request) { BaseballPlayRM lastPlayOfGame = null; var lastPlayKey = Dictionaries.cdBaseballPlayRM.Keys.FirstOrDefault(k => k.StartsWith(request.RetrosheetGameId)); if (!string.IsNullOrEmpty(lastPlayKey)) { Dictionaries.cdBaseballPlayRM.TryRemove(lastPlayKey, out lastPlayOfGame); } if (lastPlayOfGame == null || !lastPlayOfGame.EndOfGame) { request.HasValidationErrors = true; } else { request.HasValidationErrors = false; request.HomeTeamFinalScore = lastPlayOfGame.EndOfPlay_HomeScore; request.AwayTeamFinalScore = lastPlayOfGame.EndOfPlay_VisitorScore; request.HomeTeamBatsFirst = (lastPlayOfGame.TeamAtBat == "V" && lastPlayOfGame.IsBottomHalf == true) || (lastPlayOfGame.TeamAtBat == "H" && lastPlayOfGame.IsBottomHalf == false); } request.GameDay = request.RetrosheetGameId.Substring(3, 8); var cmd = _mapper.Map <CreateGameSummaryCommand>(request); await _commandSender.Send(cmd); return(Ok()); }
public static PLayersOnField EndOfPlay(BaseballPlayRM play, List <LineupRM> lineup) { if (play == null || lineup == null || lineup.Count == 0 || play.RetrosheetGameId != lineup[0].RetrosheetGameId) { throw new System.Exception("Invalid play or lineup"); } PLayersOnField players = new PLayersOnField(); players.RetrosheetGameId = play.RetrosheetGameId; players.EventNumber = play.EventNumber; players.IsStartOfPlay = false; players.inning = play.Inning; players.outs = play.EndOfPlay_Outs; players.TeamAtBat = play.TeamAtBat; players.HomeTeamScore = play.EndOfPlay_HomeScore; players.AwayTeamScore = play.EndOfPlay_VisitorScore; players.Pitcher = FindDefender(1, play.TeamAtBat, lineup[play.LineupChangeSequence - 1]); players.Catcher = FindDefender(2, play.TeamAtBat, lineup[play.LineupChangeSequence - 1]); players.FirstBaseman = FindDefender(3, play.TeamAtBat, lineup[play.LineupChangeSequence - 1]); players.SecondBaseman = FindDefender(4, play.TeamAtBat, lineup[play.LineupChangeSequence - 1]); players.ThirdBaseman = FindDefender(5, play.TeamAtBat, lineup[play.LineupChangeSequence - 1]); players.ShortStop = FindDefender(6, play.TeamAtBat, lineup[play.LineupChangeSequence - 1]); players.LeftFielder = FindDefender(7, play.TeamAtBat, lineup[play.LineupChangeSequence - 1]); players.CenterFielder = FindDefender(8, play.TeamAtBat, lineup[play.LineupChangeSequence - 1]); players.RightFielder = FindDefender(9, play.TeamAtBat, lineup[play.LineupChangeSequence - 1]); players.Batter = play.BatterEvent ? "" : FindPlayerByBattingOrder(play.BattingOrder, play.TeamAtBat, lineup[play.LineupChangeSequence - 1]); players.RunnerOnFirst = FindPlayerByBattingOrder(play.EndOfPlay_Runner1BO, play.TeamAtBat, lineup[play.LineupChangeSequence - 1]); players.RunnerOnSecond = FindPlayerByBattingOrder(play.EndOfPlay_Runner2BO, play.TeamAtBat, lineup[play.LineupChangeSequence - 1]); players.RunnerOnThird = FindPlayerByBattingOrder(play.EndOfPlay_Runner3BO, play.TeamAtBat, lineup[play.LineupChangeSequence - 1]); return(players); }
public async Task Handle(BaseballPlayCreatedEvent message) { BaseballPlayRM baseballPlay = _mapper.Map <BaseballPlayRM>(message); Dictionaries.Dictionaries.cdBaseballPlayRM.GetOrAdd(message.RetrosheetGameId + message.EventNumber.ToString("000"), baseballPlay); if (message.Details.EndOfGame) { baseballGameCompletedLogger.LogTrace(message.RetrosheetGameId); } await _baseballPlayRepo.SaveAsync(baseballPlay); }
public async Task <IActionResult> AddEvent([FromBody] CreateBaseballPlayRequest request) { BaseballPlayRM previousPlay = null; if (request.EventNumber > 1 && !Dictionaries.cdBaseballPlayRM.TryRemove(request.RetrosheetGameId + (request.EventNumber - 1).ToString("000"), out previousPlay)) { return(StatusCode(500, "Previous play data not available on server.")); } BaseballPlayDetails details = new BaseballPlayDetails(previousPlay, request.RetrosheetGameId, request.EventNumber, request.TeamAtBat.ToString(), request.EventText, request.LastPlay); request.Details = details; CreateBaseballPlayRequestValidator validator = new CreateBaseballPlayRequestValidator(); var validationResults = validator.Validate(request); foreach (var warning in validationResults.Errors.Where(e => e.Severity == FluentValidation.Severity.Warning)) { baseballPlayValidationLogger.LogWarning(request.RetrosheetGameId + " " + request.EventNumber.ToString("000") + " " + request.EventText + " : " + warning.ErrorMessage); } if (!validationResults.Errors.Any(e => e.Severity == FluentValidation.Severity.Error)) { var cmd = _mapper.Map <CreateBaseballPlayCommand>(request); await _commandSender.Send(cmd); } else { foreach (var validationError in validationResults.Errors.Where(e => e.Severity == FluentValidation.Severity.Error)) { baseballPlayValidationLogger.LogError(request.RetrosheetGameId + " " + request.EventNumber.ToString("000") + " " + request.EventText + " : " + validationError.ErrorMessage); } return(BadRequest(request.RetrosheetGameId + " " + request.EventNumber.ToString("000") + " " + request.EventText + " has validation errors")); } return(Ok()); }
private BaseballPlayRM CopyDetails(BaseballPlayCreatedEvent source) { BaseballPlayRM play = new BaseballPlayRM(); play.Inning = source.Details.Inning; play.TeamAtBat = source.Details.TeamAtBat; play.IsBottomHalf = source.Details.IsBottomHalf; play.BattingOrder = source.Details.BattingOrder; play.RetrosheetGameId = source.RetrosheetGameId; play.EventNumber = source.EventNumber; play.LineupChangeSequence = source.LineupChangeSequence; play.EventText = source.EventText; play.BasicPlay = source.Details.BasicPlay; play.Modifier = source.Details.Modifier; play.Batter = source.Batter; // CountOnBatter should be ?? if it is not an actual count. Source data commonly does not conform to this convention, but I don't want this to be a fatal error. play.Balls = Regex.IsMatch(source.CountOnBatter, "^[0-9]{2}$") ? int.Parse(source.CountOnBatter[0].ToString()) : (int?)null; play.Strikes = Regex.IsMatch(source.CountOnBatter, "^[0-9]{2}$") ? int.Parse(source.CountOnBatter[1].ToString()) : (int?)null; play.Pitches = source.Pitches; play.Runner1 = source.Details.Runner1; play.Runner2 = source.Details.Runner2; play.Runner3 = source.Details.Runner3; play.RunnerB = source.Details.RunnerB; play.Runner1Out = source.Details.Runner1Out; play.Runner2Out = source.Details.Runner2Out; play.Runner3Out = source.Details.Runner3Out; play.RunnerBOut = source.Details.RunnerBOut; play.OutsOnPlay = source.Details.OutsOnPlay; play.BatterEvent = source.Details.BatterEvent; play.HitValue = source.Details.HitValue; play.R1Destination = source.Details.R1Destination; play.R2Destination = source.Details.R2Destination; play.R3Destination = source.Details.R3Destination; play.RBDestination = source.Details.RBDestination; play.RunsOnPlay = source.Details.RunsOnPlay; play.AtBat = source.Details.AtBat; play.SacHit = source.Details.SacHit; play.SacFly = source.Details.SacFly; play.WildPitch = source.Details.WildPitch; play.PassedBall = source.Details.PassedBall; play.Bunt = source.Details.Bunt; play.Foul = source.Details.Foul; play.StolenBaseR1 = source.Details.StolenBaseR1; play.StolenBaseR2 = source.Details.StolenBaseR2; play.StolenBaseR3 = source.Details.StolenBaseR3; play.CaughtStealingR1 = source.Details.CaughtStealingR1; play.CaughtStealingR2 = source.Details.CaughtStealingR2; play.CaughtStealingR3 = source.Details.CaughtStealingR3; play.PickOffR1 = source.Details.PickOffR1; play.PickOffR2 = source.Details.PickOffR2; play.PickOffR3 = source.Details.PickOffR3; play.PlayOnBatter = source.Details.PlayOnBatter; play.PlayOnR1 = source.Details.PlayOnR1; play.PlayOnR2 = source.Details.PlayOnR2; play.PlayOnR3 = source.Details.PlayOnR3; play.EventType = source.Details.EventType; play.RBIB = source.Details.RBIB; play.RBI1 = source.Details.RBI1; play.RBI2 = source.Details.RBI2; play.RBI3 = source.Details.RBI3; play.RBI = source.Details.RBI; play.StartOfHalfInning = source.Details.StartOfHalfInning; play.EndOfHalfInning = source.Details.EndOfHalfInning; play.EndOfGame = source.Details.EndOfGame; play.VisitorNextBatter = source.Details.VisitorNextBatter; play.HomeNextBatter = source.Details.HomeNextBatter; play.StartOfPlay_Outs = source.Details.StartOfPlay.Outs; play.StartOfPlay_VisitorScore = source.Details.StartOfPlay.VisitorScore; play.StartOfPlay_HomeScore = source.Details.StartOfPlay.HomeScore; play.StartOfPlay_RunnerOnFirst = source.Details.StartOfPlay.RunnerOnFirst; play.StartOfPlay_Runner1BO = source.Details.StartOfPlay.Runner1BO; play.StartOfPlay_RunnerOnSecond = source.Details.StartOfPlay.RunnerOnSecond; play.StartOfPlay_Runner2BO = source.Details.StartOfPlay.Runner2BO; play.StartOfPlay_RunnerOnThird = source.Details.StartOfPlay.RunnerOnThird; play.StartOfPlay_Runner3BO = source.Details.StartOfPlay.Runner3BO; play.EndOfPlay_Outs = source.Details.EndOfPlay.Outs; play.EndOfPlay_VisitorScore = source.Details.EndOfPlay.VisitorScore; play.EndOfPlay_HomeScore = source.Details.EndOfPlay.HomeScore; play.EndOfPlay_RunnerOnFirst = source.Details.EndOfPlay.RunnerOnFirst; play.EndOfPlay_Runner1BO = source.Details.EndOfPlay.Runner1BO; play.EndOfPlay_RunnerOnSecond = source.Details.EndOfPlay.RunnerOnSecond; play.EndOfPlay_Runner2BO = source.Details.EndOfPlay.Runner2BO; play.EndOfPlay_RunnerOnThird = source.Details.EndOfPlay.RunnerOnThird; play.EndOfPlay_Runner3BO = source.Details.EndOfPlay.Runner3BO; return(play); }
public async Task SaveAsync(BaseballPlayRM item) { await _repo.SaveAsync(item, (x) => x.RetrosheetGameId + "_" + x.EventNumber.ToString("000")); }