Пример #1
0
            public void Return_Valid_CacheKey(string origin, string destination)
            {
                string expected = $"traintimes_{origin.RemoveWhiteSpace()}-{destination.RemoveWhiteSpace()}";

                string actual = CacheKeyHelper.GetTrainTimesCacheKey(origin, destination);

                Assert.Equal(expected, actual);
            }
Пример #2
0
 public void ThrowArgumentNullException(string origin, string destination)
 {
     Assert.Throws <ArgumentNullException>(() => CacheKeyHelper.GetTrainTimesCacheKey(origin, destination));
 }
Пример #3
0
 public void ThrowArgumentException_If_EmptyOrWhiteSpace(string origin, string destination)
 {
     Assert.Throws <ArgumentException>(() => CacheKeyHelper.GetTrainTimesCacheKey(origin, destination));
 }
Пример #4
0
        public async Task <IEnumerable <TrainTimeModel> > Handle(TrainTimesQuery request, CancellationToken cancellationToken)
        {
            string originLowerCase      = request.Origin.ToLower();
            string destinationLowerCase = request.Destination.ToLower();

            var trainTimes = await _memoryCache.GetOrCreateAsync(CacheKeyHelper.GetTrainTimesCacheKey(originLowerCase, destinationLowerCase),
                                                                 async entry =>
            {
                var nowEstonian = DateTimeHelper.NowEstonian();

                entry.AbsoluteExpirationRelativeToNow = DateTimeHelper.TimeUntilMidnight(nowEstonian);

                var times = await(from originStopTime in _peatusContext.StopTimes
                                  join destinationStopTime in _peatusContext.StopTimes
                                  on originStopTime.TripId equals destinationStopTime.TripId
                                  where (originStopTime.Trip.Route.AgencyId == AgencyType.Elron.Id &&
                                         destinationStopTime.Trip.Route.AgencyId == AgencyType.Elron.Id) &&
                                  (originStopTime.Stop.StopName.ToLower() == originLowerCase &&
                                   destinationStopTime.Stop.StopName.ToLower() == destinationLowerCase) &&
                                  originStopTime.StopSequence < destinationStopTime.StopSequence
                                  select new TrainTimeModel
                {
                    ServiceId      = destinationStopTime.Trip.ServiceId,
                    RouteLongName  = originStopTime.Trip.Route.RouteLongName,
                    RouteShortName = originStopTime.Trip.Route.RouteShortName,
                    Start          = originStopTime.DepartureTime,
                    End            = destinationStopTime.ArrivalTime
                }).OrderBy(o => o.Start).ToListAsync(cancellationToken);

                var calendarList = await(from calendar in _peatusContext.Calendar
                                         join serviceId in times.Select(t => t.ServiceId) on calendar.ServiceId equals serviceId
                                         select calendar).ToListAsync(cancellationToken);

                for (int i = times.Count - 1; i >= 0; i--)
                {
                    var time     = times[i];
                    var calendar = calendarList.FirstOrDefault(c => c.ServiceId == time.ServiceId);

                    if (calendar == null)
                    {
                        continue;
                    }

                    if (!StopExistsOnDay(nowEstonian.DayOfWeek, calendar))
                    {
                        times.RemoveAt(i);
                        continue;
                    }

                    if ((nowEstonian.Date < calendar.StartDate || nowEstonian > new DateTime(calendar.EndDate.Year,
                                                                                             calendar.EndDate.Month, calendar.EndDate.Day, 23, 59, 59)))
                    {
                        times.RemoveAt(i);
                    }
                }

                return(times);
            });

            if (request.All)
            {
                return(trainTimes);
            }

            var timeOfDay = DateTimeHelper.NowEstonian().TimeOfDay;

            return(trainTimes.Where(o => TimeSpan.Parse(o.Start) > timeOfDay));
        }