public async Task <ResponseCardPaymentDto> PersistPaymentRequestToDatabase(RequestCardPaymentDto requestDto, ResponseExternalPaymentDto responseDto, ValidationData validationData)
        {
            var paymentEntity = _mapper.Map <RequestCardPaymentDto, Payment>(requestDto);

            paymentEntity.CurrencyId = validationData.Currency.Id;
            paymentEntity.Method     = PaymentMethods.Card.ToString();

            var paymentCardEntity = await _paymentCardRepository.GetPaymentCardByNumberAsync(requestDto.Number);

            // if payment card exists do not add new record of it in database
            if (paymentCardEntity != null)
            {
                paymentEntity.PaymentCardId = paymentCardEntity.Id;
            }
            else
            {
                paymentCardEntity = _mapper.Map <RequestCardPaymentDto, PaymentCard>(requestDto);
                paymentCardEntity.CardIssuerId = validationData.CardIssuer.Id;

                paymentEntity.PaymentCard = paymentCardEntity;
            }

            _mapper.Map(responseDto, paymentEntity);

            _paymentRepository.AddPayment(paymentEntity);

            await _paymentRepository.CommitAsync();

            var responseCardpaymentDto = _mapper.Map <Payment, ResponseCardPaymentDto>(paymentEntity);

            return(responseCardpaymentDto);
        }
        public async Task <IActionResult> CreateCardPayment(RequestCardPaymentDto dto)
        {
            var validationData = await _paymentValidationService.ValidateAsync(dto.Number, dto.Cvv, dto.Currency, dto.Amount);

            var externalRequestDto = _mapper.Map <RequestCardPaymentDto, RequestExternalPaymentDto>(dto);

            var externalResponseDto = await _paymentService.PayThroughAcquiringBankAsync(externalRequestDto);

            if (externalResponseDto != null)
            {
                var responseCardpaymentDto = await _paymentService.PersistPaymentRequestToDatabase(dto, externalResponseDto, validationData);

                return(CreatedAtRoute(nameof(GetPayment), new { identifier = responseCardpaymentDto.Identifier }, responseCardpaymentDto));
            }

            return(BadRequest());
        }