public async Task <ExchangeRateFromDatesSDMXResponse> checkData(ExchangeRateFromDatesSDMXResponse SDMXResponse, DateTime startDate, DateTime endDate) { ExchangeRateFromDatesSDMXResponse responseToCheck = SDMXResponse; string[] splittedName = responseToCheck.ExchangeRateName.Split("/"); Decimal lastValue = 0; for (DateTime date = startDate; date <= endDate; date = date.AddDays(1)) { if (!responseToCheck.Values.ContainsKey(date)) { if (lastValue == 0) { lastValue = await getValueFromSingularDay(new Tuple <string, string>(splittedName[0], splittedName[1]), Convert.ToDateTime(date).Subtract(TimeSpan.FromDays(1))); } responseToCheck.Values.Add(date, lastValue); } lastValue = responseToCheck.Values[date]; } return(responseToCheck); }
public async Task EmptyDaysFilled() { HttpClient httpClient = new HttpClient(); ExchangeRateFromDatesSDMXResponse SDMXresponse = new ExchangeRateFromDatesSDMXResponse(); Tuple <string, string> currencyPair = new Tuple <string, string>("USD", "EUR"); DateTime startDate = new DateTime(2009, 5, 5); DateTime endDate = new DateTime(2009, 5, 30); string SDMXrequest = SDMXRequestBuilder.buildRequest(currencyPair, startDate, endDate); XmlDocument response = new XmlDocument(); var nsmgr = new XmlNamespaceManager(response.NameTable); nsmgr.AddNamespace("message", "http://www.sdmx.org/resources/sdmxml/schemas/v2_1/message"); nsmgr.AddNamespace("generic", "http://www.sdmx.org/resources/sdmxml/schemas/v2_1/data/generic"); SDMXresponse.ExchangeRateName = "USD/EUR"; var getData = await httpClient.GetAsync(SDMXrequest); var parseDataToString = await getData.Content.ReadAsStringAsync(); if (parseDataToString != string.Empty) { response.LoadXml(parseDataToString); XmlNodeList exchangeRateValues = response.SelectNodes("//message:GenericData/message:DataSet/generic:Series/generic:Obs", nsmgr); foreach (XmlNode element in exchangeRateValues) { XmlNode dateNode = element.ChildNodes[0]; DateTime dateTime = DateTime.Parse(dateNode.Attributes.GetNamedItem("value").Value); XmlNode valueNode = element.ChildNodes[1]; Decimal exchangeValue = 0; SDMXresponse.Values.Add(dateTime, exchangeValue); } } var dataCountBefore = SDMXresponse.Values.Count; SDMXresponse = await erBL.checkData(SDMXresponse, startDate, endDate); Assert.Greater(SDMXresponse.Values.Count, dataCountBefore); }
public async Task <ExchangeRateFromDatesResponse> GetData(ExchangeRateFromDatesRequest req, IMemoryCache cache) { _cache = cache; if (req.EndDate > DateTime.Now) { throw new Exception("Nie można pobrać danych z przyszłości"); } ExchangeRateFromDatesResponse exchangeRateFromDatesResponse = new ExchangeRateFromDatesResponse(); foreach (string key in req.CurrencyCodes.Keys) { ExchangeRateFromDatesSDMXResponse cachedResponse = new ExchangeRateFromDatesSDMXResponse(); if (!_cache.TryGetValue(key + "/" + req.CurrencyCodes[key] + "_" + req.StartDate.ToShortDateString() + "_" + req.EndDate.ToShortDateString(), out cachedResponse)) { ExchangeRateFromDatesSDMXResponse SDMXresponse = new ExchangeRateFromDatesSDMXResponse(); string SDMXrequest = SDMXRequestBuilder.buildRequest(new Tuple <string, string>(key, req.CurrencyCodes[key]), req.StartDate, req.EndDate); XmlDocument response = new XmlDocument(); var nsmgr = new XmlNamespaceManager(response.NameTable); nsmgr.AddNamespace("message", "http://www.sdmx.org/resources/sdmxml/schemas/v2_1/message"); nsmgr.AddNamespace("generic", "http://www.sdmx.org/resources/sdmxml/schemas/v2_1/data/generic"); SDMXresponse.ExchangeRateName = key + "/" + req.CurrencyCodes[key]; var getData = await httpClient.GetAsync(SDMXrequest); if (getData.StatusCode.ToString() != "OK") { SDMXresponse.Status = getData.ReasonPhrase; exchangeRateFromDatesResponse.ExchangeRateValues.Add(SDMXresponse); continue; } var parseDataToString = await getData.Content.ReadAsStringAsync(); if (parseDataToString != string.Empty) { response.LoadXml(parseDataToString); XmlNodeList exchangeRateValues = response.SelectNodes("//message:GenericData/message:DataSet/generic:Series/generic:Obs", nsmgr); decimal lastValue = 0; foreach (XmlNode element in exchangeRateValues) { XmlNode dateNode = element.ChildNodes[0]; DateTime dateTime = DateTime.Parse(dateNode.Attributes.GetNamedItem("value").Value); XmlNode valueNode = element.ChildNodes[1]; Decimal exchangeValue = 0; try { exchangeValue = Decimal.Parse(valueNode.Attributes.GetNamedItem("value").Value, CultureInfo.InvariantCulture); } catch (FormatException ex) { if (lastValue == 0) { exchangeValue = await getValueFromSingularDay(new Tuple <string, string>(key, req.CurrencyCodes[key]), Convert.ToDateTime(dateTime).Subtract(TimeSpan.FromDays(1))); } else { exchangeValue = lastValue; } } lastValue = exchangeValue; SDMXresponse.Values.Add(dateTime, exchangeValue); } } SDMXresponse = await checkData(SDMXresponse, req.StartDate, req.EndDate); exchangeRateFromDatesResponse.ExchangeRateValues.Add(SDMXresponse); if (req.cache) { MemoryCacheEntryOptions cacheExpirationOptions = new MemoryCacheEntryOptions(); cacheExpirationOptions.AbsoluteExpiration = DateTime.Now.AddMinutes(30); cacheExpirationOptions.Priority = CacheItemPriority.High; _cache.Set(SDMXresponse.ExchangeRateName + "_" + req.StartDate.ToShortDateString() + "_" + req.EndDate.ToShortDateString(), SDMXresponse, cacheExpirationOptions); } } else { exchangeRateFromDatesResponse.ExchangeRateValues.Add(cachedResponse); } } return(exchangeRateFromDatesResponse); }