Example #1
0
        /// <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
            }
        }
Example #2
0
        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);
        }