Exemplo n.º 1
0
        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));
        }
Exemplo n.º 2
0
        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());
            }
        }
Exemplo n.º 3
0
        /// <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
            });
        }