diff --git a/src/Tests/Grand.Web.Store.Tests/Controllers/CustomerControllerTests.cs b/src/Tests/Grand.Web.Store.Tests/Controllers/CustomerControllerTests.cs index 2a91c0b62..21f63d44a 100644 --- a/src/Tests/Grand.Web.Store.Tests/Controllers/CustomerControllerTests.cs +++ b/src/Tests/Grand.Web.Store.Tests/Controllers/CustomerControllerTests.cs @@ -3,6 +3,7 @@ using Grand.Business.Core.Interfaces.Common.Directory; using Grand.Business.Core.Interfaces.Common.Localization; using Grand.Business.Core.Interfaces.Customers; +using Grand.Business.Core.Interfaces.Marketing.Customers; using Grand.Business.Core.Interfaces.Messages; using Grand.Domain.Customers; using Grand.Infrastructure; @@ -59,6 +60,7 @@ private CustomerController BuildController(bool perStoreEnabled) _customerServiceMock.Object, _customerViewModelServiceMock.Object, _customerManagerServiceMock.Object, + new Mock().Object, new Mock().Object, new Mock().Object, new Mock().Object, diff --git a/src/Web/Grand.Web.Store/Controllers/CustomerController.cs b/src/Web/Grand.Web.Store/Controllers/CustomerController.cs index 93ddccd0b..22797b69b 100644 --- a/src/Web/Grand.Web.Store/Controllers/CustomerController.cs +++ b/src/Web/Grand.Web.Store/Controllers/CustomerController.cs @@ -4,6 +4,7 @@ using Grand.Business.Core.Interfaces.Common.Directory; using Grand.Business.Core.Interfaces.Common.Localization; using Grand.Business.Core.Interfaces.Customers; +using Grand.Business.Core.Interfaces.Marketing.Customers; using Grand.Business.Core.Interfaces.Messages; using Grand.Business.Core.Utilities.Customers; using Grand.Domain.Catalog; @@ -45,6 +46,7 @@ public CustomerController( ICustomerService customerService, ICustomerViewModelService customerViewModelService, ICustomerManagerService customerManagerService, + ICustomerProductService customerProductService, IProductReviewService productReviewService, IProductReviewViewModelService productReviewViewModelService, IProductViewModelService productViewModelService, @@ -62,6 +64,7 @@ public CustomerController( _customerService = customerService; _customerViewModelService = customerViewModelService; _customerManagerService = customerManagerService; + _customerProductService = customerProductService; _productReviewService = productReviewService; _productReviewViewModelService = productReviewViewModelService; _productViewModelService = productViewModelService; @@ -84,6 +87,7 @@ public CustomerController( private readonly ICustomerService _customerService; private readonly ICustomerViewModelService _customerViewModelService; private readonly ICustomerManagerService _customerManagerService; + private readonly ICustomerProductService _customerProductService; private readonly IProductReviewService _productReviewService; private readonly IProductReviewViewModelService _productReviewViewModelService; private readonly IProductViewModelService _productViewModelService; @@ -827,30 +831,52 @@ public async Task ProductAddPopup(string customerId, bool persona } [PermissionAuthorizeAction(PermissionActionName.Edit)] + [HttpPost] public async Task UpdateProductPrice(CustomerModel.ProductPriceModel model) { + var productPrice = await _customerProductService.GetCustomerProductPriceById(model.Id); + if (productPrice == null || await GetStoreCustomer(productPrice.CustomerId) == null) + return new JsonResult(""); + await _customerViewModelService.UpdateProductPrice(model); return new JsonResult(""); } [PermissionAuthorizeAction(PermissionActionName.Edit)] + [HttpPost] public async Task DeleteProductPrice(string id) { - await _customerViewModelService.DeleteProductPrice(id); + var productPrice = await _customerProductService.GetCustomerProductPriceById(id); + if (productPrice == null || await GetStoreCustomer(productPrice.CustomerId) == null) + return new JsonResult(""); + + //delete the already-resolved entity to avoid a redundant reload / TOCTOU throw + await _customerProductService.DeleteCustomerProductPrice(productPrice); return new JsonResult(""); } [PermissionAuthorizeAction(PermissionActionName.Edit)] + [HttpPost] public async Task UpdatePersonalizedProduct(CustomerModel.ProductModel model) { + var customerProduct = await _customerProductService.GetCustomerProduct(model.Id); + if (customerProduct == null || await GetStoreCustomer(customerProduct.CustomerId) == null) + return new JsonResult(""); + await _customerViewModelService.UpdatePersonalizedProduct(model); return new JsonResult(""); } [PermissionAuthorizeAction(PermissionActionName.Edit)] + [HttpPost] public async Task DeletePersonalizedProduct(string id) { - await _customerViewModelService.DeletePersonalizedProduct(id); + var customerProduct = await _customerProductService.GetCustomerProduct(id); + if (customerProduct == null || await GetStoreCustomer(customerProduct.CustomerId) == null) + return new JsonResult(""); + + //delete the already-resolved entity to avoid a redundant reload / TOCTOU throw + await _customerProductService.DeleteCustomerProduct(customerProduct); return new JsonResult(""); }