/// <inheritdoc /> public async Task SeedAgenciesAsync( CancellationToken cancellationToken = default ) { var nextbusResponse = await GetNextBusPolicy() .ExecuteAsync(_ => _nextbusClient.GetAgencies(), cancellationToken) .ConfigureAwait(false); var nextbusAgencies = nextbusResponse.ToArray(); _logger.LogInformation("{0} agencies are loaded from NextBus", nextbusAgencies.Length); for (int i = 0; i < nextbusAgencies.Length; i++) { var nextbusAgency = nextbusAgencies[i]; if (nextbusAgency.Tag != "ttc") { continue; } var mongoAgency = await _agencyRepo.GetByTagAsync(nextbusAgency.Tag, cancellationToken) .ConfigureAwait(false); if (mongoAgency == null) { _logger.LogInformation("Inserting agency {0} ({1})", nextbusAgency.Title, nextbusAgency.Tag); mongoAgency = Converter.FromNextBusAgency(nextbusAgency); // ToDo find a better way to assign countries if (new[] { "Quebec", "Ontario" }.Contains(mongoAgency.Region)) { mongoAgency.Country = "Canada"; } else if (mongoAgency.Region == "Other") { mongoAgency.Country = "Test"; } else { mongoAgency.Country = "USA"; } await _agencyRepo.AddAsync(mongoAgency, cancellationToken) .ConfigureAwait(false); } else { _logger.LogDebug("Agency {0} already exists", nextbusAgency.Tag); } var boundaries = await UpdateRoutesForAgencyAsync(nextbusAgency.Tag, cancellationToken) .ConfigureAwait(false); // ToDo first, check if update is really required mongoAgency.MinLatitude = boundaries.MinLat; mongoAgency.MaxLatitude = boundaries.MaxLat; mongoAgency.MinLongitude = boundaries.MinLon; mongoAgency.MaxLongitude = boundaries.MaxLon; await _agencyRepo.UpdateAsync(mongoAgency, cancellationToken) .ConfigureAwait(false); // ToDo update max/min lat/lon for agency } }
public async Task SeedDatabaseAsync(bool includeTestData) { bool created = await _dbContext.Database.EnsureCreatedAsync().ConfigureAwait(false); if (created) { _logger.LogInformation("Database created."); } var nxtbAgencies = (await _nextBusClient.GetAgencies().ConfigureAwait(false)).ToArray(); _logger.LogDebug("{0} agencies found.", nxtbAgencies.Length); await _dbContext.Agencies.LoadAsync().ConfigureAwait(false); await _dbContext.AgencyRoutes.LoadAsync().ConfigureAwait(false); await _dbContext.RouteDirections.LoadAsync().ConfigureAwait(false); await _dbContext.BusStops.LoadAsync().ConfigureAwait(false); for (int i = 0; i < nxtbAgencies.Length; i++) { var nxtbAgency = nxtbAgencies[i]; if (nxtbAgency.Tag.Equals(TestAgencyTag, StringComparison.OrdinalIgnoreCase) && !includeTestData) { _logger.LogDebug("Skipping test agency: {0}.", nxtbAgency.Tag); continue; } //for testing // if (!new[] {"ttc", "jtafla", "configdev"}.Contains(nxtbAgency.Tag)) // continue; try { if (_dbContext.Agencies.Local.All(a => a.Tag != nxtbAgency.Tag)) { _logger.LogDebug("Seeding data for agency {0}", nxtbAgency.Tag); await SeedAgencyDataAsync(nxtbAgency).ConfigureAwait(false); } } catch (Exception e) when(e is NextBusException || e is System.Net.Http.HttpRequestException) { // Retry the same agency after a moment _logger.LogWarning(e.Message); await Task.Delay(2_500).ConfigureAwait(false); i--; } catch (Exception e) { _logger.LogCritical("Unexpected exceptoin happened in data seeding.\n{0}", e); throw; } } await _dbContext.SaveChangesAsync().ConfigureAwait(false); }