public virtual IActionResult ProductReviewsAdd(string productId, ProductReviewsModel model, bool captchaValid, [FromServices] IOrderService orderService, [FromServices] IEventPublisher eventPublisher) { var product = _productService.GetProductById(productId); if (product == null || !product.Published || !product.AllowCustomerReviews) { return(RedirectToRoute("HomePage")); } //validate CAPTCHA if (_captchaSettings.Enabled && _captchaSettings.ShowOnProductReviewPage && !captchaValid) { ModelState.AddModelError("", _captchaSettings.GetWrongCaptchaMessage(_localizationService)); } if (_workContext.CurrentCustomer.IsGuest() && !_catalogSettings.AllowAnonymousUsersToReviewProduct) { ModelState.AddModelError("", _localizationService.GetResource("Reviews.OnlyRegisteredUsersCanWriteReviews")); } if (_catalogSettings.ProductReviewPossibleOnlyAfterPurchasing && !orderService.SearchOrders(customerId: _workContext.CurrentCustomer.Id, productId: productId, os: OrderStatus.Complete).Any()) { ModelState.AddModelError(string.Empty, _localizationService.GetResource("Reviews.ProductReviewPossibleOnlyAfterPurchasing")); } if (ModelState.IsValid) { var productReview = _productViewModelService.InsertProductReview(product, model); //activity log _customerActivityService.InsertActivity("PublicStore.AddProductReview", product.Id, _localizationService.GetResource("ActivityLog.PublicStore.AddProductReview"), product.Name); //raise event if (productReview.IsApproved) { eventPublisher.Publish(new ProductReviewApprovedEvent(productReview)); } _productViewModelService.PrepareProductReviewsModel(model, product); model.AddProductReview.Title = null; model.AddProductReview.ReviewText = null; model.AddProductReview.SuccessfullyAdded = true; if (!productReview.IsApproved) { model.AddProductReview.Result = _localizationService.GetResource("Reviews.SeeAfterApproving"); } else { model.AddProductReview.Result = _localizationService.GetResource("Reviews.SuccessfullyAdded"); } return(View(model)); } //If we got this far, something failed, redisplay form _productViewModelService.PrepareProductReviewsModel(model, product); return(View(model)); }