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); }
/// <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; } }
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."))); } }