public AveragePropertyRating[] GetAveragePropertyRatings(string productId)
        {
            using (ICustomerReviewRepository repository = _repositoryFactory())
            {
                var favoriteProperties = GetProductFavoriteProperties(productId);
                if (!favoriteProperties.Any())
                {
                    return(new AveragePropertyRating[0]);
                }

                var reviews = repository.CustomerReviews.Where(r => r.ProductId == productId && r.IsActive).ToArray();
                var ratings = new List <AveragePropertyRating>();
                foreach (FavoriteProperty property in favoriteProperties)
                {
                    var rating = AbstractTypeFactory <AveragePropertyRating> .TryCreateInstance();

                    rating.FavoriteProperty = property;

                    var values = reviews.SelectMany(x => x.PropertyValues.Where(v => v.PropertyId == property.Id));
                    if (values.Any())
                    {
                        rating.Rating = values.Average(x => x.Rating);
                    }

                    ratings.Add(rating);
                }

                return(ratings.ToArray());
            }
        }
        private void CalculateRating(ICustomerReviewRepository customerReviewRepository, CustomerReviewEntity review)
        {
            var reviews = customerReviewRepository
                          .CustomerReviews
                          .Where(r => r.ProductId == review.ProductId && r.Id != review.Id)
                          .ToList();

            reviews.Add(review);

            var productRatingValue = RateCalculationUtil.CalculateProductRating(reviews);

            using (var productRatingRepository = _productRatingRepositoryFactory())
                using (var changeTracker = GetChangeTracker(productRatingRepository))
                {
                    var productRating = productRatingRepository.GetProductRatingByProductId(review.ProductId);

                    if (productRating == null)
                    {
                        productRating = AbstractTypeFactory <ProductRatingEntity> .TryCreateInstance();

                        productRating.ProductId = review.ProductId;
                        productRating.Rating    = productRatingValue;
                        productRatingRepository.Add(productRating);
                    }
                    else
                    {
                        changeTracker.Attach(productRating);
                        productRating.Rating = productRatingValue;
                    }

                    CommitChanges(productRatingRepository);
                }
        }
Example #3
0
 public CustomerReviewService(
     ICustomerReviewRepository customerReviewRepository,
     ICurrentUserProvider currentUserProvider,
     IMapper mapper)
     : base(customerReviewRepository, mapper)
 {
     _currentUserProvider = currentUserProvider;
 }
 public void DeleteCustomerReviews(string[] ids)
 {
     using (ICustomerReviewRepository repository = _repositoryFactory())
     {
         repository.DeleteCustomerReviews(ids);
         CommitChanges(repository);
     }
 }
 public CustomerReview GetById(string id)
 {
     using (ICustomerReviewRepository repository = _repositoryFactory())
     {
         CustomerReviewEntity entity = repository.GetCustomerReview(id);
         return(entity.ToModel(AbstractTypeFactory <CustomerReview> .TryCreateInstance()));
     }
 }
 public FavoriteProperty[] GetProductFavoriteProperties(string productId)
 {
     using (ICustomerReviewRepository repository = _repositoryFactory())
     {
         return(repository.GetProductFavoriteProperties(productId).
                Select(x => x.ToModel(AbstractTypeFactory <FavoriteProperty> .TryCreateInstance())).
                ToArray());
     }
 }
 public CustomerReview[] GetByIds(string[] ids)
 {
     using (ICustomerReviewRepository repository = _repositoryFactory())
     {
         return(repository.
                GetByIds(ids).
                Select(x => x.ToModel(AbstractTypeFactory <CustomerReview> .TryCreateInstance())).
                ToArray());
     }
 }
Example #8
0
        public GenericSearchResult <CustomerReview> SearchCustomerReviews(CustomerReviewSearchCriteria criteria)
        {
            if (criteria == null)
            {
                throw new ArgumentNullException($"{ nameof(criteria) } must be set");
            }

            var retVal = new GenericSearchResult <CustomerReview>();

            using (ICustomerReviewRepository repository = _repositoryFactory())
            {
                IQueryable <CustomerReviewEntity> query = repository.CustomerReviews;

                if (!criteria.ProductIds.IsNullOrEmpty())
                {
                    query = query.Where(x => criteria.ProductIds.Contains(x.ProductId));
                }

                if (criteria.IsActive.HasValue)
                {
                    query = query.Where(x => x.IsActive == criteria.IsActive);
                }

                if (!criteria.SearchPhrase.IsNullOrEmpty())
                {
                    query = query.Where(x => x.Content.Contains(criteria.SearchPhrase));
                }

                SortInfo[] sortInfos = criteria.SortInfos;
                if (sortInfos.IsNullOrEmpty())
                {
                    sortInfos = new[] { new SortInfo {
                                            SortColumn = "CreatedDate", SortDirection = SortDirection.Descending
                                        } };
                }
                query = query.OrderBySortInfos(sortInfos);

                retVal.TotalCount = query.Count();

                List <string> customerReviewIds = query.Skip(criteria.Skip)
                                                  .Take(criteria.Take)
                                                  .Select(x => x.Id)
                                                  .ToList();

                retVal.Results = _customerReviewService.GetByIds(customerReviewIds.ToArray())
                                 .OrderBy(x => customerReviewIds.IndexOf(x.Id)).ToList();
                return(retVal);
            }
        }
Example #9
0
        public void UpdateCustomerReviewVotesCount(ICustomerReviewRepository repository, string[] reviewIds)
        {
            if (repository == null)
            {
                throw new ArgumentNullException(nameof(repository));
            }
            var query = repository.GetReviewByIds(reviewIds);

            foreach (var item in query)
            {
                item.HelpfullVotesCount = item.CustomerReviewVotes.Count(x => (x.ReviewRate == VoteRate.Helpfull) && (x.CustomerReviewId == item.Id));
                item.UselessVotesCount  = item.CustomerReviewVotes.Count(x => (x.ReviewRate == VoteRate.Useless) && (x.CustomerReviewId == item.Id));
                item.TotalVotesCount    = item.CustomerReviewVotes.Count(x => x.CustomerReviewId == item.Id);
            }
        }
        public void SaveCustomerReview(CustomerReview item)
        {
            if (item == null)
            {
                throw new ArgumentNullException(nameof(item));
            }

            var pkMap = new PrimaryKeyResolvingMap();

            using (ICustomerReviewRepository repository = _repositoryFactory())
            {
                using (ObservableChangeTracker changeTracker = GetChangeTracker(repository))
                {
                    if (!item.IsTransient())
                    {
                        var sourceEntity = AbstractTypeFactory <CustomerReviewEntity> .TryCreateInstance().FromModel(item, pkMap);

                        var existsEntity = repository.GetCustomerReview(item.Id);
                        if (existsEntity != null)
                        {
                            changeTracker.Attach(existsEntity);
                            sourceEntity.Patch(existsEntity);
                        }
                        else
                        {
                            repository.Add(sourceEntity);
                        }
                    }
                    else
                    {
                        item.Id = Guid.NewGuid().ToString("N");
                        foreach (var value in item.PropertyValues)
                        {
                            value.ReviewId = item.Id;
                        }

                        var sourceEntity = AbstractTypeFactory <CustomerReviewEntity> .TryCreateInstance().FromModel(item, pkMap);

                        repository.Add(sourceEntity);
                    }

                    CommitChanges(repository);
                    pkMap.ResolvePrimaryKeys();
                }
            }
        }
        public AverageProductRating GetAverageProductRating(string productId)
        {
            using (ICustomerReviewRepository repository = _repositoryFactory())
            {
                var reviews = repository.CustomerReviews.Where(x => x.ProductId == productId && x.IsActive).ToArray();
                var result  = AbstractTypeFactory <AverageProductRating> .TryCreateInstance();

                result.ProductId = productId;
                if (!reviews.Any())
                {
                    return(result);
                }

                result.Rating       = reviews.Average(x => x.ProductRating);
                result.ReviewsCount = reviews.Length;
                return(result);
            }
        }
        protected virtual IQueryable <CustomerReviewEntity> BuildQuery(ICustomerReviewRepository repository, CustomerReviewSearchCriteria criteria)
        {
            var query = repository.CustomerReviews;

            if (!criteria.ProductIds.IsNullOrEmpty())
            {
                query = query.Where(x => criteria.ProductIds.Contains(x.ProductId));
            }

            if (criteria.IsActive.HasValue)
            {
                query = query.Where(x => x.IsActive == criteria.IsActive);
            }

            if (!criteria.SearchPhrase.IsNullOrEmpty())
            {
                query = query.Where(x => x.ReviewContent.Contains(criteria.SearchPhrase));
            }

            return(query);
        }
        private static IQueryable <CustomerReviewEntity> BuildCustomerReviewsQuery(
            ICustomerReviewRepository repository,
            CustomerReviewSearchCriteria criteria)
        {
            var query = repository.CustomerReviews;

            if (!criteria.ProductIds.IsNullOrEmpty())
            {
                query = query.Where(entity => criteria.ProductIds.Contains(entity.ProductId));
            }

            if (criteria.IsActive.HasValue)
            {
                query = query.Where(entity => entity.IsActive == criteria.IsActive);
            }

            if (!criteria.SearchPhrase.IsNullOrEmpty())
            {
                query = query.Where(entity => entity.Content.Contains(criteria.SearchPhrase));
            }

            return(query.OrderBySortInfos(CreateSortInfo(criteria)));
        }