public async Task <PaymentTransactionInfo> ProcessCallback(ProcessPaymentTransaction request) { var blockchainAddress = context.BlockchainAddresses.FirstOrDefault(addr => addr.Address == request.Address); if (blockchainAddress == null) { var msg = $"Eth address not found - {request.Address}"; logger.LogError(msg); throw new ApplicationException(msg); } if (request.Currency != blockchainAddress.Currency) { var msg = $"Wallet and Transaction currency should be the same {blockchainAddress.Id}"; logger.LogError(msg); throw new ApplicationException(msg); } var wallet = context.Wallets.First(w => w.UserId == blockchainAddress.UserId && w.Currency == blockchainAddress.Currency); PaymentTransactionInfo paymentTransactionInfo; using (var transaction = await context.Database.BeginTransactionAsync()) { var paymentTransaction = context.PaymentTransactions .FirstOrDefault(t => t.Hash == request.TransactionHash && t.BlockchainAddressId == blockchainAddress.Id); if (paymentTransaction != null) { if (paymentTransaction.Status == PaymentTransactionStatus.Pending || paymentTransaction.Status == PaymentTransactionStatus.New) { paymentTransaction.Status = request.Status; paymentTransaction.LastUpdated = DateTime.UtcNow; context.Update(paymentTransaction); await context.SaveChangesAsync(); } else { logger.LogError($"Can not override status from {paymentTransaction.Status} to {request.Status}"); } } else { var walletTransactions = new WalletTransactions() { Id = Guid.NewGuid(), WalletId = wallet.Id, Type = WalletTransactionsType.Deposit, Date = DateTime.UtcNow, Amount = request.Amount }; context.WalletTransactions.Add(walletTransactions); await context.SaveChangesAsync(); paymentTransaction = new PaymentTransactions { Id = Guid.NewGuid(), Hash = request.TransactionHash, Type = PaymentTransactionType.Deposit, BlockchainAddressId = blockchainAddress.Id, Amount = request.Amount, Fee = request.Fee, DateCreated = DateTime.UtcNow, Status = request.Status, PayoutTxHash = request.PayoutTxHash, PayoutServiceFee = request.PayoutServiceFee, PayoutMinerFee = request.PayoutMinerFee, WalletTransaction = walletTransactions }; context.PaymentTransactions.Add(paymentTransaction); if (paymentTransaction.Status == PaymentTransactionStatus.ConfirmedAndValidated) { wallet.Amount += paymentTransaction.Amount; await context.SaveChangesAsync(); } } transaction.Commit(); paymentTransactionInfo = new PaymentTransactionInfo { TransactionId = paymentTransaction.Id, TransactionHash = paymentTransaction.Hash, Amount = paymentTransaction.Amount, Currency = request.Currency.ToString(), GatewayCode = request.GatewayCode, Status = paymentTransaction.Status, IsValid = true }; } return(paymentTransactionInfo); }
public async Task <PaymentTransactionInfo> ProcessCallback(ProcessPaymentTransaction request) { var blockchainAddress = context.BlockchainAddresses.FirstOrDefault(addr => addr.Address == request.Address && addr.Currency == request.Currency); if (blockchainAddress == null) { var msg = $"{request.Currency} address not found - {request.Address}"; logger.LogError(msg); throw new ApplicationException(msg); } if (request.VerificationCode != blockchainAddress.VerificationCode) { var msg = $"Invalid VerificationCode {request.VerificationCode} for {request.Address}"; logger.LogError(msg); throw new ApplicationException(msg); } PaymentTransactionInfo transactionInfo; using (var transaction = await context.Database.BeginTransactionAsync()) { var wallet = context.Wallets.FirstOrDefault(w => w.UserId == blockchainAddress.UserId && w.Currency == blockchainAddress.Currency); if (wallet == null) { wallet = new Wallet() { UserId = blockchainAddress.UserId.Value, Amount = 0, Currency = blockchainAddress.Currency, }; context.Wallets.Add(wallet); context.SaveChanges(); } var blockchainTransaction = context.BlockchainTransactions .FirstOrDefault(t => t.Hash == request.TransactionHash && t.BlockchainAddressId == blockchainAddress.Id); if (blockchainTransaction != null) { if (blockchainTransaction.Status == BlockchainTransactionStatus.Pending || blockchainTransaction.Status == BlockchainTransactionStatus.New) { blockchainTransaction.Status = request.IsConfirmed ? BlockchainTransactionStatus.ConfirmedAndValidated : BlockchainTransactionStatus.Pending; blockchainTransaction.LastUpdated = DateTime.UtcNow; context.Update(blockchainTransaction); if (blockchainTransaction.Status == BlockchainTransactionStatus.ConfirmedAndValidated) { ProcessPayment(wallet, blockchainTransaction); } } else { logger.LogError($"Can not override status from {blockchainTransaction.Status} to {request.IsConfirmed}"); } } else { blockchainTransaction = new BlockchainTransaction { Id = Guid.NewGuid(), Hash = request.TransactionHash, Type = BlockchainTransactionType.Deposit, BlockchainAddressId = blockchainAddress.Id, Amount = request.Amount, //AmountBigInt = request.AmountBigInt,//TODO: Please add as string Currency = request.Currency, Fee = request.Fee, DateCreated = DateTime.UtcNow, Status = request.IsConfirmed ? BlockchainTransactionStatus.ConfirmedAndValidated : BlockchainTransactionStatus.Pending }; context.BlockchainTransactions.Add(blockchainTransaction); if (blockchainTransaction.Status == BlockchainTransactionStatus.ConfirmedAndValidated) { ProcessPayment(wallet, blockchainTransaction); } } await context.SaveChangesAsync(); transaction.Commit(); transactionInfo = new PaymentTransactionInfo { TransactionId = blockchainTransaction.Id, TransactionHash = blockchainTransaction.Hash, Amount = blockchainTransaction.Amount, Currency = request.Currency.ToString(), GatewayCode = request.GatewayCode, Status = blockchainTransaction.Status, IsValid = true }; } return(transactionInfo); }