private async Task <ApiResponse <CreatePaymentResponse> > HandlePaymentRejected(CreatePaymentRequest request, TransferFundsErrorResponse bankErrorResponse)
        {
            var res = await _mediator.Send(new ProcessRejectedPaymentRequest
            {
                Source = new ProcessRejectedPaymentRequest.PaymentSource
                {
                    Cvv        = request.Source.Cvv,
                    CardExpiry = request.Source.CardExpiry,
                    CardNumber = request.Source.CardNumber,
                },
                Recipient = new ProcessRejectedPaymentRequest.PaymentRecipient
                {
                    SortCode      = request.Recipient.SortCode,
                    AccountNumber = request.Recipient.AccountNumber
                },
                Currency = request.Currency,
                Amount   = request.Amount,
                Merchant = new ProcessRejectedPaymentRequest.MerchantDetails
                {
                    Id = _merchantContext.GetMerchantId(),
                },
                BankResponse = new ProcessRejectedPaymentRequest.BankPaymentResponse
                {
                    FailureReason = bankErrorResponse.Code
                }
            });

            return(ApiResponse <CreatePaymentResponse> .Success(StatusCodes.Status201Created, new CreatePaymentResponse
            {
                Status = PaymentStatus.Rejected,
                PaymentId = res.Id
            }));
        }
Exemple #2
0
        public Task <ApiResponse <GetPaymentByIdResponse> > Handle(GetPaymentByIdRequest request, CancellationToken cancellationToken = default)
        {
            var merchantId = _merchantContext.GetMerchantId();

            var merchantKey = _encryptionKeys.Key(merchantId);

            var paymentRecord = _paymentRecordReader
                                .PaymentRecords
                                .Where(record => record.MerchantId == _merchantContext.GetMerchantId())
                                .Where(record => record.Id == request.Id)
                                .Select(b => new
            {
                b.Id,
                DecryptedCvv           = _decrypter.DecryptUtf8(b.Source.CvvEncrypted, merchantKey),
                DecryptedCardExpiry    = _decrypter.DecryptUtf8(b.Source.CardExpiryEncrypted, merchantKey),
                DecryptedCardNumber    = _decrypter.DecryptUtf8(b.Source.CardNumberEncrypted, merchantKey),
                DecryptedSortCode      = _decrypter.DecryptUtf8(b.Recipient.SortCodeEncrypted, merchantKey),
                DecryptedAccountNumber = _decrypter.DecryptUtf8(b.Recipient.AccountNumberEncrypted, merchantKey),
                b.FailureReason,
                b.Amount,
                b.Status,
                b.CreatedAt,
                b.Currency
            })
                                .Select(record => new GetPaymentByIdResponse
            {
                Id     = record.Id,
                Source = new GetPaymentByIdResponse.PaymentSource
                {
                    Cvv        = record.DecryptedCvv.Mask(3, 0, 'X'),
                    CardExpiry = record.DecryptedCardExpiry,
                    CardNumber = record.DecryptedCardNumber.Mask(12, 0, 'X'),
                },
                Recipient = new GetPaymentByIdResponse.PaymentRecipient
                {
                    SortCode      = record.DecryptedSortCode.Mask(4, 0, 'X'),
                    AccountNumber = record.DecryptedAccountNumber.Mask(6, 0, 'X')
                },
                Details = string.IsNullOrEmpty(record.FailureReason) ? null : new GetPaymentByIdResponse.BankResponse
                {
                    FailureReason = record.FailureReason
                },
                Amount    = record.Amount,
                Status    = record.Status,
                CreatedAt = record.CreatedAt,
                Currency  = record.Currency,
            }).FirstOrDefault();

            if (paymentRecord == null)
            {
                return(Task.FromResult(ApiResponse <GetPaymentByIdResponse> .Fail(StatusCodes.Status404NotFound,
                                                                                  "NOT_FOUND",
                                                                                  "Payment record not found")));
            }

            return(Task.FromResult(ApiResponse <GetPaymentByIdResponse> .Success(StatusCodes.Status200OK, paymentRecord)));
        }