From 6c9bff1c912d625c91ce22136e620f57cfe991b4 Mon Sep 17 00:00:00 2001 From: valitovgaziz Date: Wed, 15 Oct 2025 05:12:37 +0500 Subject: [PATCH] modified: serv_nginx/api_bb/Makefile modified: serv_nginx/api_bb/internal/repository/review_repository.go change or fix repo getStats function or method --- serv_nginx/api_bb/Makefile | 2 +- .../internal/repository/review_repository.go | 66 ++++++++++--------- 2 files changed, 37 insertions(+), 31 deletions(-) diff --git a/serv_nginx/api_bb/Makefile b/serv_nginx/api_bb/Makefile index 5d4e714..cdc6ff0 100644 --- a/serv_nginx/api_bb/Makefile +++ b/serv_nginx/api_bb/Makefile @@ -8,5 +8,5 @@ stop_bb: build_bb: docker compose build api_bb --no-cache -run_bb: build +bb: stop_bb build_bb docker compose up api_bb -d \ No newline at end of file diff --git a/serv_nginx/api_bb/internal/repository/review_repository.go b/serv_nginx/api_bb/internal/repository/review_repository.go index 7abf7c2..4f44745 100644 --- a/serv_nginx/api_bb/internal/repository/review_repository.go +++ b/serv_nginx/api_bb/internal/repository/review_repository.go @@ -3,6 +3,7 @@ package repository import ( "api_bb/internal/models" + "database/sql" "math" "gorm.io/gorm" @@ -89,41 +90,46 @@ func (r *reviewRepository) Delete(id uint) error { } func (r *reviewRepository) GetStats() (*models.ReviewsStatsResponse, error) { - var stats models.ReviewsStatsResponse + var totalReviews int64 + var averageRating float64 + var successStories int64 - // Один запрос для всей основной статистики - 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 - ` + // Общее количество отзывов + if err := r.db.Model(&models.Review{}).Count(&totalReviews).Error; err != nil { + return nil, err + } - type StatsResult struct { - TotalReviews int `gorm:"column:total_reviews"` - AverageRating float64 `gorm:"column:average_rating"` - SuccessStories int `gorm:"column:success_stories"` - } + // Средний рейтинг - ИСПРАВЛЕННАЯ ЧАСТЬ + var nullRating sql.NullFloat64 + if err := r.db.Model(&models.Review{}).Select("AVG(rating)").Row().Scan(&nullRating); err != nil { + return nil, err + } + + if nullRating.Valid { + averageRating = nullRating.Float64 + } else { + averageRating = 0 + } - var result StatsResult - if err := r.db.Raw(query).Scan(&result).Error; err != nil { - return nil, err - } + // Количество успешных историй (отзывы с рейтингом >= 4 и достижениями) + if err := r.db.Model(&models.Review{}). + 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 знаков - stats.SuccessStories = result.SuccessStories + // Распределение по рейтингам + ratingDistribution, err := r.GetRatingDistribution() + if err != nil { + return nil, err + } - // Распределение по рейтингам (оставляем ваш существующий метод) - ratingDistribution, err := r.GetRatingDistribution() - if err != nil { - return nil, err - } - stats.RatingDistribution = ratingDistribution - - return &stats, nil + return &models.ReviewsStatsResponse{ + TotalReviews: int(totalReviews), + AverageRating: math.Round(averageRating*100) / 100, // Округляем до 2 знаков + SuccessStories: int(successStories), + RatingDistribution: ratingDistribution, + }, nil } func (r *reviewRepository) GetRatingDistribution() (map[int]int, error) {