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); }
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); }
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)); }