modified: begushiybashkir/bbvue/src/views/Reviews.vue
modified: serv_nginx/api_bb/internal/repository/review_repository.go fix null pointer execption in getStats repo function=method
This commit is contained in:
@@ -3,7 +3,8 @@ package repository
|
||||
|
||||
import (
|
||||
"api_bb/internal/models"
|
||||
|
||||
"math"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
@@ -88,39 +89,41 @@ func (r *reviewRepository) Delete(id uint) error {
|
||||
}
|
||||
|
||||
func (r *reviewRepository) GetStats() (*models.ReviewsStatsResponse, error) {
|
||||
var totalReviews int64
|
||||
var averageRating float64
|
||||
var successStories int64
|
||||
var stats models.ReviewsStatsResponse
|
||||
|
||||
// Общее количество отзывов
|
||||
if err := r.db.Model(&models.Review{}).Count(&totalReviews).Error; err != nil {
|
||||
// Один запрос для всей основной статистики
|
||||
query := `
|
||||
SELECT
|
||||
COUNT(*) as total_reviews,
|
||||
COALESCE(AVG(rating), 0) as average_rating,
|
||||
COUNT(CASE WHEN rating >= 4 AND achievement != '' THEN 1 END) as success_stories
|
||||
FROM reviews
|
||||
WHERE deleted_at IS NULL
|
||||
`
|
||||
|
||||
type StatsResult struct {
|
||||
TotalReviews int `gorm:"column:total_reviews"`
|
||||
AverageRating float64 `gorm:"column:average_rating"`
|
||||
SuccessStories int `gorm:"column:success_stories"`
|
||||
}
|
||||
|
||||
var result StatsResult
|
||||
if err := r.db.Raw(query).Scan(&result).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Средний рейтинг
|
||||
if err := r.db.Model(&models.Review{}).Select("AVG(rating)").Row().Scan(&averageRating); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
stats.TotalReviews = result.TotalReviews
|
||||
stats.AverageRating = math.Round(result.AverageRating*100) / 100 // Округляем до 2 знаков
|
||||
stats.SuccessStories = result.SuccessStories
|
||||
|
||||
// Количество успешных историй (отзывы с рейтингом >= 4 и достижениями)
|
||||
if err := r.db.Model(&models.Review{}).
|
||||
Where("rating >= ? AND achievement != ?", 4, "").
|
||||
Count(&successStories).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Распределение по рейтингам
|
||||
// Распределение по рейтингам (оставляем ваш существующий метод)
|
||||
ratingDistribution, err := r.GetRatingDistribution()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
stats.RatingDistribution = ratingDistribution
|
||||
|
||||
return &models.ReviewsStatsResponse{
|
||||
TotalReviews: int(totalReviews),
|
||||
AverageRating: averageRating,
|
||||
SuccessStories: int(successStories),
|
||||
RatingDistribution: ratingDistribution,
|
||||
}, nil
|
||||
return &stats, nil
|
||||
}
|
||||
|
||||
func (r *reviewRepository) GetRatingDistribution() (map[int]int, error) {
|
||||
@@ -152,4 +155,4 @@ func (r *reviewRepository) GetRatingDistribution() (map[int]int, error) {
|
||||
}
|
||||
|
||||
return distribution, nil
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user