Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        /// <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);
        }
Esempio n. 4
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);
                }
            }
        }