public IActionResult ReviewEditor(int reviewId)
        {
            var review = reviewId > 0 ? _reviewService.Get(reviewId) : new Review();

            if (review == null)
            {
                return(NotFound());
            }

            var reviewModel = _reviewModelFactory.Create(review);

            return(R.Success.With("review", reviewModel).Result);
        }
        public IActionResult ReviewEditor(int productId, int reviewId)
        {
            //check if the product is valid
            var product = _productService.Get(productId);

            if (!product.IsPublic(CurrentStore.Id))
            {
                return(NotFound());
            }
            var currentUser = ApplicationEngine.CurrentUser;
            var review      = reviewId > 0 ? _reviewService.Get(reviewId) : new Review()
            {
                ProductId = productId,
                UserId    = currentUser.Id
            };

            if (review == null || review.ProductId != productId)
            {
                return(NotFound());
            }
            if (review.UserId != ApplicationEngine.CurrentUser.Id || (review.Id > 0 && !_catalogSettings.AllowReviewModification))
            {
                return(NotFound());
            }

            var response = R.Success;

            //check if review should be allowed for this product
            if (_catalogSettings.AllowReviewsForStorePurchaseOnly)
            {
                //check if user has purchased anything here
                var orders = _orderService.GetOrders(out int _, userId: currentUser.Id, storeId: CurrentStore.Id,
                                                     paymentStatus: new List <PaymentStatus>()
                {
                    PaymentStatus.Complete
                },
                                                     orderStatus: new List <OrderStatus>()
                {
                    OrderStatus.Complete
                });
                if (orders.SelectMany(x => x.OrderItems).All(y => y.ProductId != productId))
                {
                    return(NotFound());
                }
            }

            if (_catalogSettings.AllowOneReviewPerUserPerItem && reviewId == 0)
            {
                //check if user has already reviewed this product
                var savedReview =
                    _reviewService.FirstOrDefault(x => x.ProductId == productId && x.UserId == CurrentUser.Id);
                if (savedReview != null)
                {
                    return(RedirectToRoute(RouteNames.AccountReviews));
                }
            }

            var reviewModel  = _reviewModelFactory.Create(review);
            var productModel = _productModelFactory.Create(product);

            //set breadcrumb nodes
            SetBreadcrumbToRoute("Account", RouteNames.AccountProfile);
            SetBreadcrumbToRoute("Review Center", RouteNames.AccountReviews);
            SetBreadcrumbToRoute("Edit Review", RouteNames.ReviewEditor);
            return(response.With("review", reviewModel).With("product", productModel).Result);
        }