public YCustomReport Get(YReportInitializer initializer) { WebClient wc = new WebClient(); wc.Headers.Add( "Authorization", $"OAuth {YCommonCredentialManager.Get(new YRestCredentialInitializer(config.TokensJsonPath)).AccessToken}" ); string url = $"{ config.ApiUrl}stat/v1/data?ids={initializer.Counter.Id.ToString()}" + $"&date1={initializer.DateStart.ToString("yyyy-MM-dd")}" + $"&date2={initializer.DateEnd.ToString("yyyy-MM-dd")}" + $"&metrics={string.Join(",", initializer.Metrics.Select(x => x.Name).ToArray())}" + $"&dimensions={string.Join(",", initializer.Dimensions.Select(x => x.Name).ToArray())}"; string result = wc.DownloadString(url); ReportRestResponse apiReport = JsonConvert.DeserializeObject <ReportRestResponse>(result); YCustomReport customReport = new YCustomReport(initializer) { Rows = new List <CustomReportRow>() }; foreach (var row in apiReport.Rows) { List <CustomReportCell> reportRowCells = new List <CustomReportCell>(); for (int i = 0; i < apiReport.Request.Dimensions.Length; i++) { reportRowCells.Add(new YCustomDimensionValued(apiReport.Request.Dimensions[i], row.Dimensions[i].Name)); } for (int i = 0; i < apiReport.Request.Metrics.Length; i++) { reportRowCells.Add(new YCustomMetricValued(apiReport.Request.Metrics[i], row.Metrics[i].ToString())); } customReport.Rows.Add(new CustomReportRow(reportRowCells)); } return(customReport); }
public YDCustomReport Get(YDCustomReportInitializer initializer) { try { YCommonCredentialManager cm = new YCommonCredentialManager(); var credentials = cm.Get(new YRestCredentialInitializer(initializer.Config.CredentialsJsonPath)); RestClient rc = new RestClient(); RestRequest rr = new RestRequest(Constants.RestApi5Url, Method.POST); rr.AddHeader("Authorization", $"Bearer {credentials.AccessToken}"); rr.AddHeader("processingMode", "auto"); rr.AddHeader("returnMoneyInMicros", "true"); rr.AddHeader("skipReportHeader", "true"); rr.AddHeader("skipReportSummary", "true"); WebClient wc = new WebClient(); wc.Headers[HttpRequestHeader.Authorization] = $"Bearer {credentials.AccessToken}"; wc.Headers["processingMode"] = "auto"; wc.Headers["returnMoneyInMicros"] = "true"; wc.Headers["skipReportHeader"] = "true"; wc.Headers["skipReportSummary"] = "true"; rest.YDRestApi5ReportRequest apiRequest = new rest.YDRestApi5ReportRequest { Params = new rest.YDRestApi5ReportRequestParams { SelectionCriteria = new rest.YDRestApi5ReportRequestParamsSelectionCriteria { DateFrom = initializer.DateFrom.ToString(Constants.RestApi5DateFormat), DateTo = initializer.DateTo.ToString(Constants.RestApi5DateFormat) }, FieldNames = initializer.Columns.Select(x => x.Value.Name).ToArray(), IncludeVAT = initializer.IncludeVAT, ReportType = initializer.ReportType } }; Console.WriteLine("ReportName: " + apiRequest.Params.ReportName); var body = JsonConvert.SerializeObject(apiRequest); rr.AddParameter("application/json", body, ParameterType.RequestBody); //wc.UploadString(Constants.RestApi5Url, JsonConvert.SerializeObject(apiRequest)); var response = rc.Execute(rr); //Encoding encoding = Encoding.Unicode; string tSvResult = response.Content; // encoding.GetString(response.RawBytes); var report = new YDCustomReport(initializer, false); if (response.StatusCode == HttpStatusCode.OK) { report.IsReady = true; using (TextReader r = new StringReader(tSvResult)) { //r.ReadLine(); // !! skip 1-st row with shit data !! using (CsvReader cr = new CsvReader(r)) { cr.Configuration.Delimiter = "\t"; using (var dr = new CsvDataReader(cr)) { DataTable dt = new DataTable(); dt.Load(dr); DataRow[] tblRows = dt.Rows.Cast <DataRow>().ToArray(); report.Rows = tblRows.Select(x => new CustomReportRow( x.Table.Columns.Cast <DataColumn>().ToDictionary(c => c.ColumnName, c => x[c]).Where(t => initializer.Columns.ContainsKey(t.Key)).Select(y => new CustomReportCell(initializer.Columns[y.Key], y.Value.ToString())).ToArray() ) ).ToArray(); } } } } else if (response.StatusCode == HttpStatusCode.Accepted || response.StatusCode == HttpStatusCode.Created) { report.IsReady = false; } else { throw new Exception(response.Content); } return(report); } catch (WebException ex) { using (StreamReader sr = new StreamReader(ex.Response.GetResponseStream())) { var resp = sr.ReadToEnd(); throw new Exception(resp); } } }