Пример #1
0
        /// <summary>
        /// ExecuteAsync to execute and retrieve payment
        /// </summary>
        /// <param name="retrievePaymentRequest"></param>
        /// <returns>Task<ActionResult<RetrievePaymentResponse>></returns>
        public async Task <ActionResult <RetrievePaymentResponse> > ExecuteAsync(RetrievePaymentRequest retrievePaymentRequest)
        {
            var payment = await this._dataStoreDbContext.Payments
                          .Where(r => r.PaymentId == retrievePaymentRequest.PaymentId)
                          .FirstOrDefaultAsync <Payment>();

            if (payment is null)
            {
                this._logger.LogWarning($@"RequestId:{this._requestTrackingService.RequestTraceId} 
                Payment details Not Found in DB for PaymentId:{retrievePaymentRequest.PaymentId}");

                var errorResponse = new StandardErrorResponse
                {
                    Type           = HttpStatusCode.NotFound.ToString(),
                    RequestTraceId = this._requestTrackingService.RequestTraceId.ToString(),
                    Error          = $"No Record found for PaymentId : {retrievePaymentRequest.PaymentId}"
                };

                return(new NotFoundObjectResult(errorResponse));
            }

            this._logger.LogDebug($@"RequestId:{this._requestTrackingService.RequestTraceId} 
            Payment details retrived from DataStore for PaymentId:{payment.PaymentId}");
            var response = new RetrievePaymentResponse
            {
                PaymentId  = payment.PaymentId,
                CardNumber = payment.CardNumber,
                Status     = payment.PaymentStatus,
                Expiry     = payment.Expiry,
                Amount     = (decimal)payment.Amount,
                Currency   = payment.Currency
            };

            return(new OkObjectResult(response));
        }
Пример #2
0
        public async Task <ActionResult <ProcessPaymentResponse> > ProcessPaymentAsync(ProcessPaymentRequest paymentRequest)
        {
            var payment = new Payment(
                paymentRequest.paymentRequestBody.Currency,
                paymentRequest.paymentRequestBody.CVV,
                paymentRequest.paymentRequestBody.Amount,
                paymentRequest.paymentRequestBody.Expiry,
                paymentRequest.paymentRequestBody.CardNumber
                );
            var validationHelper = new ValidationHelper();

            if (!validationHelper.isValid(payment))
            {
                var errorResponse = new StandardErrorResponse
                {
                    Type           = HttpStatusCode.BadRequest.ToString(),
                    RequestTraceId = this._requestTrackingService.RequestTraceId.ToString(),
                    Error          = $"Invalid Payment request : {JsonSerializer.Serialize(validationHelper.Error)}"
                };

                return(new BadRequestObjectResult(errorResponse));
            }

            return(await _payoutCommand.ExecuteAsync(payment));
        }
Пример #3
0
        /// <summary>
        /// ExecuteAsync to execute and process payment
        /// </summary>
        /// <param name="payment"></param>
        /// <returns>Task<ActionResult<ProcessPaymentResponse>></returns>
        public async Task <ActionResult <ProcessPaymentResponse> > ExecuteAsync(Payment payment)
        {
            try
            {
                var bankResponse = await this._bank.PayOutAsync(payment);

                if (bankResponse.PaymentStatus == Payment.Status.APPROVED)
                {
                    payment.Approve(bankResponse.PaymentId);
                }

                if (bankResponse.PaymentStatus == Payment.Status.DECLINED)
                {
                    payment.Decline(bankResponse.PaymentId);
                }

                using (var dbContext = this._dataStoreDbContext)
                {
                    var createdPayment = dbContext.Payments.Add(payment);
                    await dbContext.SaveChangesAsync();

                    this._logger.LogDebug($@"RequestId:{this._requestTrackingService.RequestTraceId} 
                        Payment stored in DB with PaymentId:{payment.PaymentId}");
                }

                return(new CreatedResult($"/api/payments/{payment.PaymentId}", new ProcessPaymentResponse {
                    PaymentId = payment.PaymentId
                }));
            }
            catch (BankServiceException ex)
            {
                this._logger.LogError($@"RequestId:{this._requestTrackingService.RequestTraceId} 
                Bank Service Exception", ex);

                //GENERATE StandardErrorResponse with request tracking id
                var errorResponse = new StandardErrorResponse
                {
                    Type           = ex.GetType().ToString(),
                    Error          = ex.Message,
                    RequestTraceId = this._requestTrackingService.RequestTraceId.ToString()
                };

                return(new ObjectResult(errorResponse)
                {
                    StatusCode = (int)HttpStatusCode.ServiceUnavailable
                });
            }
        }
Пример #4
0
 protected virtual void LogBadRequest(StandardErrorResponse responseBody)
 {
 }
Пример #5
0
 protected override void LogBadRequest(IOperation operation, StandardErrorResponse body)
 {
     Logged = true;
     Debug.Assert(operation != null);
     Debug.Assert(body != null);
 }
Пример #6
0
 protected override void LogBadRequest(string message, HttpActionContext context, StandardErrorResponse response)
 {
     Logged = true;
     Debug.Assert(message != null);
     Debug.Assert(context != null);
     Debug.Assert(response != null);
 }
 protected virtual void LogBadRequest(string message, HttpActionContext context, StandardErrorResponse response)
 {
 }
 protected virtual void LogBadRequest(IOperation operation, StandardErrorResponse body)
 {
 }