public void Run(SoccerDataContext dbContext) { var dbCompetitionSeason = dbContext.CompetitionSeasons .Include(x => x.CompetitionSeasonRounds) .Include(x => x.Competition) .SingleOrDefault(x => x.CompetitionSeasonId == this.CompetitionSeasonId); if (dbCompetitionSeason == null) { return; } Console.WriteLine($"CSR-{dbCompetitionSeason.CompetitionSeasonId}-{dbCompetitionSeason.Season}-{dbCompetitionSeason.Competition.CompetitionName}"); var url = Feeds.CompetitionSeasonRoundsFeed.GetFeedUrlByLeagueId(dbCompetitionSeason.ApiFootballId); var rawJson = JsonUtility.GetRawJsonFromUrl(url); var feed = Feeds.CompetitionSeasonRoundsFeed.FromJson(rawJson); var dbRounds = dbCompetitionSeason.CompetitionSeasonRounds.ToList(); var feedRounds = feed.Result.Rounds.Select(x => x.Replace('_', ' ')).ToList(); bool hasUpdates = false; foreach (var feedRound in feedRounds) { var dbRound = dbRounds.SingleOrDefault(x => string.Equals(x.ApiFootballKey, feedRound, StringComparison.InvariantCultureIgnoreCase)); if (dbRound == null) { dbRound = new CompetitionSeasonRound { CompetitionSeasonId = dbCompetitionSeason.CompetitionSeasonId, RoundName = feedRound, ApiFootballKey = feedRound }; hasUpdates = true; dbRounds.Add(dbRound); dbContext.CompetitionSeasonRounds.Add(dbRound); } } if (hasUpdates) { dbContext.SaveChanges(); } }
public void Run(SoccerDataContext dbContext) { var dbCompetitionSeason = dbContext.CompetitionSeasons .Include(x => x.CompetitionSeasonRounds) .Include(x => x.Fixtures) .Include(x => x.Competition) .SingleOrDefault(x => x.CompetitionSeasonId == this.CompetitionSeasonId); if (dbCompetitionSeason == null) { return; } Console.WriteLine($"LFx-{dbCompetitionSeason.CompetitionSeasonId}-{dbCompetitionSeason.Season}-{dbCompetitionSeason.Competition.CompetitionName}"); var url = Feeds.FixturesFeed.GetFeedUrlByLeagueId(dbCompetitionSeason.ApiFootballId); var rawJson = JsonUtility.GetRawJsonFromUrl(url); var feed = Feeds.FixturesFeed.FromJson(rawJson); var teamIds = feed.Result.Fixtures.SelectMany(x => new[] { x.AwayTeam.TeamId, x.HomeTeam.TeamId }).Distinct().ToList(); var fixtureDict = dbCompetitionSeason.Fixtures.ToDictionary(x => x.ApiFootballId); var teamDict = dbContext.TeamSeasons.Include(x => x.Team).Where(x => x.CompetitionSeasonId == this.CompetitionSeasonId && teamIds.Contains(x.Team.ApiFootballId)).ToDictionary(x => x.Team.ApiFootballId, y => y.TeamSeasonId); var venueDict = dbContext.VenueSeasons.Where(x => x.Season == dbCompetitionSeason.Season).ToList(); var roundDict = dbCompetitionSeason.CompetitionSeasonRounds.ToDictionary(x => x.ApiFootballKey, y => y); var feedFixtures = feed.Result.Fixtures.Where(x => x.Status != "Match Postponed").OrderBy(x => x.EventTimestamp).ThenBy(x => x.HomeTeam?.TeamName).ToList(); #region ADD MISSING TEAMS INDIVIDUALLY (THEY ARE NOT IN THE API TEAMS LIST) var apiTeamIds = feedFixtures.SelectMany(x => new[] { x.AwayTeam.TeamId, x.HomeTeam.TeamId }).ToList(); var missingApiTeamIds = apiTeamIds.Where(x => !teamDict.ContainsKey(x)).ToList(); if (missingApiTeamIds != null && missingApiTeamIds.Count > 0) { foreach (var missingApiTeamId in missingApiTeamIds) { var dbTeam = dbContext.Teams.SingleOrDefault(x => x.ApiFootballId == missingApiTeamId); if (dbTeam == null) { var teamProcessor = new TeamProcessor(missingApiTeamId); teamProcessor.Run(dbContext); dbTeam = dbContext.Teams.SingleOrDefault(x => x.ApiFootballId == missingApiTeamId); } var dbTeamSeason = dbContext.TeamSeasons.SingleOrDefault(x => x.TeamId == dbTeam.TeamId && x.CompetitionSeasonId == this.CompetitionSeasonId); if (dbTeamSeason == null) { // CANNOT SET VENUE HERE FROM dbTeam OR API TEAM CALL BECAUSE OF POSSIBLE SEASON MISMATCH dbTeamSeason = new TeamSeason { CompetitionSeasonId = this.CompetitionSeasonId, TeamId = dbTeam.TeamId, LogoUrl = dbTeam.LogoUrl, Season = dbCompetitionSeason.Season, TeamName = dbTeam.TeamName }; dbContext.TeamSeasons.Add(dbTeamSeason); dbContext.SaveChanges(); teamDict.Add(dbTeam.ApiFootballId, dbTeamSeason.TeamSeasonId); } } } #endregion ADD MISSING TEAMS INDIVIDUALLY for (int i = 0; i < feedFixtures.Count; i++) { var feedFixture = feedFixtures[i]; if (!fixtureDict.TryGetValue(feedFixture.FixtureId, out Fixture dbFixture)) { if (!roundDict.TryGetValue(feedFixture.Round, out CompetitionSeasonRound dbRound)) { dbRound = new CompetitionSeasonRound { ApiFootballKey = feedFixture.Round, CompetitionSeason = dbCompetitionSeason, RoundName = feedFixture.Round }; dbContext.CompetitionSeasonRounds.Add(dbRound); roundDict.Add(dbRound.ApiFootballKey, dbRound); } dbFixture = new Fixture { ApiFootballId = feedFixture.FixtureId, CompetitionSeasonId = dbCompetitionSeason.CompetitionSeasonId, CompetitionSeasonRound = dbRound }; fixtureDict.Add(feedFixture.FixtureId, dbFixture); dbContext.Fixtures.Add(dbFixture); } // ALLOW TEAMS TO CHANGE UNTIL GAME STARTS // ASSUME TEAMS ARE POPULATED FROM TeamsFeed #region TEAMS if (!dbFixture.HomeTeamSeasonId.HasValue || !dbFixture.AwayTeamSeasonId.HasValue || (feedFixture.HomeTeam?.TeamId != null && dbFixture.HomeTeamSeason?.Team != null && dbFixture.HomeTeamSeason.Team.ApiFootballId != feedFixture.HomeTeam.TeamId) || (feedFixture.AwayTeam?.TeamId != null && dbFixture.AwayTeamSeason?.Team != null && dbFixture.AwayTeamSeason.Team.ApiFootballId != feedFixture.AwayTeam.TeamId)) { if (feedFixture.HomeTeam != null) { int homeTeamSeasonId = teamDict[feedFixture.HomeTeam.TeamId]; if (dbFixture.HomeTeamSeasonId != homeTeamSeasonId) { dbFixture.HomeTeamSeasonId = homeTeamSeasonId; } } if (feedFixture.AwayTeam != null) { int awayTeamSeasonId = teamDict[feedFixture.AwayTeam.TeamId]; if (dbFixture.AwayTeamSeasonId != awayTeamSeasonId) { dbFixture.AwayTeamSeasonId = awayTeamSeasonId; } } } #endregion TEAMS FixturesProcessorHelper.SetFixtureProperties(feedFixture, ref dbFixture); FixturesProcessorHelper.SetScoringProperties(feedFixture, ref dbFixture); } dbContext.SaveChanges(); }