示例#1
0
        public async Task <MicroUrlStats> GetStatsAsync(string key)
        {
            var redirectable = await _redirectableStore.LoadAsync(key);

            if (redirectable == null)
            {
                return(null);
            }

            var from = redirectable.Created;
            var to   = DateTime.UtcNow;

            var allTimeStats = new StatCount
            {
                SeenVisitors   = new HashSet <string>(),
                UniqueVisitors = 0,
                VisitApplies   = x => true,
                Visitors       = 0
            };
            var dayStats = Enumerable.Range(0, LastXDays).Select(x => DateTime.UtcNow.Date.AddDays(-x))
                           .Select(x => new StatCount
            {
                SeenVisitors   = new HashSet <string>(),
                Visitors       = 0,
                UniqueVisitors = 0,
                VisitApplies   = item => item.Created.Date == x,
                Date           = x
            })
                           .ToList();
            var stats = new List <StatCount> {
                allTimeStats
            };

            dayStats.ForEach(stats.Add);

            await foreach (var item in _visitStore.GetVisitsOfRediretableBetween(key, from, to))
            {
                foreach (var stat in stats.Where(stat => stat.VisitApplies(item)))
                {
                    stat.Visitors++;
                    if (!stat.SeenVisitors.Contains(item.Ip))
                    {
                        stat.UniqueVisitors++;
                        stat.SeenVisitors.Add(item.Ip);
                    }
                }
            }

            return(new MicroUrlStats
            {
                Key = key,
                TargetUrl = _redirectService.ComputeTargetUrl(redirectable),
                AllTime = new HitStats
                {
                    From = from,
                    To = to,
                    Visitors = allTimeStats.Visitors,
                    UniqueVisitors = allTimeStats.UniqueVisitors
                },
                Recents = dayStats
                          .Select(statsForDay =>
                {
                    var dayEnd = statsForDay.Date.Value.AddDays(1);
                    return new HitStats
                    {
                        From = statsForDay.Date.Value,
                        To = dayEnd,
                        Visitors = statsForDay.Visitors,
                        UniqueVisitors = statsForDay.UniqueVisitors
                    };
                }).ToList()
            });
        }