static void TestDividendRequest() { var dividendRequest = new DividendRequest("AAPL", Range.OneYear); var response = dividendRequest.SendRequestAsync().GetAwaiter().GetResult(); Console.WriteLine("Dividend for the past year: {0}", response.Sum(a => a.amount)); }
private async Task <List <Dividend> > FillLocalRequest(DividendRequest request) { using (var context = new MyDBContext()) { var queryableData = context.Dividends .Where(x => x.ExDate >= request.FromDate && x.ExDate <= request.ToDate); 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($"DivB returning {result.Count} items from the local db"); return(result); } catch (Exception ex) { _logger.Error(ex, "DivB: error when querying database - " + ex.Message); return(new List <Dividend>()); } } }
/// <summary> /// Returns the appropriate external datasource for the give request /// </summary> /// <param name="request"></param> /// <returns></returns> private IDividendDataSource GetClient(DividendRequest request) { if (!string.IsNullOrEmpty(request.DataSource)) { return(DataSources.ContainsKey(request.DataSource) ? DataSources[request.DataSource] : null); } else { return(DataSources[_defaultDataSource]); } }
public async Task <List <Dividend> > RequestDividends(DividendRequest request) { _logger.Info($"DivB: filling request from {request.FromDate:yyyyMMdd} to {request.ToDate:yyyyMMdd} {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 <Dividend> > FillExternalRequest(DividendRequest request) { var client = GetClient(request); if (client == null) { _logger.Error($"DivB: Could not find specified data source {request.DataSource}"); RaiseEvent(Error, this, new ErrorArgs(-1, $"DivB: 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 <Dividend>(); foreach (var dividend 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.ExDate, x.Symbol }, dividend); } context.SaveChanges(); } } catch (Exception ex) { _logger.Error(ex, "DivB: Could not save data"); } _logger.Info($"DivB returning {data?.Count} items from {client.Name}"); return(data); }
/// <summary> /// Get dividends /// </summary> public async Task <ApiResponse <List <Dividend> > > GetDividends(DividendRequest req) => await _apiClient.GetAsync <List <Dividend> >("/dividends", req).ConfigureAwait(false);