public ActionResult Post([FromBody] CheckOutItem value) { // Validation. if ((value == null) || (value.Id != string.Empty) || (ModelState.IsValid == false)) { return(BadRequest()); } // Object Flow Validation. bool isObjectFlowValid = _iFlowValid.IsValidOperation(BaseValidatorType.Create, value, null); if (!isObjectFlowValid) { return(BadRequest()); } // Add. _iCheckOutServices.AddCheckOut(value); // Event Bus Publish. if (value.CurrentState == CheckOutItem.STATE_CLOSED) { CheckOutEvent checkOutEvent = CheckOutEvent.FromItem(value); _iEventBus.Publish(checkOutEvent); } // Return. return(Created("GetCheckOut", value)); }
public ActionResult Put([FromBody] CheckOutItem value) { // Validation. if ((value == null) || (value.Id == string.Empty) || (ModelState.IsValid == false)) { return(BadRequest()); } // Object Flow Validation. CheckOutItem checkOutItem = _iCheckOutServices.GetCheckOut(value.Id).Result; if (checkOutItem == null) { return(NotFound()); } bool isObjectFlowValid = _iFlowValid.IsValidOperation(BaseValidatorType.Update, checkOutItem, value); if (!isObjectFlowValid) { return(BadRequest()); } // Update. bool blnResultUpdate = _iCheckOutServices.UpdateCheckOut(value.Id, value).Result; // Return with case. if (blnResultUpdate) { // Event Bus Publish. if (value.CurrentState == CheckOutItem.STATE_CLOSED) { CheckOutItem checkOutItemUpdated = _iCheckOutServices.GetCheckOut(value.Id).Result; CheckOutEvent checkOutEvent = CheckOutEvent.FromItem(checkOutItemUpdated); _iEventBus.Publish(checkOutEvent); } return(Accepted()); } else { return(NotFound()); } }
/// <summary> /// Invokes check-out process /// </summary> /// <param name="checkout">User information to create new order</param> /// <param name="correlationToken">Tracks request - can be any value</param> /// <returns></returns> public async Task <CheckoutEntity> Checkout(CheckoutDto checkout, string correlationToken) { // The shopping basket service is responsible for managing the user's shopping experirence. // It does not create or manage with orders. // Construct and publish the checkout event so that other services can manage those tasks. var total = 0m; var basketId = checkout.BasketId; // TODO: Capture UserID from Security Prinicpal //var userName = ClaimsPrincipal.Current.Identity.Name ?? "Generic User"; //https://davidpine.net/blog/principal-architecture-changes/ // Get user's shopping basket from storage var basket = await GetBasketById(basketId, correlationToken); // Create the OrderInformationModel var orderInformationModel = new OrderInformationModel(); // Create buyer information object var buyer = new OrderInformationModel.BuyerInformation() { Username = checkout.Username, FirstName = checkout.FirstName, LastName = checkout.LastName, Address = checkout.Address, City = checkout.City, State = checkout.State, PostalCode = checkout.PostalCode, Email = checkout.Email, Phone = checkout.Phone, }; // Create payment information object var payment = new OrderInformationModel.PaymentInformation() { CreditCardNumber = checkout.CreditCardNumber, SecurityCode = checkout.SecurityCode, CardholderName = checkout.CardholderName, ExpirationDate = checkout.ExpirationDate }; // Create event class that will contain shopping basket, buyer, and payment information // to create a new order. orderInformationModel.BasketId = basketId; // Generate system checkoutId using snowflake orderInformationModel.CheckoutId = SnowflakeIdGenerator.GenerateId(SnowflakeEnum.Checkout); orderInformationModel.Total = basket.Items.Sum(x => decimal.Parse(x.UnitPrice) * x.Quantity); orderInformationModel.Buyer = buyer; orderInformationModel.Payment = payment; foreach (var item in basket.Items) { orderInformationModel.LineItems.Add(new OrderInformationModel.LineItem() { ProductId = item.ProductId, Title = item.Title, Artist = item.Artist, Genre = item.Genre, UnitPrice = item.UnitPrice, Quantity = item.Quantity }); } var checkoutEvent = new CheckOutEvent { OrderInformationModel = orderInformationModel, CorrelationToken = correlationToken }; _logger.LogInformation($"Check-out operation invoked for shopping basket {basketId} for Request {correlationToken}"); //************** Publish Event ************************* // Publish customer checkout event // Ordering subscribes to event and creates order. // Once created, Ordering publishes event to have BasketEntity remove basket. await _eventBusPublisher.Publish <CheckOutEvent>(checkoutEvent); return(new CheckoutEntity { CheckoutSystemId = checkoutEvent.OrderInformationModel.CheckoutId, BuyerEmail = checkoutEvent.OrderInformationModel.Buyer.Email, CorrelationId = correlationToken }); }