private ProductViewModel FetchDataToModify(int id) { var product = _productRepository.GetProductInclById(id); // Find description fields not initialized yet (for example, some fields for category A have been set up AFTER product X within category A has been created) var populatedFields = _productRepository.GetProductDescItemsByProductId(product.Id); var requiredFields = _subcategoryRepository.GetProductDescFieldsBySubcat(product.SubcategoryId); var unpopulatedFields = requiredFields.Where(f => !populatedFields.Select(p => p.Field.Id).Contains(f.Id)).ToList(); foreach (var field in unpopulatedFields) { product.ProductDescriptionItems.Add(new ProductDescriptionItem { Field = field }); } // Persist changes for easier change tracking via existing extension if (unpopulatedFields.Count > 0) { _productRepository.SaveChanges(); } var vm = new ProductViewModel(); Object2ObjectMappings.ProductToProductViewModel(product, vm); PrepareNavData(id, "CPanelProductEdit"); return(vm); }
public IActionResult AdminView(int id) { var product = _productRepository.GetProductInclById(id); // map data to viewmodel var vm = new ProductViewModel(); Object2ObjectMappings.ProductToProductViewModel(product, vm); PrepareNavData(id, "CPanelProductView"); return(View("AdminView", vm)); }
public async Task <IActionResult> Save(OrderDTO orderDto) { var order = _orderRepository.GetOrderInclById(orderDto.Id); if (order == null) { return(BadRequest("Order not found.")); } // Ensure that email is provided for order created by guest user if (String.IsNullOrEmpty(order.CustomerId) && String.IsNullOrEmpty(orderDto.DeliveryDetails.Email)) { ModelState.AddModelError("", "Email is not provided."); } if (!ModelState.IsValid) { _breadcrumbNavBuilder.CreateForNode("CPanelOrderEdit", new { orderId = order.Id, orderName = ("Order #" + order.Id).ToString() }, this); return(View("Edit", orderDto)); } var admin = await _userManager.GetUserAsync(User); // Preserve original user comment var tempComment = order.DeliveryDetails.Comment; // Set delivery & payment details Object2ObjectMappings.OrderDetailsDtoToOrder(orderDto.DeliveryDetails, order); // Recalculate delivery fee order.DeliveryFee = DeliveryFeeCalculator.Calculate(order.DeliveryDetails.DeliveryMethodType); order.DeliveryDetails.Comment = tempComment; // Retireve changes and log var changeLogs = _auditTrailService.RetrieveAndLogChanges(); foreach (var changeLog in changeLogs) { order.ChangeHistory.Add(new OrderChangeLog { ChangeLog = changeLog, Order = order }); } // Update last edit timestamp order.LastModifiedById = admin.Id; order.LastModifiedOn = DateTime.UtcNow; _orderRepository.SaveChanges(); return(RedirectToAction("AdminView", new { id = orderDto.Id })); }
public IActionResult AdminView(int id) { var order = _orderRepository.GetOrderInclById(id); // map to dto and return view var orderDto = new OrderDTO(); Object2ObjectMappings.OrderItemListToOrderItemDtoList(order.Items, orderDto.Items); Object2ObjectMappings.OrderToOrderDetailsDto(order, orderDto.DeliveryDetails); Object2ObjectMappings.OrderMainDataToOrderDto(order, orderDto); _breadcrumbNavBuilder.CreateForNode("CPanelOrderView", new { orderId = order.Id, orderName = ("Order #" + order.Id).ToString() }, this); return(View("AdminView", orderDto)); }
public IActionResult Edit(int id) { // retrieve order and related data var order = _orderRepository.GetOrderInclById(id); var deliveryDetailsDTO = new OrderDetailsDTO(); // get relevant delivery and payment data Object2ObjectMappings.OrderToOrderDetailsDto(order, deliveryDetailsDTO); // append to order DTO var orderDTO = new OrderDTO() { DeliveryDetails = deliveryDetailsDTO, Id = order.Id, NoUserAccount = (String.IsNullOrEmpty(order.CustomerId)) }; _breadcrumbNavBuilder.CreateForNode("CPanelOrderEdit", new { orderId = order.Id, orderName = ("Order #" + order.Id).ToString() }, this); return(View(orderDTO)); }
public IActionResult Display(int id) { var userId = _userManager.GetUserId(User); var product = _productRepository.GetProductInclById(id); // map data to viewmodel var vm = new ProductViewModel(); Object2ObjectMappings.ProductToProductViewModel(product, vm); vm.NoUserAccount = String.IsNullOrEmpty(userId); vm.IsRatedByUser = _productRepository.ProductIsRatedByUserId(product.Id, userId); // check if availability is watched by existing user if (!product.IsAvailable && !vm.NoUserAccount) { vm.IsWatchedByUser = _productRepository.ProductIsWatchedByUserId(product.Id, userId); } PrepareNavData(id, "ProductDisplay"); return(View(vm)); }
public IActionResult OnGetAsync(int id) { var userId = _userManager.GetUserId(User); if (string.IsNullOrEmpty(userId)) { return(BadRequest("User not found.")); } var order = _orderRepository.GetOrderInclById(id); //validate user if (order == null || !String.Equals(order.CustomerId, userId)) { return(BadRequest("Order with such ID for current user doesn't exist.")); } OrderDTO = new OrderDTO(); Object2ObjectMappings.OrderItemListToOrderItemDtoList(order.Items, OrderDTO.Items); Object2ObjectMappings.OrderToOrderDetailsDto(order, OrderDTO.DeliveryDetails); Object2ObjectMappings.OrderMainDataToOrderDto(order, OrderDTO); return(Page()); }
public async Task <IActionResult> CheckoutConfirm([FromRoute] string confirmationKey) { try { var userId = _userManager.GetUserId(User); // validate confirmation key if (String.IsNullOrEmpty(confirmationKey)) { return(BadRequest("Missing confirmation key.")); } // try to retrieve temp order from cache var tempOrder = ReadFromCache(confirmationKey); if (tempOrder == null) { return(BadRequest("Temp order not found.")); } // create order var order = new Order(tempOrder.DeliveryDetails.DeliveryMethodType) { CreatedOn = DateTime.UtcNow, CustomerId = userId, Status = OrderStatus.Created }; // append all items foreach (var tempItem in tempOrder.Items) { var productInDb = _productRepository.GetProductById(tempItem.Product.Id); if (productInDb != null && productInDb.NumberInStock >= tempItem.Quantity && productInDb.IsActive && productInDb.IsAvailable) { order.Items.Add(new OrderItem { Product = productInDb, ProductId = productInDb.Id, PurchasePrice = productInDb.SalePrice, Quantity = tempItem.Quantity }); } } // check if email has been provided for guest user if (String.IsNullOrEmpty(userId)) { if (String.IsNullOrEmpty(tempOrder.DeliveryDetails.Email)) { return(BadRequest("No email address provided for guest user's order.")); } order.DeliveryDetails.EmailAddress = tempOrder.DeliveryDetails.Email; } // set basic delivery details order.DeliveryFee = DeliveryFeeCalculator.Calculate(tempOrder.DeliveryDetails.DeliveryMethodType); // set delivery-specific details Object2ObjectMappings.OrderDetailsDtoToOrder(tempOrder.DeliveryDetails, order); // check consistency or order amount (prevents user from accidentally ordering items for which the price has just changed) if (order.OrderAmountTotal != tempOrder.OrderAmountTotal) { return(BadRequest("Price of some items you are trying to order might have changed.")); } // persist changes _orderRepository.AddOrder(order); if (_orderRepository.SaveChanges() > 0) { _cartManager.ResetCart(); _memoryCache.Remove(confirmationKey); await SendOrderConfirmation(order); } // return order id return(Ok(new { orderId = order.Id })); } catch (Exception ex) { var userId = _userManager.GetUserId(User); _logger.LogError("Order validation failed (user ID: " + userId + "). " + ex.ToString()); return(BadRequest("Unexpected error has occured. Please try again later.")); } }
public async Task <IActionResult> Save([FromForm] ProductViewModel vm) { Product product; string uploaderErrorMessage = ""; bool isAvailableAgain = false; // Validate all inputs if (!_uploader.ValidateImageMulti(vm.PicturesToUpload, ref uploaderErrorMessage)) { ModelState.AddModelError("", uploaderErrorMessage); } if (!ModelState.IsValid) { if (vm.Id == 0) { return(View("Edit", FetchDataToCreate(vm.SubcategoryId))); } else { return(View("Edit", FetchDataToModify(vm.Id))); } } var admin = await _userManager.GetUserAsync(User); // New product if (vm.Id == 0) { product = new Product() { SubcategoryId = vm.SubcategoryId }; // Copy main prop values Object2ObjectMappings.ProductViewModelToProduct(vm, product); product.AddedOn = DateTime.UtcNow; product.AddedBy = admin.Email; _productRepository.AddProduct(product); } // Edit existing product else { product = _productRepository.GetProductInclById(vm.Id); // check if product wasnt avaiable & not is available again if (!product.IsAvailable && vm.IsAvailable) { isAvailableAgain = true; } // Copy main prop values Object2ObjectMappings.ProductViewModelToProduct(vm, product); // Log modifications var changeLogs = _auditTrailService.RetrieveAndLogChanges(); foreach (var changeLog in changeLogs) { product.ChangeHistory.Add(new ProductChangeLog { ChangeLog = changeLog, Product = product }); } product.LastModifiedOn = DateTime.UtcNow; product.LastModifiedById = admin.Id; } // Reset existing pictures if user requested if (vm.RemoveExistingImages) { product.Pictures.Clear(); } // Add images var imgUploaded = await _uploader.UploadMulti(vm.PicturesToUpload); product.Pictures.AddRange(imgUploaded.Select(pic => new FilePath { Path = pic }).ToList()); if (_productRepository.SaveChanges() > 0 && isAvailableAgain) { await NotifyAllUsers(product); } return(RedirectToAction("AdminView", new { id = product.Id })); }