private static async Task <StocksJSON> ProcessResponseAsync(HttpWebResponse response) { string json = ""; using (var streamReader = new StreamReader(response.GetResponseStream())) { json = await streamReader.ReadToEndAsync(); } var jsSerializer = new JavaScriptSerializer(); StocksJSON stocks = null; try { stocks = jsSerializer.Deserialize <StocksJSON>(json); } catch (Exception e) { _logger.Error("Error during serializing JSON data:" + e.Message); stocks = null; throw; } return(stocks); }
public async Task <StocksJSON> GetCurrentStocksAsync() { var request = (HttpWebRequest)WebRequest.Create(_url); request.Method = WebRequestMethods.Http.Get; request.Accept = "application/json"; HttpWebResponse response = await GetResponseAsync(request); StocksJSON stocks = null; if (response != null && response.StatusCode == HttpStatusCode.OK) { stocks = await ProcessResponseAsync(response); } return(stocks); }
/// <summary> /// Save stocks if not exists and creates stock values (if newer) for them. /// </summary> /// <param name="stocks"></param> /// <returns></returns> public bool AddStockWithValues(StocksJSON stocks) { int addedOrUpdatedStocks = 0; foreach (var stock in stocks.Items) { try { int stockId = AddStockIfNotExists(stock.Code, stock.Name); if (AddStockValueIfNewer(stockId, stock.Unit, stock.Price, stocks.PublicationDate)) { addedOrUpdatedStocks++; } } catch (Exception e) { _logger.Error("Exception: " + e.Message); } } return(addedOrUpdatedStocks > 0); }
/// <summary> /// Save stock values for existing stocks if provided stock's publication date is newer. /// </summary> /// <param name="stocks"></param> /// <returns></returns> public bool AddStockValuesForExistingStocksIfNewer(StocksJSON stocks) { if (stocks == null) { throw new ArgumentNullException(); } if (stocks.Items?.Count == 0) { return(false); } // select max publication date for stock values var maxPublicationDate = _db.StockValue .Select(x => x.PublicationDate).Max(); // prepare stock codes var codesList = stocks.Items.Select(x => x.Code).ToList(); // select existing stocks var existingStocks = _db.Stock .AsNoTracking() .Where(x => codesList.Contains(x.Code.ToLower())) .ToList(); // check whether max publication date is older than publication date of fetched data if (DateTime.Compare(maxPublicationDate, stocks.PublicationDate) > -1) // first date is newer than or equal to second date { _logger.Info("Data skipped for publication date: " + stocks.PublicationDate.ToString()); return(false); } // ...there was an update var stockValues = new List <StockValue>(); existingStocks.ForEach(stock => { var price = stocks.Items .Where(x => x.Code.ToLower().Equals(stock.Code.ToLower())) .Select(x => x.Price) .FirstOrDefault(); var unit = stocks.Items .Where(x => x.Code.ToLower().Equals(stock.Code.ToLower())) .Select(x => x.Unit) .FirstOrDefault(); //var stockInfo = $"{stock.ID}, price={price}, unit={unit}"; //_logger.Info(stockInfo); stockValues.Add(new StockValue { StockID = stock.ID, Price = price, Unit = unit, PublicationDate = stocks.PublicationDate }); }); using (var dbContextTransaction = _db.Database.BeginTransaction()) { try { stockValues.ForEach(s => _db.StockValue.Add(s)); int affectedRows = _db.SaveChanges(); dbContextTransaction.Commit(); _logger.Info("Successfully added new stocks values."); return(affectedRows > 0); } catch (Exception e) { _logger.Error("Error during adding stocks values: " + e.Message); _logger.Info("Rollback"); dbContextTransaction.Rollback(); return(false); } } }