public async Task <ActionResult> CreateOrder([FromBody] orderModel.BankCardInfo bankCardInfo) { EnsureCartExists(); //Need lock to prevent concurrent access to same cart using (await AsyncLock.GetLockByKey(WorkContext.CurrentCart.Value.GetCacheKey()).LockAsync()) { var cartBuilder = await LoadOrCreateCartAsync(); var order = await _orderApi.CreateOrderFromCartAsync(cartBuilder.Cart.Id); var taskList = new List <Task> { //Raise domain event asynchronously _publisher.Publish(new OrderPlacedEvent(WorkContext, order.ToCustomerOrder(WorkContext.AllCurrencies, WorkContext.CurrentLanguage), cartBuilder.Cart)), //Remove the cart asynchronously cartBuilder.RemoveCartAsync() }; //Process order asynchronously var incomingPayment = order.InPayments != null?order.InPayments.FirstOrDefault() : null; Task <orderModel.ProcessPaymentResult> processPaymentTask = null; if (incomingPayment != null) { processPaymentTask = _orderApi.ProcessOrderPaymentsAsync(order.Id, incomingPayment.Id, bankCardInfo); taskList.Add(processPaymentTask); } await Task.WhenAll(taskList.ToArray()); return(Json(new { order, orderProcessingResult = processPaymentTask != null ? await processPaymentTask : null, paymentMethod = incomingPayment != null ? incomingPayment.PaymentMethod : null })); } }
public async Task <ActionResult> CreateOrder(orderModel.BankCardInfo bankCardInfo) { EnsureCartExists(); //Need lock to prevent concurrent access to same cart using (await AsyncLock.GetLockByKey(GetAsyncLockCartKey(WorkContext.CurrentCart)).LockAsync()) { var cartBuilder = await LoadOrCreateCartAsync(); var order = await _orderApi.OrderModule.CreateOrderFromCartAsync(cartBuilder.Cart.Id); //Raise domain event await _orderPlacedEventPublisher.PublishAsync(new OrderPlacedEvent(order.ToCustomerOrder(WorkContext.AllCurrencies, WorkContext.CurrentLanguage), cartBuilder.Cart)); orderModel.ProcessPaymentResult processingResult = null; var incomingPayment = order.InPayments != null?order.InPayments.FirstOrDefault() : null; if (incomingPayment != null) { processingResult = await _orderApi.OrderModule.ProcessOrderPaymentsAsync(order.Id, incomingPayment.Id, bankCardInfo); } await cartBuilder.RemoveCartAsync(); return(Json(new { order, orderProcessingResult = processingResult, paymentMethod = incomingPayment != null ? incomingPayment.PaymentMethod : null })); } }
public virtual orderDto.BankCardInfo ToBankCardInfoDto(BankCardInfo model) { orderDto.BankCardInfo retVal = null; if (model != null) { retVal = new orderDto.BankCardInfo(); retVal.InjectFrom <NullableAndEnumValueInjecter>(model); } return(retVal); }
public virtual orderDto.BankCardInfo ToBankCardInfoDto(BankCardInfo model) { orderDto.BankCardInfo retVal = null; if (model != null) { retVal = new orderDto.BankCardInfo(); retVal.BankCardCVV2 = model.BankCardCVV2; retVal.BankCardMonth = model.BankCardMonth; retVal.BankCardNumber = model.BankCardNumber; retVal.BankCardType = model.BankCardType; retVal.BankCardYear = model.BankCardYear; retVal.CardholderName = model.CardholderName; } return(retVal); }
public static orderDto.BankCardInfo ToBankCardInfoDto(this BankCardInfo model) { orderDto.BankCardInfo retVal = null; if (model != null) { retVal = new orderDto.BankCardInfo { BankCardCVV2 = model.BankCardCVV2, BankCardMonth = model.BankCardMonth, BankCardNumber = model.BankCardNumber, BankCardType = model.BankCardType, BankCardYear = model.BankCardYear, CardholderName = model.CardholderName }; } return(retVal); }
public async Task <ActionResult> ProcessOrderPayment(string orderNumber, string paymentNumber, orderModel.BankCardInfo bankCardInfo) { //Need lock to prevent concurrent access to same order using (await AsyncLock.GetLockByKey(GetAsyncLockKey(orderNumber, WorkContext)).LockAsync()) { var orderDto = await GetOrderDtoByNumber(orderNumber); var paymentDto = orderDto.InPayments.FirstOrDefault(x => x.Number.EqualsInvariant(paymentNumber)); if (paymentDto == null) { return(new HttpStatusCodeResult(HttpStatusCode.InternalServerError, "payment " + paymentNumber + " not found")); } var processingResult = await _orderApi.OrderModule.ProcessOrderPaymentsAsync(orderDto.Id, paymentDto.Id, bankCardInfo); return(Json(new { orderProcessingResult = processingResult, paymentMethod = paymentDto.PaymentMethod })); } }
public async Task <ActionResult <ProcessOrderPaymentResult> > ProcessOrderPayment(string orderNumber, string paymentNumber, [FromBody][SwaggerOptional] orderModel.BankCardInfo bankCardInfo) { //Need lock to prevent concurrent access to same order using (await AsyncLock.GetLockByKey(GetAsyncLockKey(orderNumber, WorkContext)).LockAsync()) { var orderDto = await GetOrderDtoByNumber(orderNumber); var paymentDto = orderDto.InPayments.FirstOrDefault(x => x.Number.EqualsInvariant(paymentNumber)); if (paymentDto == null) { throw new StorefrontException("payment " + paymentNumber + " not found"); } var processingResult = await _orderApi.ProcessOrderPaymentsAsync(orderDto.Id, paymentDto.Id, bankCardInfo); return(new ProcessOrderPaymentResult { OrderProcessingResult = processingResult, PaymentMethod = paymentDto.PaymentMethod }); } }