public DomainResult BuyPlayer(string playerTypeId) { var playerBuyConfig = AllowedPlayers.FirstOrDefault(ap => ap.PlayerTypeId.Equals(playerTypeId)); if (playerBuyConfig == null) { return(DomainResult.Error(new CanNotUsePlayerInThisRaceError(playerTypeId))); } var amountOfPlayerTypeToBuy = Players.Count(p => p.PlayerTypeId.Equals(playerTypeId)); if (amountOfPlayerTypeToBuy >= playerBuyConfig.MaximumPlayers) { return(DomainResult.Error(new TeamFullError(playerBuyConfig.MaximumPlayers))); } if (playerBuyConfig.Cost.MoreThan(TeamMoney)) { return(DomainResult.Error(new FewMoneyInTeamChestError(playerBuyConfig.Cost.Value, TeamMoney.Value))); } var newTeamMoney = TeamMoney.Minus(playerBuyConfig.Cost); var orderedPositions = Players.Select(p => p.PlayerPositionNumber).OrderBy(p => p).ToList(); var travers = FindFirstFreeNumber(orderedPositions, 1); var playerBought = _teamState.BoughtEvent(TeamId, playerTypeId, travers, Guid.NewGuid(), newTeamMoney); Apply(new List <IDomainEvent> { playerBought }); return(DomainResult.Ok(playerBought)); }
public DomainResult RemovePlayer(Guid playerId) { var playerReadModel = Players.Single(p => p.PlayerId == playerId); var playerBuyConfig = AllowedPlayers.Single(ap => ap.PlayerTypeId.Equals(playerReadModel.PlayerTypeId)); var newTeamMoney = TeamMoney.Plus(playerBuyConfig.Cost); var playerRemovedFromDraft = new PlayerRemoved(TeamId, playerId, newTeamMoney); Apply(playerRemovedFromDraft); return(DomainResult.Ok(playerRemovedFromDraft)); }