/// <returns>A task that represents the asynchronous operation</returns>
        public virtual async Task <IActionResult> ProductReviewsAdd(int productId, ProductReviewsModel model, bool captchaValid)
        {
            var product = await _productService.GetProductByIdAsync(productId);

            if (product == null || product.Deleted || !product.Published || !product.AllowCustomerReviews ||
                !await _productService.CanAddReviewAsync(product.Id, (await _storeContext.GetCurrentStoreAsync()).Id))
            {
                return(RedirectToRoute("Homepage"));
            }

            //validate CAPTCHA
            if (_captchaSettings.Enabled && _captchaSettings.ShowOnProductReviewPage && !captchaValid)
            {
                ModelState.AddModelError("", await _localizationService.GetResourceAsync("Common.WrongCaptchaMessage"));
            }

            await ValidateProductReviewAvailabilityAsync(product);

            if (ModelState.IsValid)
            {
                //save review
                var rating = model.AddProductReview.Rating;
                if (rating < 1 || rating > 5)
                {
                    rating = _catalogSettings.DefaultProductRatingValue;
                }
                var isApproved = !_catalogSettings.ProductReviewsMustBeApproved;

                var productReview = new ProductReview
                {
                    ProductId       = product.Id,
                    CustomerId      = (await _workContext.GetCurrentCustomerAsync()).Id,
                    Title           = model.AddProductReview.Title,
                    ReviewText      = model.AddProductReview.ReviewText,
                    Rating          = rating,
                    HelpfulYesTotal = 0,
                    HelpfulNoTotal  = 0,
                    IsApproved      = isApproved,
                    CreatedOnUtc    = DateTime.UtcNow,
                    StoreId         = (await _storeContext.GetCurrentStoreAsync()).Id,
                };

                await _productService.InsertProductReviewAsync(productReview);

                //add product review and review type mapping
                foreach (var additionalReview in model.AddAdditionalProductReviewList)
                {
                    var additionalProductReview = new ProductReviewReviewTypeMapping
                    {
                        ProductReviewId = productReview.Id,
                        ReviewTypeId    = additionalReview.ReviewTypeId,
                        Rating          = additionalReview.Rating
                    };

                    await _reviewTypeService.InsertProductReviewReviewTypeMappingsAsync(additionalProductReview);
                }

                //update product totals
                await _productService.UpdateProductReviewTotalsAsync(product);

                //notify store owner
                if (_catalogSettings.NotifyStoreOwnerAboutNewProductReviews)
                {
                    await _workflowMessageService.SendProductReviewNotificationMessageAsync(productReview, _localizationSettings.DefaultAdminLanguageId);
                }

                //activity log
                await _customerActivityService.InsertActivityAsync("PublicStore.AddProductReview",
                                                                   string.Format(await _localizationService.GetResourceAsync("ActivityLog.PublicStore.AddProductReview"), product.Name), product);

                //raise event
                if (productReview.IsApproved)
                {
                    await _eventPublisher.PublishAsync(new ProductReviewApprovedEvent(productReview));
                }

                model = await _productModelFactory.PrepareProductReviewsModelAsync(model, product);

                model.AddProductReview.Title      = null;
                model.AddProductReview.ReviewText = null;

                model.AddProductReview.SuccessfullyAdded = true;
                if (!isApproved)
                {
                    model.AddProductReview.Result = await _localizationService.GetResourceAsync("Reviews.SeeAfterApproving");
                }
                else
                {
                    model.AddProductReview.Result = await _localizationService.GetResourceAsync("Reviews.SuccessfullyAdded");
                }

                return(View(model));
            }

            //if we got this far, something failed, redisplay form
            model = await _productModelFactory.PrepareProductReviewsModelAsync(model, product);

            return(View(model));
        }
Esempio n. 2
0
        public virtual IActionResult ProductReviewsAdd(int productId, ProductReviewsModel model, bool captchaValid)
        {
            var product = _productService.GetProductById(productId);

            if (product == null || product.Deleted || !product.Published || !product.AllowCustomerReviews)
            {
                return(RedirectToRoute("Homepage"));
            }

            //validate CAPTCHA
            if (_captchaSettings.Enabled && _captchaSettings.ShowOnProductReviewPage && !captchaValid)
            {
                ModelState.AddModelError("", _localizationService.GetResource("Common.WrongCaptchaMessage"));
            }

            if (_workContext.CurrentCustomer.IsGuest() && !_catalogSettings.AllowAnonymousUsersToReviewProduct)
            {
                ModelState.AddModelError("", _localizationService.GetResource("Reviews.OnlyRegisteredUsersCanWriteReviews"));
            }

            if (_catalogSettings.ProductReviewPossibleOnlyAfterPurchasing)
            {
                var hasCompletedOrders = _orderService.SearchOrders(customerId: _workContext.CurrentCustomer.Id,
                                                                    productId: productId,
                                                                    osIds: new List <int> {
                    (int)OrderStatus.Complete
                },
                                                                    pageSize: 1).Any();
                if (!hasCompletedOrders)
                {
                    ModelState.AddModelError(string.Empty, _localizationService.GetResource("Reviews.ProductReviewPossibleOnlyAfterPurchasing"));
                }
            }

            if (ModelState.IsValid)
            {
                //save review
                var rating = model.AddProductReview.Rating;
                if (rating < 1 || rating > 5)
                {
                    rating = _catalogSettings.DefaultProductRatingValue;
                }
                var isApproved = !_catalogSettings.ProductReviewsMustBeApproved;

                var productReview = new ProductReview
                {
                    ProductId       = product.Id,
                    CustomerId      = _workContext.CurrentCustomer.Id,
                    Title           = model.AddProductReview.Title,
                    ReviewText      = model.AddProductReview.ReviewText,
                    Rating          = rating,
                    HelpfulYesTotal = 0,
                    HelpfulNoTotal  = 0,
                    IsApproved      = isApproved,
                    CreatedOnUtc    = DateTime.UtcNow,
                    StoreId         = _storeContext.CurrentStore.Id,
                };

                product.ProductReviews.Add(productReview);

                //add product review and review type mapping
                foreach (var additionalReview in model.AddAdditionalProductReviewList)
                {
                    var additionalProductReview = new ProductReviewReviewTypeMapping
                    {
                        ProductReviewId = productReview.Id,
                        ReviewTypeId    = additionalReview.ReviewTypeId,
                        Rating          = additionalReview.Rating
                    };
                    productReview.ProductReviewReviewTypeMappingEntries.Add(additionalProductReview);
                }

                //update product totals
                _productService.UpdateProductReviewTotals(product);

                //notify store owner
                if (_catalogSettings.NotifyStoreOwnerAboutNewProductReviews)
                {
                    _workflowMessageService.SendProductReviewNotificationMessage(productReview, _localizationSettings.DefaultAdminLanguageId);
                }

                //activity log
                _customerActivityService.InsertActivity("PublicStore.AddProductReview",
                                                        string.Format(_localizationService.GetResource("ActivityLog.PublicStore.AddProductReview"), product.Name), product);

                //raise event
                if (productReview.IsApproved)
                {
                    _eventPublisher.Publish(new ProductReviewApprovedEvent(productReview));
                }

                model = _productModelFactory.PrepareProductReviewsModel(model, product);
                model.AddProductReview.Title      = null;
                model.AddProductReview.ReviewText = null;

                model.AddProductReview.SuccessfullyAdded = true;
                if (!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
            model = _productModelFactory.PrepareProductReviewsModel(model, product);
            return(View(model));
        }
Esempio n. 3
0
 /// <summary>
 /// Inserts a product review and review type mapping
 /// </summary>
 /// <param name="productReviewReviewType">Product review and review type mapping</param>
 /// <returns>A task that represents the asynchronous operation</returns>
 public virtual async Task InsertProductReviewReviewTypeMappingsAsync(ProductReviewReviewTypeMapping productReviewReviewType)
 {
     await _productReviewReviewTypeMappingRepository.InsertAsync(productReviewReviewType);
 }
 /// <summary>
 /// Inserts a product review and review type mapping
 /// </summary>
 /// <param name="productReviewReviewType">Product review and review type mapping</param>
 public virtual void InsertProductReviewReviewTypeMappings(ProductReviewReviewTypeMapping productReviewReviewType)
 {
     _productReviewReviewTypeMappingRepository.Insert(productReviewReviewType);
 }
Esempio n. 5
0
        public IActionResult CreateProductReview([ModelBinder(typeof(JsonModelBinder <ProductReviewDto>))]
                                                 Delta <ProductReviewDto> productReviewDelta)
        {
            // Here we display the errors if the validation has failed at some point.
            if (!ModelState.IsValid)
            {
                return(Error());
            }

            // We doesn't have to check for value because this is done by the review validator.
            var customer = CustomerService.GetCustomerById(productReviewDelta.Dto.CustomerId);

            if (customer == null)
            {
                return(Error(HttpStatusCode.NotFound, "customer", "not found"));
            }

            var product = _productService.GetProductById(productReviewDelta.Dto.ProductId);

            if (product == null || product.Deleted || !product.Published || !product.AllowCustomerReviews)
            {
                return(Error(HttpStatusCode.NotFound, "product", "not found"));
            }


            if (_customerService.IsGuest(customer) && !_catalogSettings.AllowAnonymousUsersToReviewProduct)
            {
                return(Error(HttpStatusCode.BadRequest, "customer", _localizationService.GetResource("Reviews.OnlyRegisteredUsersCanWriteReviews")));
            }

            if (_catalogSettings.ProductReviewPossibleOnlyAfterPurchasing)
            {
                var hasCompletedOrders = _orderService.SearchOrders(customerId: customer.Id,
                                                                    productId: product.Id,
                                                                    osIds: new List <int> {
                    (int)OrderStatus.Complete
                },
                                                                    pageSize: 1).Any();

                if (!hasCompletedOrders)
                {
                    return(Error(HttpStatusCode.BadRequest, "error", _localizationService.GetResource("Reviews.ProductReviewPossibleOnlyAfterPurchasing")));
                }
            }

            var store = _storeService.GetStoreById(productReviewDelta.Dto.StoreId);

            //save review
            var newReview = new ProductReview()
            {
                ProductId               = product.Id,
                CustomerId              = customer.Id,
                StoreId                 = store == null ? _storeContext.CurrentStore.Id : store.Id,
                Title                   = productReviewDelta.Dto.Title,
                ReviewText              = productReviewDelta.Dto.ReviewText,
                IsApproved              = !_catalogSettings.ProductReviewsMustBeApproved,
                CreatedOnUtc            = DateTime.UtcNow,
                HelpfulNoTotal          = 0,
                HelpfulYesTotal         = 0,
                CustomerNotifiedOfReply = _catalogSettings.NotifyCustomerAboutProductReviewReply
            };

            // must be rating betweent 1 - 5 or set default rating
            var rating = productReviewDelta.Dto.Rating;

            newReview.Rating = rating < 1 || rating > 5 ?
                               _catalogSettings.DefaultProductRatingValue : rating;


            _productService.InsertProductReview(newReview);

            //add product review and review type mapping
            foreach (var additionalReview in productReviewDelta.Dto.ReviewTypeMappingsDto)
            {
                // must be rating betweent 1 - 5 or set default rating
                var reviewTypeMappingRating = additionalReview.Rating;
                reviewTypeMappingRating = reviewTypeMappingRating < 1 || reviewTypeMappingRating > 5 ?
                                          _catalogSettings.DefaultProductRatingValue : reviewTypeMappingRating;

                var reviewType = _reviewTypeService.GetReviewTypeById(additionalReview.ReviewTypeId);
                if (reviewType == null)
                {
                    // remove new Review after insert
                    _productService.DeleteProductReview(newReview);
                    return(Error(HttpStatusCode.NotFound, "review_type", "not found id = " + additionalReview.ReviewTypeId));
                }

                var additionalProductReview = new ProductReviewReviewTypeMapping
                {
                    ProductReviewId = newReview.Id,
                    ReviewTypeId    = reviewType.Id,
                    Rating          = reviewTypeMappingRating
                };

                _reviewTypeService.InsertProductReviewReviewTypeMappings(additionalProductReview);
            }

            //update product totals
            _productService.UpdateProductReviewTotals(product);

            //notify store owner
            if (_catalogSettings.NotifyStoreOwnerAboutNewProductReviews)
            {
                _workflowMessageService.SendProductReviewNotificationMessage(newReview, _localizationSettings.DefaultAdminLanguageId);
            }


            //activity log
            _customerActivityService.InsertActivity(customer, "PublicStore.AddProductReview",
                                                    string.Format(_localizationService.GetResource("ActivityLog.PublicStore.AddProductReview"), product.Name), product);

            //raise event
            if (newReview.IsApproved)
            {
                _eventPublisher.Publish(new ProductReviewApprovedEvent(newReview));
            }

            if (!newReview.IsApproved)
            {
                return(Ok(_localizationService.GetResource("Reviews.SeeAfterApproving")));
            }

            var productReviewsRootObject = new ProductReviewsRootObject();

            productReviewsRootObject.ProductReviews.Add(_dtoHelper.PrepareProductReviewDTO(newReview));


            var json = JsonFieldsSerializer.Serialize(productReviewsRootObject, string.Empty);

            return(new RawJsonActionResult(json));
        }
Esempio n. 6
0
 public static ProductReviewReviewTypeMappingsDto ToDto(this ProductReviewReviewTypeMapping productReviewReviewTypeMapping)
 {
     return(productReviewReviewTypeMapping.MapTo <ProductReviewReviewTypeMapping, ProductReviewReviewTypeMappingsDto>());
 }
Esempio n. 7
0
        public virtual dynamic StoreReviewsAdd(ProductReviewsModel model, bool captchaValid)
        {
            var product = _productService.GetProductById(1);

            if (product == null)
            {
                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 (ModelState.IsValid)
            {
                //save review
                var rating = model.AddProductReview.Rating;
                if (rating < 1 || rating > 5)
                {
                    rating = _catalogSettings.DefaultProductRatingValue;
                }
                var isApproved = !_catalogSettings.ProductReviewsMustBeApproved;

                var productReview = new ProductReview
                {
                    ProductId          = product.Id,
                    CustomerId         = _workContext.CurrentCustomer.Id,
                    Title              = model.AddProductReview.Title,
                    ReviewText         = model.AddProductReview.ReviewText,
                    Rating             = rating,
                    ConsultationRating = model.AddProductReview.ConsultationRating,
                    DeliveryRating     = model.AddProductReview.DeliveryRating,
                    InstallationRating = model.AddProductReview.InstallationRating,
                    OfflineOrderRating = model.AddProductReview.OfflineOrderRating,
                    OnlineOrderRating  = model.AddProductReview.OnlineOrderRating,
                    WillRecommend      = model.AddProductReview.WillRecommend,
                    HelpfulYesTotal    = 0,
                    HelpfulNoTotal     = 0,
                    IsApproved         = isApproved,
                    CreatedOnUtc       = DateTime.UtcNow,
                    StoreId            = _storeContext.CurrentStore.Id,
                };

                product.ProductReviews.Add(productReview);

                //add product review and review type mapping
                foreach (var additionalReview in model.AddAdditionalProductReviewList)
                {
                    var additionalProductReview = new ProductReviewReviewTypeMapping
                    {
                        ProductReviewId = productReview.Id,
                        ReviewTypeId    = additionalReview.ReviewTypeId,
                        Rating          = additionalReview.Rating
                    };
                    productReview.ProductReviewReviewTypeMappingEntries.Add(additionalProductReview);
                }

                //update product totals
                _productService.UpdateProductReviewTotals(product);

                //notify store owner
                if (_catalogSettings.NotifyStoreOwnerAboutNewProductReviews)
                {
                    _workflowMessageService.SendProductReviewNotificationMessage(productReview, _localizationSettings.DefaultAdminLanguageId);
                }

                //activity log
                _customerActivityService.InsertActivity("PublicStore.AddProductReview",
                                                        string.Format(_localizationService.GetResource("ActivityLog.PublicStore.AddProductReview"), product.Name), product);


                model = _productModelFactory.PrepareProductReviewsModel(model, product);
                model.AddProductReview.Title      = null;
                model.AddProductReview.ReviewText = null;

                model.AddProductReview.SuccessfullyAdded = true;
                if (!isApproved)
                {
                    model.AddProductReview.Result = _localizationService.GetResource("Reviews.SeeAfterApproving");
                }
                else
                {
                    model.AddProductReview.Result = _localizationService.GetResource("Reviews.SuccessfullyAdded");
                }

                return(new { success = model.AddProductReview.SuccessfullyAdded });
            }
            else
            {
                return(new { error = true, message = ModelState });
            }
        }