public override async Task <CreatePaypalPayoutResponse> CreatePaypalPayout(CreatePaypalPayoutRequest request, ServerCallContext context) { var httpContext = context.GetHttpContext(); var userId = httpContext.GetUserId(); var email = httpContext.GetEmail(); try { var payoutBatch = await _paypalPayoutService.CreateAsync( request.Transaction.Id.ParseEntityId <TransactionId>(), request.Email, -request.Transaction.Currency.Amount.ToDecimal(), request.Transaction.Description); await _serviceBusPublisher.PublishUserWithdrawSucceededIntegrationEventAsync(userId, request.Transaction); var response = new CreatePaypalPayoutResponse(); var message = $"A PayPal payout batch '{payoutBatch.batch_header.payout_batch_id}' was created for the user '{email}'. (userId=\"{userId}\")"; return(context.Ok(response, message)); } catch (Exception exception) { await _serviceBusPublisher.PublishUserWithdrawFailedIntegrationEventAsync(userId, request.Transaction); var message = $"Failed to process withdraw for the user '{email}'. (userId=\"{userId}\")"; throw this.RpcExceptionWithInternalStatus(exception, message); } }
public void Withdraw_ShouldThrowRpcExceptionWithInternalStatus() { // Arrange var userId = new UserId(); const string email = "*****@*****.**"; var host = TestHost.WithClaimsFromBearerAuthentication(new Claim(JwtClaimTypes.Subject, userId.ToString()), new Claim(JwtClaimTypes.Email, email)); var request = new CreatePaypalPayoutRequest { Transaction = new TransactionDto { Currency = new CurrencyDto { Type = EnumCurrencyType.Money, Amount = 20 }, Description = "test", Id = new TransactionId(), Status = EnumTransactionStatus.Pending, Timestamp = DateTime.UtcNow.ToTimestamp(), Type = EnumTransactionType.Withdraw } }; var client = new PaymentService.PaymentServiceClient(host.CreateChannel()); // Act var func = new Func <Task>(async() => await client.CreatePaypalPayoutAsync(request)); // Assert func.Should().Throw <RpcException>(); }
public async Task <IActionResult> WithdrawAsync([FromBody] WithdrawTransactionRequest request) { var createTransactionRequest = new CreateTransactionRequest { Bundle = request.BundleId }; var createTransactionResponse = await _cashierServiceClient.CreateTransactionAsync(createTransactionRequest); try { var createPaypalPayoutRequest = new CreatePaypalPayoutRequest { Email = request.Email, Transaction = createTransactionResponse.Transaction }; await _paymentServiceClient.CreatePaypalPayoutAsync(createPaypalPayoutRequest); return(this.Ok()); } catch (RpcException exception) { var cancelTransactionRequest = new CancelTransactionRequest { TransactionId = createTransactionResponse.Transaction.Id }; await _cashierServiceClient.CancelTransactionAsync(cancelTransactionRequest); throw exception.Capture(); } }