Esempio n. 1
0
        public async Task <IResponse> AssignPlayerToTeamAsync(int teamId, int playerId, byte number)
        {
            Logger?.LogInformation($"{nameof(AssignPlayerToTeamAsync)} has been invoked");

            var response = new SimpleResponse();

            try
            {
                var team = await TeamRepository.GetItemByIdAsync(teamId);

                if (team == null)
                {
                    throw new FlmException($"Team with id={teamId} doesn't exist");
                }

                var player = await PlayerRepository.GetItemByIdAsync(playerId);

                if (player == null)
                {
                    throw new FlmException($"Player with id={playerId} doesn't exist");
                }

                var existingAssignment = await TeamRepository.GetPlayerTeamAssignments()
                                         .Include(pta => pta.Team)
                                         .FirstOrDefaultAsync(pta => pta.PlayerId == playerId);

                if (existingAssignment != null)
                {
                    var msg = $"{player.GetDisplayName()} (id={playerId}) is already assigned " +
                              $"to team: { existingAssignment.Team.GetDisplayName()}";
                    throw new FlmException(msg);
                }

                var numberAssignment = TeamRepository.GetPlayerTeamAssignments()
                                       .Include(pta => pta.Player)
                                       .FirstOrDefault(pta => pta.TeamId == teamId && pta.Number == number);

                if (numberAssignment != null)
                {
                    throw new FlmException($"Number {number} is already taken by other player: {numberAssignment.Player.GetDisplayName()}");
                }

                await TeamRepository.AddPlayerAssignmentAsync(new PlayerTeamAssignment()
                {
                    TeamId   = teamId,
                    PlayerId = playerId,
                    Number   = number
                });

                Logger?.LogInformation($"Add {player} to {team}");
            }
            catch (Exception ex)
            {
                response.SetError(ex, Logger);
            }

            return(response);
        }