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>()); } } }
/// <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]); } }
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)); }
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); }
/// <summary> /// Get earnings announcements /// </summary> public async Task <ApiResponse <List <EarningsAnnouncement> > > GetEarningsAnnouncements(EarningsAnnouncementRequest req) => await _apiClient.GetAsync <List <EarningsAnnouncement> >("/earningsannouncements", req).ConfigureAwait(false);