public Task <TransfersGetResponse> Get(TransfersGetRequest request)
 {
     return(this.m_TransactionsManager.GetTransfersAsync(request));
 }
Exemplo n.º 2
0
        public async Task <TransfersGetResponse> GetTransfersAsync(
            TransfersGetRequest request)
        {
            int?limit = request.Limit;

            if (!limit.HasValue)
            {
                request.Limit = new int?(10);
            }
            else
            {
                limit = request.Limit;
                if (limit.Value > 1000)
                {
                    request.Limit = new int?(1000);
                }
            }
            Dictionary <string, string> andSource = new Dictionary <string, string>();
            Dictionary <string, string> orSource  = new Dictionary <string, string>();

            andSource.Add("status", "executed");

            if (!string.IsNullOrEmpty(request.Contract))
            {
                andSource.Add("account", request.Contract);
            }

            if (!string.IsNullOrEmpty(request.Action))
            {
                andSource.Add("name", request.Action);
            }

            if (!string.IsNullOrEmpty(request.Owner))
            {
                switch (request.Type)
                {
                case TransferType.All:
                    orSource.Add("data.from", request.Owner);
                    orSource.Add("data.to", request.Owner);
                    break;

                case TransferType.Send:
                    andSource.Add("data.from", request.Owner);
                    break;

                case TransferType.Receive:
                    andSource.Add("data.to", request.Owner);
                    break;

                default:
                    break;
                }
            }

            if (!string.IsNullOrEmpty(request.TrxId))
            {
                andSource.Add("trx_id", request.TrxId);
            }

            IMongoCollection <TrxAction>        collection    = this.m_MongoDatabase.GetCollection <TrxAction>(this.m_TransferCollectionName, (MongoCollectionSettings)null);
            FilterDefinitionBuilder <TrxAction> builderFilter = Builders <TrxAction> .Filter;
            List <TrxAction> actions;
            long             total;

            if (andSource.Count == 0 && orSource.Count == 0)
            {
                actions = await collection.Find <TrxAction>(builderFilter.Empty, (FindOptions)null).Sort(Builders <TrxAction> .Sort.Descending((FieldDefinition <TrxAction>) "_id")).Skip(request.Skip).Limit(request.Limit).ToListAsync <TrxAction>(new CancellationToken());

                total = await collection.CountDocumentsAsync(builderFilter.Empty, (CountOptions)null, new CancellationToken());
            }
            else
            {
                FilterDefinition <TrxAction> allFilters = null;

                if (andSource.Count > 0 && orSource.Count > 0)
                {
                    FilterDefinition <TrxAction> orFilters  = builderFilter.Or(orSource.Select(f => builderFilter.Eq <string>(f.Key, f.Value)));
                    FilterDefinition <TrxAction> andFilters = builderFilter.And(andSource.Select(f => builderFilter.Eq <string>(f.Key, f.Value)));
                    allFilters = builderFilter.And(new[] { andFilters, orFilters });
                }
                else if (andSource.Count > 0)
                {
                    allFilters = builderFilter.And(andSource.Select(f => builderFilter.Eq <string>(f.Key, f.Value)));
                }
                else
                {
                    allFilters = builderFilter.Or(orSource.Select(f => builderFilter.Eq <string>(f.Key, f.Value)));
                }

                actions = await collection.Find <TrxAction>(allFilters, (FindOptions)null).Sort(Builders <TrxAction> .Sort.Descending((FieldDefinition <TrxAction>) "block_num")).Skip(request.Skip).Limit(request.Limit).ToListAsync <TrxAction>(new CancellationToken());

                total = await collection.CountDocumentsAsync(allFilters, (CountOptions)null, new CancellationToken());
            }
            long irreversibleBlockNumAsync = await this.m_ABIService.GetLastIrreversibleBlockNumAsync();

            return(new TransfersGetResponse()
            {
                Actions = (IEnumerable <TrxAction>)actions,
                Total = total,
                LastIrreversibleBlock = irreversibleBlockNumAsync
            });
        }