public double?avgRating()
 {
     if (AgentReviews.Any())
     {
         return(AgentReviews.Average(r => r.Rating));
     }
     return(null);
 }
Esempio n. 2
0
        public async Task CreateReview(AgentReviewCreateViewModel review, string reviewerId)
        {
            if (string.IsNullOrEmpty(reviewerId))
            {
                throw new ArgumentException("Не е въведен потребител, който дава ревюто!");
            }
            if (await userManager.Users.AnyAsync(u => u.Id == reviewerId))
            {
                throw new ContentNotFoundException("Не е намерен потребителят, който дава ревюто!");
            }

            if (string.IsNullOrEmpty(review.AgentId))
            {
                throw new ArgumentException("Не е въведен агентът, на който давате ревюто!");
            }


            var agent = await userManager.Users
                        .OfType <AgentUsers>()
                        .Include(a => a.Reviews)
                        .FirstOrDefaultAsync(u => u.Id == review.AgentId)
                        ?? throw new ContentNotFoundException("Не е намерен агентът, на който давате ревюто!");

            var reviewToEdit = agent.Reviews.FirstOrDefault(r => r.UserId == reviewerId);

            if (reviewToEdit == null)
            {
                if (!await userManager.IsInRoleAsync(reviewerId, ClientRole))
                {
                    throw new NotAuthorizedException("Само клиентите могат да дават оценка!");
                }
                if (!await appointmentsManager.HasPassedApprovedAppointmentWithAgent(reviewerId, agent.Id))
                {
                    throw new NotAuthorizedException("Само клиентите който имат записана среща, която е минала имат правото да дават оценка!");
                }

                reviewToEdit = new AgentReviews
                {
                    AgentId     = review.AgentId,
                    ReviewScore = review.ReviewScore,
                    ReviewText  = review.ReviewText,
                    UserId      = reviewerId
                };

                unitOfWork.ReviewsRepository.Add(reviewToEdit);
            }
            else
            {
                reviewToEdit.ReviewScore = review.ReviewScore;
                reviewToEdit.ReviewText  = review.ReviewText;

                unitOfWork.ReviewsRepository.Edit(reviewToEdit);
            }

            await unitOfWork.SaveAsync();
        }
Esempio n. 3
0
        /// <summary>
        /// Create Review if the user has made review to this entity it updates the review
        /// </summary>
        /// <param name="review"></param>
        /// <param name="userId"></param>
        /// <param name="reviewType"></param>
        /// <returns></returns>
        private async Task <Reviews> ReviewsCreateFactory(CreateReviewViewModel review, string userId, ReviewTypes reviewType)
        {
            Reviews reviewResult;
            bool    isExisting = false;

            switch (reviewType)
            {
            case ReviewTypes.Property:
                if (!await unitOfWork.PropertiesRepository.GetAll().AnyAsync(p => p.Id == (int)review.ReviewForeignKey))
                {
                    throw new ContentNotFoundException("Имотът не е намерен!");
                }
                var propertyId = (int)review.ReviewForeignKey;
                reviewResult = await unitOfWork.ReviewsRepository.GetAll()
                               .OfType <PropertyReviews>()
                               .FirstOrDefaultAsync(r => r.PropertyId == propertyId && r.UserId == userId);

                if (reviewResult != null)
                {
                    isExisting = true;
                }
                else
                {
                    reviewResult = new PropertyReviews {
                        PropertyId = propertyId
                    };
                }
                break;

            case ReviewTypes.Sight:
                if (!await unitOfWork.SightsRepository.GetAll().AnyAsync(p => p.SightId == (int)review.ReviewForeignKey))
                {
                    throw new ContentNotFoundException("Забележителността не е намерен!");
                }
                var sightId = (int)review.ReviewForeignKey;
                reviewResult = await unitOfWork.ReviewsRepository.GetAll()
                               .OfType <SightReviews>()
                               .FirstOrDefaultAsync(r => r.SightId == sightId && r.UserId == userId);

                if (reviewResult != null)
                {
                    isExisting = true;
                }
                else
                {
                    reviewResult = new SightReviews()
                    {
                        ReviewId = (int)review.ReviewForeignKey
                    };
                }
                break;

            case ReviewTypes.City:
                if (!await unitOfWork.CitiesRepository.GetAll().AnyAsync(p => p.CityId == (int)review.ReviewForeignKey))
                {
                    throw new ContentNotFoundException("Градът не е намерен!");
                }
                var cityId = (int)review.ReviewForeignKey;
                reviewResult = await unitOfWork.ReviewsRepository.GetAll()
                               .OfType <CityReviews>()
                               .FirstOrDefaultAsync(r => r.CityId == cityId && r.UserId == userId);

                if (reviewResult != null)
                {
                    isExisting = true;
                }
                else
                {
                    reviewResult = new CityReviews()
                    {
                        CityId = (int)review.ReviewForeignKey
                    };
                }
                break;

            case ReviewTypes.Owner:
                if (!await userManager.Users.AnyAsync(p => p.Id == (string)review.ReviewForeignKey))
                {
                    throw new ContentNotFoundException("Собственикът не е намерен!");
                }
                if (!await userManager.IsInRoleAsync((string)review.ReviewForeignKey, OwnerRole))
                {
                    throw new ContentNotFoundException("Потребителят не е собственик на имот!");
                }
                var ownerId = (string)review.ReviewForeignKey;
                reviewResult = await unitOfWork.ReviewsRepository.GetAll()
                               .OfType <OwnerReviews>()
                               .FirstOrDefaultAsync(r => r.OwnerId == ownerId && r.UserId == userId);

                if (reviewResult != null)
                {
                    isExisting = true;
                }
                else
                {
                    reviewResult = new OwnerReviews()
                    {
                        OwnerId = (string)review.ReviewForeignKey
                    };
                }
                break;

            case ReviewTypes.Agent:
                if (!await userManager.Users.AnyAsync(p => p.Id == (string)review.ReviewForeignKey))
                {
                    throw new ContentNotFoundException("Собственикът не е намерен!");
                }
                if (!await userManager.IsInRoleAsync((string)review.ReviewForeignKey, OwnerRole))
                {
                    throw new ContentNotFoundException("Потребителят не е собственик на имот!");
                }
                var agentId = (string)review.ReviewForeignKey;
                reviewResult = await unitOfWork.ReviewsRepository.GetAll()
                               .OfType <AgentReviews>()
                               .FirstOrDefaultAsync(r => r.AgentId == agentId && r.UserId == userId);

                if (reviewResult != null)
                {
                    isExisting = true;
                }
                else
                {
                    reviewResult = new AgentReviews()
                    {
                        AgentId = (string)review.ReviewForeignKey
                    };
                }
                break;

            default:
            {
                throw new ArgumentOutOfRangeException();
            }
            }

            reviewResult.ReviewScore = review.ReviewScore;
            reviewResult.ReviewText  = review.ReviewText;
            reviewResult.UserId      = userId;

            if (isExisting)
            {
                unitOfWork.ReviewsRepository.Edit(reviewResult);
            }
            else
            {
                unitOfWork.ReviewsRepository.Add(reviewResult);
            }

            return(reviewResult);
        }