modified: serv_nginx/api_bb/Makefile

modified:   serv_nginx/api_bb/internal/repository/review_repository.go
change or fix repo getStats function or method
This commit is contained in:
2025-10-15 05:12:37 +05:00
parent a200099f79
commit 6c9bff1c91
2 changed files with 37 additions and 31 deletions
+1 -1
View File
@@ -8,5 +8,5 @@ stop_bb:
build_bb: build_bb:
docker compose build api_bb --no-cache docker compose build api_bb --no-cache
run_bb: build bb: stop_bb build_bb
docker compose up api_bb -d docker compose up api_bb -d
@@ -3,6 +3,7 @@ package repository
import ( import (
"api_bb/internal/models" "api_bb/internal/models"
"database/sql"
"math" "math"
"gorm.io/gorm" "gorm.io/gorm"
@@ -89,41 +90,46 @@ func (r *reviewRepository) Delete(id uint) error {
} }
func (r *reviewRepository) GetStats() (*models.ReviewsStatsResponse, error) { func (r *reviewRepository) GetStats() (*models.ReviewsStatsResponse, error) {
var stats models.ReviewsStatsResponse var totalReviews int64
var averageRating float64
var successStories int64
// Один запрос для всей основной статистики // Общее количество отзывов
query := ` if err := r.db.Model(&models.Review{}).Count(&totalReviews).Error; err != nil {
SELECT return nil, err
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"` var nullRating sql.NullFloat64
AverageRating float64 `gorm:"column:average_rating"` if err := r.db.Model(&models.Review{}).Select("AVG(rating)").Row().Scan(&nullRating); err != nil {
SuccessStories int `gorm:"column:success_stories"` return nil, err
} }
if nullRating.Valid {
averageRating = nullRating.Float64
} else {
averageRating = 0
}
var result StatsResult // Количество успешных историй (отзывы с рейтингом >= 4 и достижениями)
if err := r.db.Raw(query).Scan(&result).Error; err != nil { if err := r.db.Model(&models.Review{}).
return nil, err Where("rating >= ? AND achievement != ?", 4, "").
} Count(&successStories).Error; err != nil {
return nil, err
}
stats.TotalReviews = result.TotalReviews // Распределение по рейтингам
stats.AverageRating = math.Round(result.AverageRating*100) / 100 // Округляем до 2 знаков ratingDistribution, err := r.GetRatingDistribution()
stats.SuccessStories = result.SuccessStories if err != nil {
return nil, err
}
// Распределение по рейтингам (оставляем ваш существующий метод) return &models.ReviewsStatsResponse{
ratingDistribution, err := r.GetRatingDistribution() TotalReviews: int(totalReviews),
if err != nil { AverageRating: math.Round(averageRating*100) / 100, // Округляем до 2 знаков
return nil, err SuccessStories: int(successStories),
} RatingDistribution: ratingDistribution,
stats.RatingDistribution = ratingDistribution }, nil
return &stats, nil
} }
func (r *reviewRepository) GetRatingDistribution() (map[int]int, error) { func (r *reviewRepository) GetRatingDistribution() (map[int]int, error) {