Beispiel #1
0
        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>();
        }
Beispiel #3
0
        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();
            }
        }