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); }