/// <summary> /// Syncs a srl race with it's persistent euivalent /// </summary> /// <param name="context">The database context</param> /// <param name="srlRace">The srl race</param> /// <returns>Returns the persisted race</returns> private static Race?SyncRace( DatabaseContext context , SRLRace srlRace ) { Logger.Info($"({srlRace.Id}) Synchronizing..."); Game g = SyncGame(context, srlRace); if (srlRace.State == SRLApiClient.Endpoints.RaceState.Over && context.GetRace(srlRace.Id) == null) { Logger.Info($"({srlRace.Id}) Race over and not persisted, continuing."); return(null); } Race?race = srlRace.Convert(g); race = context.AddOrUpdate(race); if (race != null) { race.ConsecutiveUpdateFailures = 0; SyncEntrants(context, srlRace, race); } return(race); }
/// <summary> /// Updates the existing or adss a new game entity based on the /// <paramref name="srlRace"/> /// </summary> /// <param name="context">The database context</param> /// <param name="srlRace">The SRL race</param> /// <returns>The updated game entity</returns> private static Game SyncGame( DatabaseContext context , SRLRace srlRace) { Game game = srlRace.Game.Convert(); return(context.AddOrUpdate(game)); }
public static RaceAnnouncer.Schema.Models.Race Convert( this SRLApiClient.Endpoints.Races.Race race , RaceAnnouncer.Schema.Models.Game game) => new Schema.Models.Race( game , race.Goal , race.Id.ToLower() , race.Time , true , race.State);
/// <summary> /// Updates existing, adds new and deletes removed entrants from /// the <paramref name="race"/> entity /// </summary> /// <param name="context">The database context</param> /// <param name="srlRace">The SRL race</param> /// <param name="race">The race entity</param> private static void SyncEntrants (DatabaseContext context , SRLRace srlRace , Race race) { foreach (SRLApiClient.Endpoints.Races.Entrant entrant in srlRace.Entrants) { context.AddOrUpdate(entrant.Convert(race)); } UpdateRemovedEntrants(context, srlRace, race); race.EntrantCount = srlRace.Entrants.Count; }
/// <summary> /// Remove entrants from the <paramref name="race"/> entity which are /// no longer in the <paramref name="srlRace"/>. /// </summary> /// <param name="context">The database context</param> /// <param name="srlRace">The SRL race</param> /// <param name="race">The race entity</param> private static void UpdateRemovedEntrants( DatabaseContext context , SRLRace srlRace , Race race) { IEnumerable <Entrant> registeredEntrants = context.GetEntrants(race); foreach (Entrant e in registeredEntrants .Where(e => !srlRace.Entrants .Any(s => s.Name.Equals(e.DisplayName)))) { context.DeleteEntrant(e); } }
/// <summary> /// Attempts to fetch and update race details of race entities /// which are no longer in the SRL race list. /// </summary> /// <param name="context">The database context</param> /// <param name="srlService">The srl service</param> /// <param name="updatedRaces">The list of updated races</param> public static async Task UpdateDroppedRacesAsync( DatabaseContext context , SRLService srlService , List <Race> updatedRaces) { List <Race> remainingActiveRaces = context .Races .Local .Where(r => r.IsActive && !updatedRaces.Any(ur => ur.SrlId.Equals(r.SrlId, StringComparison.CurrentCultureIgnoreCase))) .ToList(); foreach (Race race in remainingActiveRaces) { try { Logger.Info($"({race.Id}) Dropped, Fetching race..."); SRLRace srlRace = await srlService.GetRaceAsync(race.SrlId).ConfigureAwait(false); Logger.Info($"({race.Id}) Race fetched, Synchronizing..."); SyncRace(context, srlRace); } catch (Exception ex) { Logger.Error($"({race.SrlId}) Exception thrown", ex); race.ConsecutiveUpdateFailures++; if (race.ConsecutiveUpdateFailures > 10) { Logger.Info($"({race.SrlId}) Deactivating race..."); race.IsActive = false; if (race.State < SRLApiClient.Endpoints.RaceState.Finished) { race.State = SRLApiClient.Endpoints.RaceState.Unknown; } } } } }