public double?avgRating() { if (AgentReviews.Any()) { return(AgentReviews.Average(r => r.Rating)); } return(null); }
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(); }
/// <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); }