private Task ProcessMessageAsync(CashTransferEvent message)
        {
            var fees   = message.CashTransfer.Fees;
            var fee    = fees?.FirstOrDefault()?.Transfer;
            var @event = new CashTransferProcessedEvent
            {
                OperationId       = Guid.Parse(message.Header.RequestId),
                RequestId         = Guid.Parse(message.Header.MessageId),
                FromWalletId      = Guid.Parse(message.CashTransfer.FromWalletId),
                ToWalletId        = Guid.Parse(message.CashTransfer.ToWalletId),
                Volume            = decimal.Parse(message.CashTransfer.Volume),
                AssetId           = message.CashTransfer.AssetId,
                Timestamp         = message.Header.Timestamp,
                FeeSourceWalletId = fee != null?Guid.Parse(fee.SourceWalletId) : (Guid?)null,
                                        FeeSize = ParseNullabe(fee?.Volume)
            };

            _cqrsEngine.PublishEvent(@event, BoundedContext.Name);

            if (fees != null)
            {
                var feeEvent = new FeeChargedEvent
                {
                    OperationId   = message.Header.MessageId,
                    OperationType = FeeOperationType.Transfer,
                    Fee           = fees.Where(x => x.Transfer != null).Select(x => x.Transfer).ToJson()
                };
                _cqrsEngine.PublishEvent(feeEvent, BoundedContext.Name);
            }

            return(Task.CompletedTask);
        }
示例#2
0
 private TransferQueueMessage ToOldModel(CashTransferEvent transferEvent)
 {
     return(new TransferQueueMessage
     {
         Id = transferEvent.Header.MessageId,
         AssetId = transferEvent.CashTransfer.AssetId,
         Date = transferEvent.Header.Timestamp,
         FromClientId = transferEvent.CashTransfer.FromWalletId,
         ToClientid = transferEvent.CashTransfer.ToWalletId,
         Amount = transferEvent.CashTransfer.Volume,
         Fees = transferEvent.CashTransfer.Fees?.ToOldFees(transferEvent.Header.Timestamp),
     });
 }
示例#3
0
        private Task ProcessMessage(CashTransferEvent transfer)
        {
            var cashTransfer = ToOldModel(transfer);

            _cqrsEngine.SendCommand(
                new Commands.SaveTransferOperationStateCommand {
                QueueMessage = cashTransfer
            },
                BoundedContexts.TxHandler,
                BoundedContexts.Operations);

            return(Task.CompletedTask);
        }
        private async Task ProcessMessageAsync(CashTransferEvent message)
        {
            var fees              = message.CashTransfer.Fees;
            var fee               = fees?.FirstOrDefault()?.Transfer;
            var operationId       = Guid.Parse(message.Header.RequestId);
            var fromWallet        = Guid.Parse(message.CashTransfer.FromWalletId);
            var toWallet          = Guid.Parse(message.CashTransfer.ToWalletId);
            var volume            = decimal.Parse(message.CashTransfer.Volume);
            var timestamp         = message.Header.Timestamp;
            var assetId           = message.CashTransfer.AssetId;
            var feeSourceWalletId = fee != null?Guid.Parse(fee.SourceWalletId) : (Guid?)null;

            var feeSize = ParseNullabe(fee?.Volume);

            var cashInOuts = new BaseHistoryRecord[] {
                new Cashout()
                {
                    Id        = operationId,
                    WalletId  = fromWallet,
                    Volume    = -Math.Abs(volume),
                    Timestamp = timestamp,
                    AssetId   = assetId,
                    FeeSize   = fromWallet == feeSourceWalletId ? feeSize : null,
                    State     = Antares.Service.History.Core.Domain.Enums.HistoryState.Finished
                },
                new Cashin()
                {
                    Id        = operationId,
                    WalletId  = toWallet,
                    Volume    = Math.Abs(volume),
                    Timestamp = timestamp,
                    AssetId   = assetId,
                    FeeSize   = toWallet == feeSourceWalletId ? feeSize : null,
                    State     = Antares.Service.History.Core.Domain.Enums.HistoryState.Finished
                }
            };

            foreach (var cashInOut in cashInOuts)
            {
                if (!await _historyRecordsRepository.TryInsertAsync(cashInOut))
                {
                    _log.Warning($"Skipped duplicated transfer record", context: new
                    {
                        id = operationId
                    });
                }
            }
        }
        private async Task ProcessMessageAsync(CashTransferEvent item)
        {
            if (!_depositCurrencies.Contains(item.CashTransfer.AssetId, StringComparer.InvariantCultureIgnoreCase))
            {
                return;
            }

            var transfer = item.CashTransfer;

            if (await IsTransferBetweenClientWalletsAsync(transfer.FromWalletId, transfer.ToWalletId))
            {
                _log.Info("Skip transfer between client wallets", context: item.ToJson());
                return;
            }

            double volume = Convert.ToDouble(transfer.Volume);

            (double convertedVolume, string assetId) = await _currencyConverter.ConvertAsync(transfer.AssetId, volume);

            if (convertedVolume == 0)
            {
                return;
            }

            string operationType = GetOperationType(item.CashTransfer);

            _cqrsEngine.PublishEvent(new ClientDepositedEvent
            {
                ClientId      = transfer.ToWalletId,
                FromClientId  = transfer.FromWalletId,
                OperationId   = item.Header.MessageId ?? item.Header.RequestId,
                Asset         = transfer.AssetId,
                Amount        = volume,
                BaseAsset     = assetId,
                BaseVolume    = convertedVolume,
                OperationType = operationType,
                Timestamp     = item.Header.Timestamp
            }, TierBoundedContext.Name);
        }
示例#6
0
 private Task ProcessMessageAsync(CashTransferEvent message)
 {
     UpdateBalances(message.Header, message.BalanceUpdates);
     return(Task.CompletedTask);
 }
示例#7
0
        private async Task ProcessMessageAsync(CashTransferEvent item)
        {
            var id = item.Header.MessageId ?? item.Header.RequestId;

            try
            {
                IPaymentTransaction paymentTransaction = null;

                for (int i = 0; i < 3; i++)
                {
                    paymentTransaction = await _paymentTransactionsRepository.GetByIdForClientAsync(id, item.CashTransfer.ToWalletId);

                    if (paymentTransaction != null)
                    {
                        break;
                    }
                    await Task.Delay(2000 *(i + 1));
                }

                double volume = double.Parse(item.CashTransfer.Volume);

                if (item.CashTransfer.Fees != null)
                {
                    foreach (var fee in item.CashTransfer.Fees)
                    {
                        if (string.IsNullOrWhiteSpace(fee.Transfer?.Volume))
                        {
                            continue;
                        }

                        volume -= double.Parse(fee.Transfer.Volume);
                    }
                }

                if (paymentTransaction == null || paymentTransaction.PaymentSystem != CashInPaymentSystem.Swift)
                {
                    var cashOp = new CashOperation
                    {
                        Id       = id,
                        ClientId = item.CashTransfer.ToWalletId,
                        Asset    = item.CashTransfer.AssetId,
                        Volume   = volume,
                        DateTime = item.Header.Timestamp,
                    };

                    await _cashOperationsCollector.AddDataItemAsync(cashOp);
                }
                else
                {
                    var transfer = new CashTransferOperation
                    {
                        Id           = id,
                        FromClientId = item.CashTransfer.FromWalletId,
                        ToClientId   = item.CashTransfer.ToWalletId,
                        Asset        = item.CashTransfer.AssetId,
                        Volume       = volume,
                        DateTime     = item.Header.Timestamp,
                    };
                    await _cashTransfersCollector.AddDataItemAsync(transfer);
                }
            }
            catch (Exception exc)
            {
                _log.Error(exc, context: item);
            }
        }