Exemplo n.º 1
0
        private async Task <OrderDBE> InsertNewExplodedOrderAsync(int merchantId, NewOrderMBE newExplodedOrder, int?refOrderId = null)
        {
            //Step 1: Store the new merchant Order
            var newDBOrder = new OrderDBE()
            {
                Status           = Enums.ORDER_STATUS.New,
                MerchantId       = merchantId,
                CustomerName     = newExplodedOrder.CustomerName,
                PhoneNumber      = newExplodedOrder.CustomerPhoneNo,
                OrderDateTimeUTC = DateTime.UtcNow,
                RefOrderId       = refOrderId
            };

            await _dbContext.InsertOrderAsync(newDBOrder);

            //Step 2: create the first event
            var newDBOrderEvent = new OrderEventDBE()
            {
                OrderId          = newDBOrder.OrderId,
                EventDateTimeUTC = DateTime.UtcNow,
                OrderStatus      = Enums.ORDER_STATUS.New,
                EventDescription = refOrderId.HasValue ? $"Order created (from {refOrderId.Value})." : "Order created"
            };

            await _dbContext.InsertOrderEventAsync(newDBOrderEvent);

            //newDBOrder.OrderEvents.Add(newDBOrderEvent);        // build exploded order

            //Step 3: iterate through orderLineItems collection to save it in the db
            foreach (var orderLineItem in newExplodedOrder.OrderLineItems)
            {
                var catalogItem = await _dbContext.GetCatalogItemAsync(orderLineItem.ItemGuid);

                var newDBOrderLineItem = new OrderLineItemDBE()
                {
                    ItemName        = catalogItem.ItemName,
                    ItemUnitPrice   = catalogItem.ItemUnitPrice,
                    OrderId         = newDBOrder.OrderId,
                    CatalogItemGuid = orderLineItem.ItemGuid
                };

                await _dbContext.InsertOrderLineItemAsync(newDBOrderLineItem);

                //newDBOrder.OrderLineItems.Add(newDBOrderLineItem);        // build exploded order
            }

            return(newDBOrder);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Inserts new line item
        /// </summary>
        /// <param name="newLineItem"></param>
        /// <returns></returns>
        /// <remarks>
        /// only used by the ResetDB method so we can keep the same guids across reloads.
        /// </remarks>
        internal async Task InsertOrderLineItemAsync(OrderLineItemDBE newLineItem)
        {
            this.OrderLineItems.Add(newLineItem);

            try
            {
                await this.SaveChangesAsync();
            }
            catch (DbUpdateException ex)
            {
                // exception was raised by the db (ex: UK violation)
                var sqlException = ex.InnerException;

                // we do this to disconnect the exception that bubbles up from the dbcontext which will be disposed when it leaves this method
                throw new ApplicationException(sqlException.Message);
            }
            catch (Exception)
            {
                // rethrow exception
                throw;
            }
        }
Exemplo n.º 3
0
        public async Task <ActionResult> UpdateOrder([FromRoute] Guid orderGuid, [FromBody] NewOrderMBE updatedOrder)
        {
            // get the existing order
            var dbOrder = await _dbContext.GetOrderAsync(orderGuid);

            // if we did not find a matching order
            if (dbOrder == null)
            {
                return(BadRequest(new ArgumentException($"OrderGuid: [{orderGuid}] not found", nameof(orderGuid))));
            }

            // Biz Logic: Cannot change the order if it has already been paid for.
            if (dbOrder.Status == Enums.ORDER_STATUS.SMS_Sent || dbOrder.Status == Enums.ORDER_STATUS.Paid)
            {
                return(BadRequest(new ArgumentException($"Changes are not allowed after the SMS has been sent or the order has been paid", nameof(orderGuid))));
            }

            #region === Validation =================================================
            // validate the input params
            if (string.IsNullOrEmpty(updatedOrder.CustomerName))
            {
                return(BadRequest(new ArgumentException(@"The order name cannot be blank.", nameof(updatedOrder.CustomerName))));
            }
            else if (string.IsNullOrEmpty(updatedOrder.CustomerPhoneNo))
            {
                return(BadRequest(new ArgumentException(@"The order phone number cannot be blank.", nameof(updatedOrder.CustomerPhoneNo))));
            }
            (bool isValidPhoneNo, string formatedPhoneNo, _) = PhoneNoHelpers.NormalizePhoneNo(updatedOrder.CustomerPhoneNo);
            if (!isValidPhoneNo)
            {
                return(BadRequest(new ArgumentNullException(nameof(updatedOrder.CustomerPhoneNo), $"[{updatedOrder.CustomerPhoneNo}] is NOT a supported Phone No format.")));
            }
            else
            {
                updatedOrder.CustomerPhoneNo = formatedPhoneNo;
            }

            // validate the catalog guids
            foreach (var orderLineItem in updatedOrder.OrderLineItems)
            {
                // try to find the catalog item
                var catalogItem = await _dbContext.GetCatalogItemAsync(orderLineItem.ItemGuid);

                // if it did not exist (ie: a invalid guid)
                if (catalogItem == null)
                {
                    return(BadRequest(new ArgumentNullException(nameof(orderLineItem.ItemGuid), $"Error : [{orderLineItem.ItemGuid}] Is not a valid catalog item guid.")));
                }
            }

            #endregion

            try
            {
                // Step 1: update the dbOrder with the values we just got
                dbOrder.CustomerName = updatedOrder.CustomerName;
                dbOrder.PhoneNumber  = updatedOrder.CustomerPhoneNo;
                dbOrder.Status       = Enums.ORDER_STATUS.Updated;

                await _dbContext.UpdateOrderAsync(dbOrder);

                // Step 2: in this demo code we are just going to delete and re-add the order line items
                await _dbContext.DeleteOrderLineItemsAsync(dbOrder.OrderId);

                //iterate through orderLineItems collection to save it in the db
                foreach (var orderLineItem in updatedOrder.OrderLineItems)
                {
                    var catalogItem = await _dbContext.GetCatalogItemAsync(orderLineItem.ItemGuid);

                    var dbOrderLineItem = new OrderLineItemDBE()
                    {
                        ItemName        = catalogItem.ItemName,
                        ItemUnitPrice   = catalogItem.ItemUnitPrice,
                        OrderId         = dbOrder.OrderId,
                        CatalogItemGuid = orderLineItem.ItemGuid
                    };

                    await _dbContext.InsertOrderLineItemAsync(dbOrderLineItem);
                }

                // Step 3: create an event
                var dbOrderEvent = new OrderEventDBE()
                {
                    OrderId          = dbOrder.OrderId,
                    EventDateTimeUTC = DateTime.UtcNow,
                    OrderStatus      = Enums.ORDER_STATUS.Updated,
                    EventDescription = "Order updated."
                };

                //save order event
                await _dbContext.InsertOrderEventAsync(dbOrderEvent);

                return(NoContent());
            }
            catch (Exception ex)
            {
                return(BadRequest(new ApplicationException($"Error: [{ex.Message}] Failed to update merchant order.")));
            }
        }