public CashoutRiskControlAggregate ToDomain()
 {
     return(CashoutRiskControlAggregate.Restore(
                ETag,
                State,
                Result,
                CreationMoment,
                StartMoment,
                OperationAcceptanceMoment,
                OperationRejectionMoment,
                OperationId,
                ClientId,
                AssetId,
                BlockchainType,
                BlockchainAssetId,
                HotWalletAddress,
                ToAddress,
                Amount,
                Error));
 }
        public async Task Handle(ValidationStartedEvent evt, ICommandSender sender)
        {
            var aggregate = await _riskControlRepository.GetOrAddAsync(
                evt.OperationId,
                () => CashoutRiskControlAggregate.Create(
                    evt.OperationId,
                    evt.ClientId,
                    evt.AssetId,
                    evt.BlockchainType,
                    evt.BlockchainAssetId,
                    evt.HotWalletAddress,
                    evt.ToAddress,
                    evt.Amount));

            _chaosKitty.Meow(evt.OperationId);

            if (aggregate.Start())
            {
                sender.SendCommand
                (
                    new ValidateOperationCommand
                {
                    OperationId       = evt.OperationId,
                    UserId            = evt.ClientId,
                    Type              = OperationType.Withdrawal,
                    BlockchainAssetId = evt.BlockchainAssetId,
                    BlockchainType    = evt.BlockchainType,
                    FromAddress       = evt.HotWalletAddress,
                    ToAddress         = evt.ToAddress,
                    Amount            = evt.Amount
                },
                    BlockchainRiskControlBoundedContext.Name
                );

                _chaosKitty.Meow(evt.OperationId);

                await _riskControlRepository.SaveAsync(aggregate);

                _chaosKitty.Meow(evt.OperationId);
            }
        }
 public static CashoutRiskControlEntity FromDomain(CashoutRiskControlAggregate aggregate)
 {
     return(new CashoutRiskControlEntity
     {
         ETag = string.IsNullOrEmpty(aggregate.Version) ? "*" : aggregate.Version,
         PartitionKey = GetPartitionKey(aggregate.OperationId),
         RowKey = GetRowKey(),
         State = aggregate.State,
         Result = aggregate.Result,
         CreationMoment = aggregate.CreationMoment,
         StartMoment = aggregate.StartMoment,
         OperationAcceptanceMoment = aggregate.OperationAcceptanceMoment,
         OperationRejectionMoment = aggregate.OperationRejectionMoment,
         OperationId = aggregate.OperationId,
         ClientId = aggregate.ClientId,
         AssetId = aggregate.AssetId,
         BlockchainType = aggregate.BlockchainType,
         BlockchainAssetId = aggregate.BlockchainAssetId,
         HotWalletAddress = aggregate.HotWalletAddress,
         ToAddress = aggregate.ToAddress,
         Amount = aggregate.Amount,
         Error = aggregate.Error
     });
 }
예제 #4
0
        public RiskControlSagaTests()
        {
            _logFactory          = LogFactory.Create().AddUnbufferedConsole();
            _chaosKittyMock      = new Mock <IChaosKitty>();
            _eventsPublisherMock = new Mock <IEventPublisher>();
            _commandSender       = new Mock <ICommandSender>();
            _cashoutRiskControlRepositoryMock = new Mock <ICashoutRiskControlRepository>();
            _batchRepositoryMock = new Mock <ICashoutsBatchRepository>();
            _closedBatchedCashoutsRepositoryMock = new Mock <IClosedBatchedCashoutRepository>();
            _activeCashoutsBatchIdRepositoryMock = new Mock <IActiveCashoutsBatchIdRepository>();
            _assetsServiceMock = new Mock <IAssetsServiceWithCache>();
            _walletsClientMock = new Mock <IBlockchainWalletsClient>();
            _cqrsSettings      = new CqrsSettings
            {
                RabbitConnectionString = "fake-connection-string",
                RetryDelay             = TimeSpan.FromSeconds(30)
            };
            _blockchainConfigurationProvider = new BlockchainConfigurationsProvider
                                               (
                _logFactory,
                new Dictionary <string, BlockchainConfiguration>
            {
                { "Bitcoin", new BlockchainConfiguration("HotWallet", false, null) }
            }
                                               );

            _asset = new Asset
            {
                Id = "LykkeBTC",
                BlockchainIntegrationLayerId      = "Bitcoin",
                BlockchainIntegrationLayerAssetId = "BTC"
            };

            _aggregate = null;

            _cashoutRiskControlRepositoryMock
            .Setup(x => x.GetOrAddAsync(
                       It.IsAny <Guid>(),
                       It.IsAny <Func <CashoutRiskControlAggregate> >()))
            .ReturnsAsync((Guid opId, Func <CashoutRiskControlAggregate> factory) => _aggregate ?? (_aggregate = factory()));

            _cashoutRiskControlRepositoryMock
            .Setup(x => x.SaveAsync(It.IsAny <CashoutRiskControlAggregate>()))
            .Callback((CashoutRiskControlAggregate agg) => _aggregate = agg)
            .Returns(Task.CompletedTask);

            _cashoutRiskControlRepositoryMock
            .Setup(x => x.TryGetAsync(It.IsAny <Guid>()))
            .ReturnsAsync((Guid opId) => opId == _aggregate?.OperationId ? _aggregate : null);

            _assetsServiceMock
            .Setup(x => x.TryGetAssetAsync(
                       It.Is <string>(p => p == "LykkeBTC"),
                       It.IsAny <CancellationToken>()))
            .ReturnsAsync(() => _asset);

            _walletsClientMock
            .Setup(x => x.TryGetClientIdAsync(
                       It.Is <string>(p => p == "Bitcoin"),
                       It.IsAny <string>()))
            .ReturnsAsync((Guid?)null);

            _startCashoutCommandsHandler = new StartCashoutCommandsHandler(_logFactory, _blockchainConfigurationProvider, _assetsServiceMock.Object, new Mock <IHttpClientFactory>().Object);

            _notifyCashoutFailedCommandsHandler = new NotifyCashoutFailedCommandsHandler();

            _acceptCashoutCommandsHandler = new AcceptCashoutCommandsHandler(
                _chaosKittyMock.Object,
                _batchRepositoryMock.Object,
                _closedBatchedCashoutsRepositoryMock.Object,
                _activeCashoutsBatchIdRepositoryMock.Object,
                _blockchainConfigurationProvider,
                _walletsClientMock.Object,
                _cqrsSettings,
                false);

            _saga = new RiskControlSaga(_chaosKittyMock.Object, _cashoutRiskControlRepositoryMock.Object);

            _eventsPublisherMock.Setup(x => x.PublishEvent(It.IsAny <ValidationStartedEvent>()))
            .Callback((object evt) => _saga.Handle((ValidationStartedEvent)evt, _commandSender.Object));

            _eventsPublisherMock.Setup(x => x.PublishEvent(It.IsAny <OperationAcceptedEvent>()))
            .Callback((object evt) => _saga.Handle((OperationAcceptedEvent)evt, _commandSender.Object));

            _eventsPublisherMock.Setup(x => x.PublishEvent(It.IsAny <OperationRejectedEvent>()))
            .Callback((object evt) => _saga.Handle((OperationRejectedEvent)evt, _commandSender.Object));

            _commandSender
            .Setup(x => x.SendCommand(
                       It.IsAny <AcceptCashoutCommand>(),
                       It.Is <string>(v => v == BlockchainCashoutProcessorBoundedContext.Name),
                       It.IsAny <uint>()))
            .Callback((AcceptCashoutCommand cmd, string bc, uint _) => _acceptCashoutCommandsHandler.Handle(cmd, _eventsPublisherMock.Object));

            _commandSender
            .Setup(x => x.SendCommand(
                       It.IsAny <NotifyCashoutFailedCommand>(),
                       It.Is <string>(v => v == BlockchainCashoutProcessorBoundedContext.Name),
                       It.IsAny <uint>()))
            .Callback((NotifyCashoutFailedCommand cmd, string bc, uint _) => _notifyCashoutFailedCommandsHandler.Handle(cmd, _eventsPublisherMock.Object));
        }
        public async Task SaveAsync(CashoutRiskControlAggregate aggregate)
        {
            var entity = CashoutRiskControlEntity.FromDomain(aggregate);

            await _storage.ReplaceAsync(entity);
        }