Exemple #1
0
 public async Task Can_add_async()
 {
     IMongoDatabase  database        = MongoForTest.Provider.GetDatabase();
     var             repo            = new ProviderDepositApprovalMongoRepository(database);
     DepositApproval depositApproval = BuildDummyDepositApproval();
     await repo.AddAsync(depositApproval);
 }
Exemple #2
0
        public async Task get_deposit_approvals_should_return_approvals()
        {
            var query    = new GetConsumerDepositApprovals();
            var approval = new DepositApproval(Keccak.Zero, TestItem.KeccakA, "test", "kyc",
                                               TestItem.AddressA, TestItem.AddressB, 1);

            _consumerService.GetDepositApprovalsAsync(query)
            .Returns(PagedResult <DepositApproval> .Create(new[] { approval }, 1, 1, 1, 1));
            var result = await _rpc.ndm_getConsumerDepositApprovals(query);

            await _consumerService.Received().GetDepositApprovalsAsync(query);

            result.Data.Should().NotBeNull();
            result.Data.Items.Should().NotBeNull();
            result.Data.Items.Should().ContainSingle();
            result.Data.Page.Should().Be(1);
            result.Data.Results.Should().Be(1);
            result.Data.TotalPages.Should().Be(1);
            result.Data.TotalResults.Should().Be(1);
            result.Data.IsEmpty.Should().BeFalse();
            var rpcApproval = result.Data.Items.Single();

            rpcApproval.Id.Should().Be(approval.Id);
            rpcApproval.AssetId.Should().Be(approval.AssetId);
            rpcApproval.AssetName.Should().Be(approval.AssetName);
            rpcApproval.Kyc.Should().Be(approval.Kyc);
            rpcApproval.Consumer.Should().Be(approval.Consumer);
            rpcApproval.Provider.Should().Be(approval.Provider);
            rpcApproval.Timestamp.Should().Be(approval.Timestamp);
        }
        private Task AddOrUpdateAsync(DepositApproval depositApproval)
        {
            Serialization.Rlp.Rlp rlp = _rlpDecoder.Encode(depositApproval);
            _database.Set(depositApproval.Id, rlp.Bytes);

            return(Task.CompletedTask);
        }
        private Task AddOrUpdateAsync(DepositApproval depositApproval)
        {
            var rlp = RlpObjectDecoder.Encode(depositApproval);

            _database.Set(depositApproval.Id, rlp.Bytes);

            return(Task.CompletedTask);
        }
Exemple #5
0
        public async Task Update_to_pending_will_be_ignored()
        {
            DepositApproval updateToPending = new DepositApproval(_confirmedApproval.Id, _confirmedApproval.AssetId, _confirmedApproval.AssetName, _confirmedApproval.Kyc, _confirmedApproval.Consumer, _confirmedApproval.Provider, _confirmedApproval.Timestamp, DepositApprovalState.Pending);
            await _service.UpdateAsync(new DepositApproval[] { updateToPending }, _providerAddress);

            var result = await _service.BrowseAsync(new GetConsumerDepositApprovals());

            result.Items.Where(i => i.State == DepositApprovalState.Pending).Should().HaveCount(1);
        }
Exemple #6
0
        public async Task Can_browse()
        {
            IMongoDatabase  database        = MongoForTest.TempDb.GetDatabase();
            var             repo            = new ConsumerDepositApprovalMongoRepository(database);
            DepositApproval depositApproval = BuildDummyDepositApproval();
            await repo.AddAsync(depositApproval);

            await repo.BrowseAsync(new GetConsumerDepositApprovals());
        }
Exemple #7
0
        public async Task Update_unknown_will_be_ignored()
        {
            DepositApproval unknown = new DepositApproval(Keccak.Compute("unknown"), _pendingApproval.AssetId, _pendingApproval.AssetName, _pendingApproval.Kyc, _pendingApproval.Consumer, _pendingApproval.Provider, _pendingApproval.Timestamp, DepositApprovalState.Confirmed);
            await _service.UpdateAsync(new DepositApproval[] { unknown }, _providerAddress);

            var result = await _service.BrowseAsync(new GetConsumerDepositApprovals());

            result.Items.Should().HaveCount(3);
        }
Exemple #8
0
        public async Task Update_to_confirm_will_proceed_without_errors()
        {
            DepositApproval updateToConfirm = new DepositApproval(_pendingApproval.Id, _pendingApproval.AssetId, _pendingApproval.AssetName, _pendingApproval.Kyc, _pendingApproval.Consumer, _pendingApproval.Provider, _pendingApproval.Timestamp, DepositApprovalState.Confirmed);
            await _service.UpdateAsync(new DepositApproval[] { updateToConfirm }, _providerAddress);

            var result = await _service.BrowseAsync(new GetConsumerDepositApprovals());

            result.Items.Where(i => i.State == DepositApprovalState.Confirmed).Should().HaveCount(2);
        }
Exemple #9
0
        public async Task Update_get(DepositApproval approval)
        {
            IDb db = new MemDb();
            ConsumerDepositApprovalRocksRepository repository = new ConsumerDepositApprovalRocksRepository(db, new DepositApprovalDecoder());
            await repository.UpdateAsync(approval);

            DepositApproval retrieved = await repository.GetAsync(approval.Id);

            retrieved.Should().BeEquivalentTo(approval);
        }
Exemple #10
0
 public DepositApprovalForRpc(DepositApproval depositApproval)
 {
     HeaderId   = depositApproval.HeaderId;
     HeaderName = depositApproval.HeaderName;
     Kyc        = depositApproval.Kyc;
     Consumer   = depositApproval.Consumer;
     Provider   = depositApproval.Provider;
     Timestamp  = depositApproval.Timestamp;
     State      = depositApproval.State.ToString().ToLowerInvariant();
 }
Exemple #11
0
        public async Task Can_get_by_id()
        {
            IMongoDatabase  database        = MongoForTest.Provider.GetDatabase();
            var             repo            = new ProviderDepositApprovalMongoRepository(database);
            DepositApproval depositApproval = BuildDummyDepositApproval();
            await repo.AddAsync(depositApproval);

            DepositApproval result = await repo.GetAsync(depositApproval.Id);

            result.Should().BeEquivalentTo(depositApproval);
        }
Exemple #12
0
        private static DepositApproval BuildDummyDepositApproval()
        {
            DepositApproval depositApproval = new DepositApproval(
                TestItem.KeccakB,
                "asset_name",
                "kyc", TestItem.AddressA,
                TestItem.AddressB,
                1,
                DepositApprovalState.Rejected);

            return(depositApproval);
        }
Exemple #13
0
        public async Task Can_browse_with_query_and_pagination()
        {
            IMongoDatabase  database        = MongoForTest.Provider.GetDatabase();
            var             repo            = new ProviderDepositApprovalMongoRepository(database);
            DepositApproval depositApproval = BuildDummyDepositApproval();
            await repo.AddAsync(depositApproval);

            GetProviderDepositApprovals query = new GetProviderDepositApprovals();

            query.Consumer    = depositApproval.Consumer;
            query.OnlyPending = true;
            query.DataAssetId = depositApproval.AssetId;
            query.Page        = 0;
            query.Results     = 10;
            await repo.BrowseAsync(query);
        }
Exemple #14
0
        public void Setup()
        {
            INdmPeer peer = Substitute.For <INdmPeer>();

            peer.ProviderAddress.Returns(_providerAddress);
            _providerId = TestItem.PublicKeyB;
            peer.NodeId.Returns(_providerId);

            DataAssetProvider provider = new DataAssetProvider(_providerAddress, "name");

            DataAsset newPendingAsset = new DataAsset(_newPendingAssetId, "name", "desc", 1, DataAssetUnitType.Unit, 1000, 10000, new DataAssetRules(new DataAssetRule(1), null), provider);
            DataAsset pendingAsset    = new DataAsset(_pendingAssetId, "name", "desc", 1, DataAssetUnitType.Unit, 1000, 10000, new DataAssetRules(new DataAssetRule(1), null), provider);
            DataAsset rejectedAsset   = new DataAsset(_rejectedAssetId, "name", "desc", 1, DataAssetUnitType.Unit, 1000, 10000, new DataAssetRules(new DataAssetRule(1), null), provider);
            DataAsset confirmedAsset  = new DataAsset(_confirmedAssetId, "name", "desc", 1, DataAssetUnitType.Unit, 1000, 10000, new DataAssetRules(new DataAssetRule(1), null), provider);

            DepositsInMemoryDb         db = new DepositsInMemoryDb();
            ProviderInMemoryRepository providerRepository = new ProviderInMemoryRepository(db);

            _cdaRepo     = new ConsumerDepositApprovalInMemoryRepository();
            _ndmNotifier = Substitute.For <INdmNotifier>();
            ConsumerNotifier notifier         = new ConsumerNotifier(_ndmNotifier);
            DataAssetService dataAssetService = new DataAssetService(providerRepository, notifier, LimboLogs.Instance);

            dataAssetService.AddDiscovered(newPendingAsset, peer);
            dataAssetService.AddDiscovered(pendingAsset, peer);
            dataAssetService.AddDiscovered(rejectedAsset, peer);
            dataAssetService.AddDiscovered(confirmedAsset, peer);

            _providerService = new ProviderService(providerRepository, notifier, LimboLogs.Instance);
            _providerService.Add(peer);

            _service = new DepositApprovalService(dataAssetService, _providerService, _cdaRepo, Timestamper.Default, notifier, LimboLogs.Instance);

            _confirmedApproval = new DepositApproval(Keccak.Compute(Rlp.Encode(Rlp.Encode(_confirmedAssetId), Rlp.Encode(_consumerAddress)).Bytes), _confirmedAssetId, "asset", "kyc", _consumerAddress, _providerAddress, 1, DepositApprovalState.Confirmed);
            _pendingApproval   = new DepositApproval(Keccak.Compute(Rlp.Encode(Rlp.Encode(_pendingAssetId), Rlp.Encode(_consumerAddress)).Bytes), _pendingAssetId, "asset", "kyc", _consumerAddress, _providerAddress, 1, DepositApprovalState.Pending);
            _rejectedApproval  = new DepositApproval(Keccak.Compute(Rlp.Encode(Rlp.Encode(_rejectedAssetId), Rlp.Encode(_consumerAddress)).Bytes), _rejectedAssetId, "asset", "kyc", _consumerAddress, _providerAddress, 1, DepositApprovalState.Rejected);

            _cdaRepo.AddAsync(_confirmedApproval);
            _cdaRepo.AddAsync(_pendingApproval);
            _cdaRepo.AddAsync(_rejectedApproval);
        }
        public Task <PagedResult <DepositApproval> > BrowseAsync(GetConsumerDepositApprovals query)
        {
            if (query is null)
            {
                return(Task.FromResult(PagedResult <DepositApproval> .Empty));
            }

            var depositApprovalsBytes = _database.GetAll();

            if (depositApprovalsBytes.Length == 0)
            {
                return(Task.FromResult(PagedResult <DepositApproval> .Empty));
            }

            var depositApprovals = new DepositApproval[depositApprovalsBytes.Length];

            for (var i = 0; i < depositApprovalsBytes.Length; i++)
            {
                depositApprovals[i] = Decode(depositApprovalsBytes[i]);
            }

            var filteredDepositApprovals = depositApprovals.AsEnumerable();

            if (!(query.DataAssetId is null))
            {
                filteredDepositApprovals = filteredDepositApprovals.Where(a => a.AssetId == query.DataAssetId);
            }

            if (!(query.Provider is null))
            {
                filteredDepositApprovals = filteredDepositApprovals.Where(a => a.Provider == query.Provider);
            }

            if (query.OnlyPending)
            {
                filteredDepositApprovals = filteredDepositApprovals.Where(a => a.State == DepositApprovalState.Pending);
            }

            return(Task.FromResult(filteredDepositApprovals.OrderByDescending(a => a.Timestamp).Paginate(query)));
        }
        public Task <PagedResult <DepositApproval> > BrowseAsync(GetConsumerDepositApprovals query)
        {
            if (query == null)
            {
                throw new ArgumentNullException(nameof(query));
            }

            byte[][] depositApprovalsBytes = _database.GetAllValues().ToArray();
            if (depositApprovalsBytes.Length == 0)
            {
                return(Task.FromResult(PagedResult <DepositApproval> .Empty));
            }

            DepositApproval[] depositApprovals = new DepositApproval[depositApprovalsBytes.Length];
            for (int i = 0; i < depositApprovalsBytes.Length; i++)
            {
                depositApprovals[i] = Decode(depositApprovalsBytes[i]);
            }

            IEnumerable <DepositApproval> filteredDepositApprovals = depositApprovals.AsEnumerable();

            if (!(query.DataAssetId is null))
            {
                filteredDepositApprovals = filteredDepositApprovals.Where(a => a.AssetId == query.DataAssetId);
            }

            if (!(query.Provider is null))
            {
                filteredDepositApprovals = filteredDepositApprovals.Where(a => a.Provider == query.Provider);
            }

            if (query.OnlyPending)
            {
                filteredDepositApprovals = filteredDepositApprovals.Where(a => a.State == DepositApprovalState.Pending);
            }

            return(Task.FromResult(filteredDepositApprovals.OrderByDescending(a => a.Timestamp).ToArray().Paginate(query)));
        }
Exemple #17
0
 public Task UpdateAsync(DepositApproval depositApproval)
 => DepositApprovals.ReplaceOneAsync(a => a.Id == depositApproval.Id, depositApproval);
Exemple #18
0
 public Task AddAsync(DepositApproval depositApproval)
 => DepositApprovals.InsertOneAsync(depositApproval);
 public Task UpdateAsync(DepositApproval depositApproval) => AddOrUpdateAsync(depositApproval);
        public async Task <Keccak?> RequestAsync(Keccak assetId, Address consumer, string kyc)
        {
            if (_logger.IsInfo)
            {
                _logger.Info($"Requesting a deposit approval for data asset: '{assetId}', consumer: '{consumer}'...");
            }
            var dataAsset = _dataAssetService.GetDiscovered(assetId);

            if (dataAsset is null)
            {
                if (_logger.IsError)
                {
                    _logger.Error($"Data asset: '{assetId}' was not found.");
                }
                return(null);
            }

            if (string.IsNullOrWhiteSpace(kyc))
            {
                if (_logger.IsError)
                {
                    _logger.Error("KYC cannot be empty.");
                }
                return(null);
            }

            if (kyc.Length > MaxKycChars)
            {
                if (_logger.IsError)
                {
                    _logger.Error($"Invalid KYC (over {MaxKycChars} chars).");
                }
                return(null);
            }

            var providerPeer = _providerService.GetPeer(dataAsset.Provider.Address);

            if (providerPeer is null)
            {
                if (_logger.IsError)
                {
                    _logger.Error($"Provider for address: '{dataAsset.Provider.Address}' was not found.");
                }
                return(null);
            }

            var id       = Keccak.Compute(Rlp.Encode(Rlp.Encode(assetId), Rlp.Encode(consumer)).Bytes);
            var approval = await _depositApprovalRepository.GetAsync(id);

            if (approval is null)
            {
                approval = new DepositApproval(id, assetId, dataAsset.Name, kyc, consumer,
                                               dataAsset.Provider.Address, _timestamper.EpochSeconds, DepositApprovalState.Pending);
                await _depositApprovalRepository.AddAsync(approval);
            }

            providerPeer.SendRequestDepositApproval(assetId, consumer, kyc);
            if (_logger.IsInfo)
            {
                _logger.Info($"Requested a deposit approval for data asset: '{assetId}', consumer: '{consumer}'.");
            }

            return(id);
        }