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);
        }
示例#3
0
        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);
        }