コード例 #1
0
        public async Task <IActionResult> GetData(ExchangeRateFromDatesRequest req)
        {
            _logger.LogInformation("/ExchangeRate/GetFromDates");
            try
            {
                if (req.ApiKey == _cache.Get("ApiKey") as string)
                {
                    var result = await new ExchangeRateFromDatesBL().GetData(req, _cache);

                    return(Ok(JsonConvert.SerializeObject(result)));
                }
                else
                {
                    await Db.Connection.OpenAsync();

                    var query       = new ApiKeysQuery(Db);
                    var queryResult = await query.FindOneByKeyAsync(req.ApiKey);

                    if (queryResult is null)
                    {
                        await Db.Connection.CloseAsync();

                        return(BadRequest("Nieprawidłowy klucz"));
                    }
                    else
                    {
                        var result = await new ExchangeRateFromDatesBL().GetData(req, _cache);
                        await Db.Connection.CloseAsync();

                        return(Ok(JsonConvert.SerializeObject(result)));
                    }
                }
            }
            catch (Exception ex)
            {
                return(NotFound(ex.Message));
            }
        }
コード例 #2
0
        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);
        }