public async Task <string> Handle(CreateChargeCommand request, CancellationToken cancellationToken) { //Todo: check if card already exists, else would create new card with same details each time! var card = new Card(request.Brand, request.ExpiryMonth, request.ExpiryYear, request.CardNumber, request.CVV, request.Is3DSecure); var charge = new Charge(request.Amount, request.CurrencyCode, card, request.IdempotencyKey); // make call to acquiring bank var paymentResponse = await _aquiringBankApiService.RequestPayment( new BankPaymentRequest(charge.Amount, charge.Currency, charge.Card.Brand, charge.Card.ExpiryMonth, charge.Card.ExpiryYear, charge.Card.Number, charge.Card.Cvv)); charge.AddPaymentResponse(paymentResponse.PaymentResponseId, paymentResponse.Status, paymentResponse.FailureCode); //persist to db await _chargeRepository.Create(charge); return(paymentResponse.Status); }