コード例 #1
0
        public async Task Process(HashEvent ev)
        {
            var tx = await _bitcoinTransactionRepository.FindByTransactionIdAsync(ev.Id);

            if (tx == null)
            {
                return;
            }

            string hash = ev.Hash;

            switch (tx.CommandType)
            {
            case BitCoinCommands.CashOut:
                var cashOutContext = await _transactionService.GetTransactionContext <CashOutContextData>(tx.TransactionId);

                var clientAcc = await _сlientAccountClient.GetByIdAsync(cashOutContext.ClientId);

                var clientEmail = await _personalDataService.GetEmailAsync(cashOutContext.ClientId);

                await _cashOperationsRepositoryClient.UpdateBlockchainHashAsync(cashOutContext.ClientId, cashOutContext.CashOperationId, hash);

                await _srvEmailsFacade.SendNoRefundOCashOutMail(clientAcc.PartnerId, clientEmail, cashOutContext.Amount, cashOutContext.AssetId, hash);

                break;
            }
        }
        public async Task <CommandHandlingResult> Handle(Commands.SaveTransferOperationStateCommand command, IEventPublisher eventPublisher)
        {
            var message       = command.QueueMessage;
            var transactionId = message.Id;

            var transaction = await _transactionsRepository.FindByTransactionIdAsync(transactionId);

            if (transaction == null)
            {
                _log.Error(nameof(Commands.SaveManualOperationStateCommand), new Exception($"unknown transaction {transactionId}"), context: command);
                return(CommandHandlingResult.Ok());
            }

            var amountNoFee = await _feeCalculationService.GetAmountNoFeeAsync(message);

            var context = await _transactionService.GetTransactionContext <TransferContextData>(transactionId) ??
                          TransferContextData.Create(
                message.FromClientId,
                new TransferContextData.TransferModel
            {
                ClientId = message.ToClientid
            },
                new TransferContextData.TransferModel
            {
                ClientId = message.FromClientId
            });

            context.Transfers[0].OperationId = Guid.NewGuid().ToString();
            context.Transfers[1].OperationId = Guid.NewGuid().ToString();

            var destWallet = await _walletCredentialsRepository.GetAsync(message.ToClientid);

            var sourceWallet = await _walletCredentialsRepository.GetAsync(message.FromClientId);

            var contextJson = context.ToJson();
            var cmd         = new TransferCommand
            {
                Amount             = amountNoFee,
                AssetId            = message.AssetId,
                Context            = contextJson,
                SourceAddress      = sourceWallet?.MultiSig,
                DestinationAddress = destWallet?.MultiSig,
                TransactionId      = Guid.Parse(transactionId)
            };

            await SaveState(cmd, context);

            eventPublisher.PublishEvent(new TransferOperationStateSavedEvent {
                TransactionId = transactionId, QueueMessage = message, AmountNoFee = (double)amountNoFee
            });

            return(CommandHandlingResult.Ok());
        }
コード例 #3
0
        public async Task <T> GetTransactionContext <T>(string transactionId) where T : BaseContextData
        {
            var fromBlob = await _contextBlobStorage.Get(transactionId);

            if (string.IsNullOrWhiteSpace(fromBlob))
            {
                var transaction = await _transactionsRepository.FindByTransactionIdAsync(transactionId);

                fromBlob = transaction?.ContextData;
            }

            if (fromBlob == null)
            {
                return(default(T));
            }

            return(Newtonsoft.Json.JsonConvert.DeserializeObject <T>(fromBlob));
        }
        public async Task ProcessMessage(CashInOutQueueMessage message)
        {
            _log.Info(message: "Processing message", message.ToJson());

            ChaosKitty.Meow();

            var transaction = await _transactionsRepository.FindByTransactionIdAsync(message.Id);

            if (transaction == null)
            {
                if (_cashOperationsRepositoryClient.GetAsync(message.ClientId, message.Id) == null)
                {
                    _log.Warning($"{nameof(CashInOutQueue)}:{nameof(CashInOutQueueMessage)}", "unknown transaction", context: message.ToJson());
                    return;
                }

                await ProcessExternalCashin(message);
            }
            else
            {
                switch (transaction.CommandType)
                {
                case BitCoinCommands.CashIn:
                case BitCoinCommands.Issue:
                    await ProcessIssue(message);

                    break;

                case BitCoinCommands.CashOut:
                    await ProcessCashOut(message);

                    break;

                case BitCoinCommands.ManualUpdate:
                    ProcessManualUpdate(message);
                    break;

                default:
                    _log.Warning($"{nameof(CashInOutQueue)}:{nameof(CashInOutQueueMessage)}", $"Unknown command type (value = [{transaction.CommandType}])", context: message.ToJson());
                    break;
                }
            }
        }