Пример #1
0
        private async Task <List <EarningsAnnouncement> > FillLocalRequest(EarningsAnnouncementRequest request)
        {
            using (var context = new MyDBContext())
            {
                var queryableData = context.EarningsAnnouncements
                                    .Where(x =>
                                           x.Date >= request.FromDate &&
                                           x.Date <= request.ToDate);//TODO wew want end of day as cutoff

                if (request.Symbol != null && request.Symbol.Count > 0)
                {
                    queryableData = queryableData.BuildContainsExpression(request.Symbol, x => x.Symbol);
                }

                try
                {
                    var result = await queryableData.ToListAsync().ConfigureAwait(false);

                    _logger.Info($"EAB returning {result.Count} items from the local db");
                    return(result);
                }
                catch (Exception ex)
                {
                    _logger.Error(ex, "EAB: error when querying database - " + ex.Message);
                    return(new List <EarningsAnnouncement>());
                }
            }
        }
Пример #2
0
 /// <summary>
 /// Returns the appropriate external datasource for the give request
 /// </summary>
 /// <param name="request"></param>
 /// <returns></returns>
 private IEarningsAnnouncementSource GetClient(EarningsAnnouncementRequest request)
 {
     if (!string.IsNullOrEmpty(request.DataSource))
     {
         return(DataSources.ContainsKey(request.DataSource) ? DataSources[request.DataSource] : null);
     }
     else
     {
         return(DataSources[_defaultDataSource]);
     }
 }
Пример #3
0
        public async Task <List <EarningsAnnouncement> > Request(EarningsAnnouncementRequest request)
        {
            _logger.Info($"EAB: filling request from {request.FromDate:yyyyMMdd} to {request.ToDate:yyyyMMdd} {string.Join(", ", request.Symbol)} from {request.DataSource ?? "default"} ({request.DataLocation})");

            if (request.DataLocation == DataLocation.LocalOnly)
            {
                return(await FillLocalRequest(request).ConfigureAwait(false));
            }

            //What if it's DataLocation.Both? Doesn't really make sense to grab half and half
            //old data is updated with the "actual" value of the release, so we just re-grab everything externally

            //get data externally
            return(await FillExternalRequest(request).ConfigureAwait(false));
        }
Пример #4
0
        private async Task <List <EarningsAnnouncement> > FillExternalRequest(EarningsAnnouncementRequest request)
        {
            var client = GetClient(request);

            if (client == null)
            {
                _logger.Error($"EAB: Could not find specified data source {request.DataSource}");
                RaiseEvent(Error, this, new ErrorArgs(-1, $"EAB: Could not find specified data source {request.DataSource}"));
                throw new Exception("Could not find specified data source {request.DataSource}");
            }

            var data = await client.RequestData(request).ConfigureAwait(false);

            //save the data we got
            try
            {
                using (var context = new MyDBContext())
                {
                    var dbSet = context.Set <EarningsAnnouncement>();
                    foreach (var ea in data)
                    {
                        //the data we get might be a duplicate and we want the latest values of everything, so we can't just insert
                        dbSet.AddOrUpdate(x => new { x.Date, x.Symbol }, ea);
                    }
                    context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                _logger.Error(ex, "EAB: Could not save data");
            }

            _logger.Info($"EAB returning {data?.Count} items from {client.Name}");

            return(data);
        }
Пример #5
0
 /// <summary>
 /// Get earnings announcements
 /// </summary>
 public async Task <ApiResponse <List <EarningsAnnouncement> > > GetEarningsAnnouncements(EarningsAnnouncementRequest req) =>
 await _apiClient.GetAsync <List <EarningsAnnouncement> >("/earningsannouncements", req).ConfigureAwait(false);