public async Task <ActionResult> ImportMetricData(int year, int?month) { if (!IsSubscriptionActive) { // Data Imports require a valdi subscription var errResult = new MetricDataImport { success = true, errors = new List <JsonError> { new JsonError { ErrorMessage = string.Format("You need a valid subscription to import data. <a href='{0}' class='link'>Learn more</a>.", Url.Action("Index", "Billing")) } } }; return(Content(JsonConvert.SerializeObject(errResult), "application/json")); } ListHelper.InitializeAreas(CurrentUser); ListHelper.InitializeMetrics(CurrentUser); ListHelper.InitializeMetricDataSources(CompanyId); int[] myMetricIds = ListHelper.GetMetrics().Where(m => m.DataSourceId.HasValue).Select(m => m.Id).ToArray(); var results = await _metricManager.GetValuesFromDataSource(CompanyId, year, month, myMetricIds); return(Content(JsonConvert.SerializeObject(results, Formatting.None, new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd" }), "application/json")); }
public async Task <MetricDataImport> GetData(int companyId, ExternalApiAuth externalApiAuth, AuthorizationCodeWebApp.AuthResult authResult, IEnumerable <MetricDataPoint> metricDataPoints) { var metricDataImport = new MetricDataImport { success = true }; if (externalApiAuth == null) { // user is not connected to this API return(metricDataImport); } if (authResult.Credential == null) { // should be connected, but Google says we're not metricDataImport.errors.Add(new JsonError { ErrorMessage = "Google Analytics authorization revoked - unable to get data" }); return(metricDataImport); } metricDataImport.results = GAReports(externalApiAuth, authResult, metricDataPoints); return(metricDataImport); }
public async Task <MetricDataImport> GetValuesFromDataSource(int companyId, int year, int?month, int[] myMetricIds) { var metricDataImport = new MetricDataImport { success = true }; // First we get existing MetricDataPoints to cover the period specified var metricDataPoints = GetDataPointsForPeriod(companyId, year, month, myMetricIds).ToList(); // Remove any MetricDataPoints that are in the future metricDataPoints.RemoveAll(m => m.Date > DateTime.Today); var googleExternalApiAuth = _externalApiAuthManager.GetExternalApiAuth(companyId, ExternalApi.GoogleAnalytics.Id); if (googleExternalApiAuth != null) { // Get details needed for Google authorization var company = _companyManager.Get(companyId); var auth = _googleAuthorizer.Authorize(company.UniqueId, googleExternalApiAuth, "", CancellationToken.None); // Get Google data var googleAnalyticsImport = await _googleAnalyticsApiManager.GetData(companyId, _externalApiAuthManager.GetExternalApiAuth(companyId, 2), auth.Result, metricDataPoints); // Add results to local objecy metricDataImport.results.AddRange(googleAnalyticsImport.results); metricDataImport.errors.AddRange(googleAnalyticsImport.errors); } // Get ChartMogul data var chartMogulImport = await _chartMogulApiManager.GetData(companyId, _externalApiAuthManager.GetExternalApiAuth(companyId, ExternalApi.ChartMogul.Id), metricDataPoints); // Add results to the local object metricDataImport.results.AddRange(chartMogulImport.results); metricDataImport.errors.AddRange(chartMogulImport.errors); return(metricDataImport); }
public async Task <MetricDataImport> GetData(int companyId, ExternalApiAuth externalApiAuth, IEnumerable <MetricDataPoint> metricDataPoints) { var metricDataImport = new MetricDataImport { success = true }; if (externalApiAuth == null) { // user is not connected to this API return(metricDataImport); } var resultantDataPoints = new List <MetricDataPoint>(); var dataPoints = metricDataPoints as IList <MetricDataPoint> ?? metricDataPoints.ToList(); var dateList = dataPoints.Select(d => d.Date).Distinct(); try { // Loop for each distinct date provided in the MetricDataPoints foreach (var date in dateList) { // We want data for the last day of the month specified var dataDate = date.AddMonths(1).AddDays(-1); // Unless that puts us in the future, in which case get today's data if (dataDate > DateTime.Today) { dataDate = DateTime.Today; } var metricsChartMogul = dataPoints.Where(m => m.DataSourceId.HasValue && m.DataSourceId > 0 && m.DataSourceId < 9); if (metricsChartMogul.Any()) { // Setup objects for API call var client = GetHttpClient(_externalApi, externalApiAuth); // Call API to get all ChartMogul numbers. They can't take a range of a single day so we need to ask for two even though we only need one : / var response = await client.GetAsync(string.Format(_dataUrl, dataDate.AddDays(-1).ToString("yyyy-MM-dd"), dataDate.ToString("yyyy-MM-dd"))); if (response.IsSuccessStatusCode) { // Process resultant JSON string json = await response.Content.ReadAsStringAsync(); ChartMogulResponse results = JsonConvert.DeserializeObject <ChartMogulResponse>(json); resultantDataPoints.AddRange(ParseResults(results, dataDate, date, dataPoints)); } else { var errMsg = string.Format("{0}: {1}", _externalApi.Name, response.StatusCode); // Don't add the same error multiple times if (!metricDataImport.errors.Any(e => e.ErrorMessage == errMsg)) { var err = new JsonError { ErrorMessage = errMsg }; metricDataImport.errors.Add(err); } } } } } catch (Exception e) { metricDataImport.errors.Add(new JsonError { ErrorMessage = string.Format("{0}: {1}", _externalApi.Name, e.Message) }); } metricDataImport.results = resultantDataPoints; return(metricDataImport); }