public async Task <IEnumerable <IExchangeEntity> > GetExchangesAsync(StatsOrderBy orderBy, decimal minEthLiquidityAmount = 0) { var exchanges = (await _exchangeRepository.GetAsync(minEthLiquidityAmount)).ToList(); switch (orderBy) { case StatsOrderBy.Liquidity: return(exchanges); case StatsOrderBy.Volume: var events = (await _exchangeEventsRepository.GetForLastDayAsync()).ToList(); var ethVolumes = new Dictionary <string, decimal>(); foreach (var exchange in exchanges) { ethVolumes[exchange.Id] = 0; } foreach (var groupedAndOrderedEvent in events.OrderBy(e => e.BlockNumber).ThenBy(e => e.LogIndex) .GroupBy(e => e.ExchangeAddress)) { ethVolumes[groupedAndOrderedEvent.Key] = groupedAndOrderedEvent.Sum(e => e.EthAmount); } exchanges.Sort((x, y) => - ethVolumes[x.Id].CompareTo(ethVolumes[y.Id])); return(exchanges); default: throw new ArgumentOutOfRangeException(nameof(orderBy), orderBy, null); } }
public async Task <IActionResult> GetAllDirectoriesAsync( [FromQuery] decimal minEthLiquidity = 0, [FromQuery] StatsOrderBy orderBy = StatsOrderBy.Liquidity ) { var directories = await _statsService.GetExchangesAsync(orderBy, minEthLiquidity); return(Ok(_mapper.Map <List <IExchangeEntity>, DirectoriesDto>(directories.ToList()))); }
public async Task <IActionResult> GetStats([FromQuery] StatsOrderBy orderBy = StatsOrderBy.Liquidity) { var exchanges = await _statsService.GetExchangesAsync(orderBy); return(Ok(_mapper.Map <List <IExchangeEntity>, StatsExchangesDto>(exchanges.ToList()))); }