public async Task ImportLeagueFromApiAsync(string leagueCode) { var competitionAlreadyImported = await _competitionRepository.ExistsAsync(c => leagueCode.Equals(c.LeagueCode)); if (competitionAlreadyImported) { throw new CompetitionAlreadyImportedException($"Competition with code '{leagueCode}' is already imported"); } var competition = await _footballClient.GetCompetitionByLeagueCodeAsync(leagueCode); if (competition == null) { throw new CompetitionNotFoundException($"Competition with code '{leagueCode}' was not found"); } var teams = (await _footballClient.GetTeamsByCompetition(competition)).ToList(); await _competitionRepository.CreateAsync(competition); await _teamRepository.AddNonExistingTeamsAsync(teams); await _competitionRepository.AddTeamsForCompetitionAsync(competition, teams); foreach (var team in teams) { try { // todo: these can be done in parallel, maybe var players = await _footballClient.GetPlayersByTeamAsync(team); await _playerRepository.AddPlayersToTeamAsync(team, players.ToList()); } catch (RequestNumberLimitExceededException) { // too many requests _log.Warn($"Exceeded number of request when importing players for teamId {team.Id}"); break; // todo: enqueue teams to be handled by another process } } }