public async Task <int> InitialiseAsync(FulfillRequest request, string merchantId) { var existing = await _context.Payments.FirstOrDefaultAsync(x => x.CorrelationId == request.CorrelationId); if (existing is null) { var payment = new Payment { Amount = request.Amount, CardNumber = request.CardNumber, CreatedDate = DateTime.Now, CorrelationId = request.CorrelationId, CurrencyCode = request.CurrencyCode, CVV = request.CVV, ExpiryMonthYear = request.ExpiryMonthYear, MerchantId = merchantId, Status = PaymentStatus.Pending }; _context.Add(payment); await _context.SaveChangesAsync(); _logger.LogInformation($"Payment Initilised | Correlation Id: {request.CorrelationId}"); return(payment.Id); } else if (existing.Status != PaymentStatus.Pending) { _logger.LogCritical($"Payment has already been completed | Correlation Id: {request.CorrelationId}"); throw new Exception("Payment has already been completed"); } return(existing.Id); }
public async Task <ActionResult <FulfillResponse> > Fulfill(FulfillRequest request) { var detector = new CreditCardDetector(request.CardNumber); if (!detector.IsValid()) { _logger.LogError($"Invalid Card Number | Correlation Id: {request.CorrelationId}"); return(BadRequest("Invalid card number")); } var merchantId = HttpContext.User.Identity.Name; var id = await _paymentService.InitialiseAsync(request, merchantId); var bankRequest = new BankFulfillRequest { ExpiryMonthYear = request.ExpiryMonthYear, CardNumber = request.CardNumber, Amount = request.Amount, CurrencyCode = request.CurrencyCode, CVV = request.CVV, MerchantId = merchantId }; var result = await _clientFactory.GetClient(request.CardNumber).FulfillAsync(bankRequest); var status = GetStatus(result.Status); await _paymentService.FulfillAsync(id, status, result.TransactionId); return(Ok(new FulfillResponse { BankTransactionId = result.TransactionId, Status = status })); }
public FulFillResponse Fulfill(FulfillRequest request) { return(new FulFillResponse { TransactionId = Guid.NewGuid(), Status = request.Amount % 5 == 0 ? Status.Failure : Status.Success }); }
public async Task <FulfillResponse> Fulfill(FulfillRequest request) { var content = new StringContent(JsonSerializer.Serialize(request), Encoding.UTF8, "application/json"); var response = await _client.PostAsync("Payment", content); response.EnsureSuccessStatusCode(); using var responseStream = await response.Content.ReadAsStreamAsync(); return(await JsonSerializer.DeserializeAsync <FulfillResponse>(responseStream)); }