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)); } }
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); }