private object GetHistory(AnalyticsEndpoint analytics, string profileId, IPublishedContent content, AnalyticsDataMode mode, Period period) { // Declare the options for the request AnalyticsGetDataOptions options = new AnalyticsGetDataOptions { ProfileId = profileId, StartDate = period.StartDate, EndDate = period.EndDate, Metrics = AnalyticsMetrics.Sessions + AnalyticsMetrics.Pageviews, Dimensions = AnalyticsDimensions.Hour }; if (mode == AnalyticsDataMode.Page) { // Google Analytics sees the same URL with and without a trailing slash as two different pages, so we should tell the query to check both string pageUrlTrimmed = content.Url.TrimEnd('/'); string pageUrlSlashed = pageUrlTrimmed + '/'; options.Filters.Add(new AnalyticsDimensionFilter(AnalyticsDimensions.PagePath, AnalyticsDimensionOperator.ExactMatch, pageUrlTrimmed)); options.Filters.Add(new AnalyticsDimensionFilter(AnalyticsDimensions.PagePath, AnalyticsDimensionOperator.ExactMatch, pageUrlSlashed)); } // Determine the dimension based on the length of the period if (period.Days <= 1) { options.Dimensions = AnalyticsDimensions.Hour; } else if (period.Days <= 31) { options.Dimensions = AnalyticsDimensions.Date; } else { options.Dimensions = AnalyticsDimensions.YearWeek; } // Get the data from the Analytics API AnalyticsGetDataResponse response = analytics.Data.GetData(options); // Return an empty model if there are no valid rows if (response.Body.Rows.All(x => x.GetInt32(AnalyticsMetrics.Sessions) == 0)) { return(new AnalyticsHistory()); } // Initialize the data sets ChartJsDataSet pageviews = new ChartJsDataSet("Pageviews", "#F1BFBD"); ChartJsDataSet sessions = new ChartJsDataSet("Sessions", "#1D274E"); // Initialize the chart data ChartJsData chart = new ChartJsData { DataSets = new List <ChartJsDataSet> { pageviews, sessions } }; // Populate the labels and data of each data set foreach (AnalyticsDataRow row in response.Body.Rows) { if (row.TryGetValue(AnalyticsDimensions.Date, out string date)) { DateTime dt = DateTime.ParseExact(date, "yyyyMMdd", CultureInfo.InvariantCulture); chart.Labels.Add(dt.ToString("MMM d")); } else if (row.TryGetValue(AnalyticsDimensions.Hour, out string hour)) { chart.Labels.Add(hour); } else if (row.TryGetValue(AnalyticsDimensions.YearWeek, out string yearWeek)) { chart.Labels.Add("W" + Int32.Parse(yearWeek.Substring(4))); } else { chart.Labels.Add(row.Cells[0].Value); } chart.Rows.Add(row); pageviews.Data.Add(row.GetString(AnalyticsMetrics.Pageviews)); sessions.Data.Add(row.GetString(AnalyticsMetrics.Sessions)); } return(new AnalyticsHistory { Chart = chart }); }
public object GetData(int pageId, string period = "yesterday") { IPublishedContent content = Umbraco.Content(pageId); if (content == null) { return(Request.CreateResponse(JsonMetaResponse.GetError("Page not found or not published."))); } IPublishedContent site = GetSiteNode(content); if (site == null) { return(Request.CreateResponse(JsonMetaResponse.GetError("Unable to determine site node."))); } AnalyticsProfileSelection selection = site.Value("analyticsProfile") as AnalyticsProfileSelection; // Get a reference to the configuration of this package AnalyticsConfig config = AnalyticsConfig.Current; string profileId = null; GoogleService service = null; if (selection != null && selection.IsValid) { profileId = selection.Profile.Id; AnalyticsConfigUser user = config.GetUserById(selection.User.Id); if (user != null) { service = GoogleService.CreateFromRefreshToken( user.Client.ClientId, user.Client.ClientSecret, user.RefreshToken ); } } // Fallback to app settings (if specified) if (service == null && config.HasAppSettings) { profileId = config.AppSettings.AnalyticsProfileId; service = GoogleService.CreateFromRefreshToken( config.AppSettings.GoogleClientId, config.AppSettings.GoogleClientSecret, config.AppSettings.GoogleRefreshToken ); } if (String.IsNullOrWhiteSpace(profileId) || service == null) { return(Request.CreateResponse(JsonMetaResponse.GetError("The Analytics package is not configured."))); } AnalyticsDataMode mode = content.Id == site.Id ? AnalyticsDataMode.Site : AnalyticsDataMode.Page; Period p = Period.Parse(period); return(new { period = p, page = new { id = content.Id, name = content.Name, url = content.Url }, history = GetHistory(service.Analytics, profileId, content, mode, p) }); }