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);
        }
Exemple #2
0
        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);
        }