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();
            }
        }
Exemple #2
0
        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();
        }