Пример #1
0
        private List <WorkStatusMessage> CreateWorkStatusMessages(AnalyticsSummary analyticsSummary, string taProgressPercentage, int progressPercentage)
        {
            var workMessages = new List <WorkStatusMessage>();

            var memberSummaryContent =
                $@"Members Processed: {analyticsSummary.MembersProcessed}, 
                   Total Members: {analyticsSummary.TotalMembers }, 
                   Failed Members: {analyticsSummary.FailedMembers}, 
                   Skipped Members: {analyticsSummary.SkippedMembers }.";

            _logging.Log($"XL ui ta progress - {taProgressPercentage}; Status api ta progress - {progressPercentage};");
            _logging.Log(memberSummaryContent);

            // Customer level member summary message
            var customerMemberSummaryMessage = new WorkStatusMessage
            {
                Content           = memberSummaryContent,
                Severity          = TraceEventType.Information,
                ViewLevelProperty = WorkStatusMessage.ViewLevel.Customer
            };

            workMessages.Add(customerMemberSummaryMessage);

            // Internal member and claim/event summary work messages
            var internalMemberSummaryMessage = new WorkStatusMessage
            {
                Content           = memberSummaryContent,
                Severity          = TraceEventType.Information,
                ViewLevelProperty = WorkStatusMessage.ViewLevel.Internal
            };

            workMessages.Add(internalMemberSummaryMessage);

            var claimEventContent             = $@"Claims Processed: {analyticsSummary.ClaimsProcessed}, Events Generated: {analyticsSummary.EventsGenerated}.";
            var internalClaimEventWorkMessage = new WorkStatusMessage
            {
                Content           = claimEventContent,
                Severity          = TraceEventType.Information,
                ViewLevelProperty = WorkStatusMessage.ViewLevel.Internal
            };

            workMessages.Add(internalClaimEventWorkMessage);
            return(workMessages);
        }
Пример #2
0
        public Task RefreshAnalyics()
        {
            using (IServiceScope scope = _serviceProvider.CreateScope())
                using (ApplicationDbContext ctx = scope.ServiceProvider.GetRequiredService <ApplicationDbContext>())
                {
                    var rslt = CallAPIGetResults();

                    var summary = new AnalyticsSummary()
                    {
                        AnalyticsSummaryID = Guid.NewGuid(),
                        Created            = DateTime.Now,
                        RowCount           = rslt.Rows.LongCount()
                    };

                    var details = new List <AnalyticsDetail>();
                    foreach (var row in rslt.Rows)
                    {
                        details.Add(new AnalyticsDetail()
                        {
                            AnalyticsDetailID  = Guid.NewGuid(),
                            AnalyticsSummaryID = summary.AnalyticsSummaryID,
                            PagePath           = row.PagePath,
                            Visitors           = row.Vistitors,
                            Views = row.PageViews
                        });
                    }

                    ctx.Database.ExecuteSqlRaw("truncate table analyticssummary");
                    ctx.Database.ExecuteSqlRaw("truncate table analyticsdetail");

                    ctx.AnalyticsSummary.Add(summary);
                    ctx.AnalyticsDetail.AddRange(details);
                    ctx.SaveChanges();
                }
            return(Task.CompletedTask);
        }
Пример #3
0
        public async Task <IActionResult> OnGetAsync()
        {
            Showpiece = await _context.Showpiece.FirstOrDefaultAsync(f => f.Slug == Name);

            if (Showpiece == null)
            {
                return(new RedirectToPageResult("/Showpiece/List"));
            }

            RatingDisabled = !User.Identity.IsAuthenticated;

            if (User.Identity.IsAuthenticated)
            {
                var userID = Guid.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value);

                //Get user-specific rating
                var userRating = await _context.ShowpieceRating
                                 .AsNoTracking()
                                 .Where(w => w.UserID == userID && w.ShowpieceID == Showpiece.ShowpieceID)
                                 .AverageAsync(a => (decimal?)a.Rating);

                Rating = userRating ?? decimal.Zero;
            }

            if (Rating == decimal.Zero)
            {
                //Get average rating
                var totalRating = await _context.ShowpieceRating
                                  .AsNoTracking()
                                  .Where(w => w.ShowpieceID == Showpiece.ShowpieceID)
                                  .AverageAsync(a => (decimal?)a.Rating);

                Rating = totalRating ?? decimal.Zero;
            }

            RatingCount = await _context.ShowpieceRating.AsNoTracking().Where(w => w.ShowpieceID == Showpiece.ShowpieceID).LongCountAsync();

            var user = await _userManager.FindByIdAsync(Showpiece.UserID.ToString());

            Username = user?.UserName ?? "[Deleted]";

            Genres = await _context.Genre
                     .AsNoTracking()
                     .Join(_context.ShowpieceToGenre,
                           g => g.GenreID,
                           stg => stg.GenreID,
                           (g, stg) => new
            {
                stg.ShowpieceID,
                g.GenreID,
                g.Name,
                g.Normalized
            })
                     .Where(w => w.ShowpieceID == Showpiece.ShowpieceID)
                     .Select(s => new Genre()
            {
                GenreID    = s.GenreID,
                Name       = s.Name,
                Normalized = s.Normalized
            }).ToListAsync();

            //https://stackoverflow.com/questions/41822458/linq-group-by-on-multiple-tables-with-nested-group-by-with-join-and-aggregate
            var query = from comment in _context.Comment
                        join usr in _context.Users on comment.UserID.ToString() equals usr.Id
                            where comment.ShowpieceID == Showpiece.ShowpieceID
                        orderby comment.Created ascending
                        select new CommentWithUser
            {
                Comment  = comment,
                Username = usr.UserName
            };

            Comments = await query.ToListAsync();

            foreach (var comment in Comments)
            {
                var isAdmin = false;
                var isMod   = false;
                if (User.Identity.IsAuthenticated)
                {
                    var userForRole = await _userManager.GetUserAsync(User);

                    isAdmin = await _userManager.IsInRoleAsync(userForRole, "Admin");

                    isMod = await _userManager.IsInRoleAsync(userForRole, "Moderator");
                }
                var isSameUser = _userManager.GetUserId(User) == comment.Comment.UserID.ToString();
                comment.CanDelete = isAdmin || isMod || isSameUser;
            }

            var isCurrentAdmin = false;
            var isCurrentMod   = false;

            if (User.Identity.IsAuthenticated)
            {
                var currentUser = await _userManager.GetUserAsync(User);

                isCurrentAdmin = await _userManager.IsInRoleAsync(currentUser, "Admin");

                isCurrentMod = await _userManager.IsInRoleAsync(currentUser, "Moderator");
            }
            var isCurrentSameUser = _userManager.GetUserId(User) == Showpiece.UserID.ToString();

            CanEdit = isCurrentAdmin || isCurrentMod || isCurrentSameUser;

            AnalyticsDetail = await _context.AnalyticsDetail.FirstOrDefaultAsync(w => w.PagePath == string.Format(PageURITemplate, Showpiece.Slug));

            if (AnalyticsDetail == null)
            {
                AnalyticsDetail = new AnalyticsDetail();
            }

            AnalyticsSummary = await _context.AnalyticsSummary.FirstOrDefaultAsync();

            if (AnalyticsSummary == null)
            {
                AnalyticsSummary = new AnalyticsSummary()
                {
                    Created = new DateTime(9999, 12, 31)
                }
            }
            ;

            return(Page());
        }
        public ActionResult AnalyticsSummary()
        {
            var to   = DateTime.Today.AddDays(-1);
            var from = to.AddDays(-30);

            var model = new AnalyticsSummary
            {
                Visits       = new List <int>(),
                PageViews    = new Dictionary <string, int>(),
                PageTitles   = new Dictionary <string, string>(),
                TopReferrers = new Dictionary <string, int>(),
                TopSearches  = new Dictionary <string, int>()
            };

            var settings = RavenSession.Load <Settings>(Settings.DefaultId);

            var authFactory = new GAuthSubRequestFactory("analytics", ApplicationName)
            {
                Token = settings.SessionToken
            };


            var analytics = new AnalyticsService(authFactory.ApplicationName)
            {
                RequestFactory = authFactory
            };

            // Get from All Visits
            var visits = new DataQuery(settings.SiteId, from, to)
            {
                Metrics    = "ga:visits",
                Dimensions = "ga:date",
                Sort       = "ga:date"
            };

            foreach (DataEntry entry in analytics.Query(visits).Entries)
            {
                var value = entry.Metrics.First().IntegerValue;

                model.Visits.Add(value);
            }

            // Get Site Usage
            var siteUsage = new DataQuery(settings.SiteId, from, to)
            {
                Metrics = "ga:visits,ga:pageviews,ga:percentNewVisits,ga:avgTimeOnSite,ga:entranceBounceRate,ga:exitRate,ga:pageviewsPerVisit,ga:avgPageLoadTime"
            };
            var siteUsageResult = (DataEntry)analytics.Query(siteUsage).Entries.FirstOrDefault();

            if (siteUsageResult != null)
            {
                foreach (var metric in siteUsageResult.Metrics)
                {
                    switch (metric.Name)
                    {
                    case "ga:visits":
                        model.TotalVisits = metric.IntegerValue;
                        break;

                    case "ga:pageviews":
                        model.TotalPageViews = metric.IntegerValue;
                        break;

                    case "ga:percentNewVisits":
                        model.PercentNewVisits = metric.FloatValue;
                        break;

                    case "ga:avgTimeOnSite":
                        model.AverageTimeOnSite = TimeSpan.FromSeconds(metric.FloatValue);
                        break;

                    case "ga:entranceBounceRate":
                        model.EntranceBounceRate = metric.FloatValue;
                        break;

                    case "ga:exitRate":
                        model.PercentExitRate = metric.FloatValue;
                        break;

                    case "ga:pageviewsPerVisit":
                        model.PageviewsPerVisit = metric.FloatValue;
                        break;

                    case "ga:avgPageLoadTime":
                        model.AveragePageLoadTime = TimeSpan.FromSeconds(metric.FloatValue);
                        break;
                    }
                }
            }

            // Get Top Pages
            var topPages = new DataQuery(settings.SiteId, from, to)
            {
                Metrics          = "ga:pageviews",
                Dimensions       = "ga:pagePath,ga:pageTitle",
                Sort             = "-ga:pageviews",
                NumberToRetrieve = 20
            };

            foreach (DataEntry entry in analytics.Query(topPages).Entries)
            {
                var value = entry.Metrics.First().IntegerValue;
                var url   = entry.Dimensions.Single(x => x.Name == "ga:pagePath").Value.ToLowerInvariant();
                var title = entry.Dimensions.Single(x => x.Name == "ga:pageTitle").Value;

                if (!model.PageViews.ContainsKey(url))
                {
                    model.PageViews.Add(url, 0);
                }
                model.PageViews[url] += value;

                if (!model.PageTitles.ContainsKey(url))
                {
                    model.PageTitles.Add(url, title);
                }
            }

            // Get Top Referrers
            var topReferrers = new DataQuery(settings.SiteId, from, to)
            {
                Metrics          = "ga:visits",
                Dimensions       = "ga:source,ga:medium",
                Sort             = "-ga:visits",
                Filters          = "ga:medium==referral",
                NumberToRetrieve = 5
            };

            foreach (DataEntry entry in analytics.Query(topReferrers).Entries)
            {
                var visitCount = entry.Metrics.First().IntegerValue;
                var source     = entry.Dimensions.Single(x => x.Name == "ga:source").Value.ToLowerInvariant();

                model.TopReferrers.Add(source, visitCount);
            }

            // Get Top Searches
            var topSearches = new DataQuery(settings.SiteId, from, to)
            {
                Metrics          = "ga:visits",
                Dimensions       = "ga:keyword",
                Sort             = "-ga:visits",
                Filters          = "ga:keyword!=(not set);ga:keyword!=(not provided)",
                NumberToRetrieve = 5
            };

            foreach (DataEntry entry in analytics.Query(topSearches).Entries)
            {
                var visitCount = entry.Metrics.First().IntegerValue;
                var source     = entry.Dimensions.Single(x => x.Name == "ga:keyword").Value.ToLowerInvariant();

                model.TopSearches.Add(source, visitCount);
            }

            return(View(model));
        }