コード例 #1
0
        public async Task <IActionResult> Coins(SendCoinsViewModel sendCoinsModel)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);

                    string sendToUserId = await _userRepository.FindUserIdForSendPageAsync(sendCoinsModel.InputTextIdentifier);

                    if (string.IsNullOrEmpty(sendToUserId))
                    {
                        sendCoinsModel.Status = "Error. User does not exist.";
                        return(View(sendCoinsModel));
                    }

                    var walletFrom = await _walletsRepository.GetUserWalletAsync(userId, sendCoinsModel.Currency);

                    var walletTo = await _walletsRepository.GetUserWalletAsync(sendToUserId, sendCoinsModel.Currency);


                    decimal?_amount = sendCoinsModel.Amount.ConvertToDecimal();

                    if (walletFrom != null &&
                        _amount.Value > 0 &&
                        _amount.Value <= walletFrom.Value)
                    {
                        if (walletTo == null)
                        {
                            walletTo = await _walletsRepository.CreateUserWalletAsync(new WalletTableModel()
                            {
                                UserId          = sendToUserId,
                                CurrencyAcronim = walletFrom.CurrencyAcronim,
                                Value           = 0,
                                Address         = _walletService.GetNewAddress(walletFrom.CurrencyAcronim, sendToUserId)
                            });

                            await _eventsRepository.CreateEventAsync(new EventTableModel()
                            {
                                UserId          = userId,
                                Type            = (int)EventTypeEnum.CreateWallet,
                                Comment         = $"Create wallet {walletTo.CurrencyAcronim}",
                                WhenDate        = DateTime.Now,
                                CurrencyAcronim = walletTo.CurrencyAcronim
                            });
                        }

                        var resultBalance = await _balanceProvider.Send(_amount.Value, walletFrom, walletTo);

                        SendCoinsModel sendRecieve = new()
                        {
                            SenderUserId          = userId,
                            ReceiverUserId        = sendToUserId,
                            TypeSender            = (int)EventTypeEnum.Send,
                            TypeRecieve           = (int)EventTypeEnum.Recieve,
                            Comment               = sendCoinsModel.Comment,
                            CurrencyAcronim       = sendCoinsModel.Currency,
                            Value                 = _amount.Value,
                            PlatformCommission    = resultBalance.Commission,
                            StartBalanceSender    = resultBalance.StartBalanceSender,
                            ResultBalanceSender   = resultBalance.ResultBalanceSender,
                            StartBalanceReceiver  = resultBalance.StartBalanceReceiver.Value,
                            ResultBalanceReceiver = resultBalance.ResultBalanceReceiver.Value,
                            SenderWalletId        = walletFrom.Id,
                            ReceiverWalletId      = walletTo.Id,
                        };

                        sendRecieve.Hash = GenerateHash.ComputeHash(sendCoinsModel.Currency, sendRecieve.SenderWalletId,
                                                                    sendRecieve.ReceiverWalletId, sendRecieve.Value, DateTime.Now, sendRecieve.Comment);


                        await _walletsRepository.SendCoinsAsync(sendRecieve);

                        sendCoinsModel.Status = "Success";
                    }
                    else
                    {
                        sendCoinsModel.Status = "Not enough coins";
                    }
                }
                catch
                {
                    sendCoinsModel.Status = "Error";
                    return(View(sendCoinsModel));
                }
            }
            return(View(sendCoinsModel));
        }