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:
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user