static void Main(string[] args)
        {
            var factory = new ConnectionFactory()
            {
                HostName = "localhost"
            };

            using (var connection = factory.CreateConnection())
                using (var channel = connection.CreateModel())
                {
                    channel.QueueDeclare(queue: "CurrencyRates",
                                         durable: false,
                                         exclusive: false,
                                         autoDelete: false,
                                         arguments: null);

                    var consumer = new EventingBasicConsumer(channel);
                    consumer.Received += (model, ea) =>
                    {
                        var body    = ea.Body;
                        var message = Encoding.UTF8.GetString(body);
                        if (!String.IsNullOrEmpty(message))
                        {
                            using (var context = new CryptoCurrencyTrackerContext())
                            {
                                RatesInfo messageInfo = JsonConvert.DeserializeObject <RatesInfo>(message);
                                RatesInfo rate        = context.Rates.Where(x => x.ApiId == messageInfo.ApiId && x.CurrencyId == messageInfo.CurrencyId).FirstOrDefault();
                                try
                                {
                                    if (rate != null && rate.ID > 0)
                                    {
                                        rate.RateTime = messageInfo.RateTime;
                                        rate.Price    = messageInfo.Price;
                                        context.Rates.Update(rate);
                                    }
                                    else
                                    {
                                        context.Rates.Add(messageInfo);
                                    }
                                    context.SaveChanges();
                                }
                                catch (Exception e)
                                {
                                    //TO DO Add logging here
                                }
                            }
                        }
                    };
                    while (true)
                    {
                        channel.BasicConsume(queue: "CurrencyRates",
                                             autoAck: true,
                                             consumer: consumer);
                        Thread.Sleep(100);
                    }
                }
        }
        // TO DO:
        // ADD Logging
        // Not use While True
        // Add Configs
        // Add Comments
        // Research on optimazing
        static void Main(string[] args)
        {
            List <ApiInfo> apis = new List <ApiInfo>();
            List <ExchangeCurrencyInfo> currency = new List <ExchangeCurrencyInfo>();

            using (var context = new CryptoCurrencyTrackerContext())
            {
                apis     = context.API.ToList();
                currency = context.Currency.ToList();
            }
            Tracker tracker = new Tracker(apis, currency);

            tracker.Start();
        }
        public JsonResult LoadData(DataTableRequest request)
        {
            try
            {
                var context      = new CryptoCurrencyTrackerContext();
                int pageSize     = request.length;
                int skip         = request.start;
                int recordsTotal = 0;

                var ratesData = context.Rates.Include(x => x.API).Include(m => m.Currency).ToList <RatesInfo>();

                recordsTotal = ratesData.Count();
                var data = ratesData.Skip(skip).Take(pageSize).ToList();
                return(Json(new RatesDataTableModel {
                    draw = request.draw, recordsFiltered = recordsTotal, recordsTotal = recordsTotal, data = data
                }));
            }
            catch (Exception)
            {
                throw;
            }
        }