6f77fb08b3
add update stats
92 lines
2.7 KiB
Go
92 lines
2.7 KiB
Go
// services/personal_best_service.go
|
|
package service
|
|
|
|
import (
|
|
"api_bb/internal/models"
|
|
"api_bb/internal/repository"
|
|
"fmt"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type PersonalBestService struct {
|
|
pbRepo repository.PersonalBestRepository
|
|
userStatsService UserStatsService
|
|
}
|
|
|
|
func NewPersonalBestService(pbRepo repository.PersonalBestRepository, userStatsService UserStatsService) *PersonalBestService {
|
|
return &PersonalBestService{
|
|
pbRepo: pbRepo,
|
|
userStatsService: userStatsService,
|
|
}
|
|
}
|
|
|
|
// CreatePersonalBest создает новый личный рекорд
|
|
func (s *PersonalBestService) CreatePersonalBest(userID uint, req models.PersonalBestCreateRequest) (*models.PersonalBest, error) {
|
|
// Вычисляем темп, если не предоставлен
|
|
pace := req.Pace
|
|
if pace == "" {
|
|
calculatedPace, err := s.pbRepo.CalculatePace(req.Time, req.DistanceType)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
pace = calculatedPace
|
|
}
|
|
|
|
// Проверяем, является ли это личным рекордом
|
|
isBest, err := s.pbRepo.ExistsBetterTime(userID, req.DistanceType, req.Time)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
personalBest := &models.PersonalBest{
|
|
UserID: userID,
|
|
DistanceType: req.DistanceType,
|
|
Time: req.Time,
|
|
Pace: pace,
|
|
Date: req.Date,
|
|
EventName: req.EventName,
|
|
Location: req.Location,
|
|
Verified: false, // По умолчанию не подтвержден
|
|
}
|
|
|
|
if err := s.pbRepo.Create(personalBest); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if !isBest {
|
|
if err := s.userStatsService.UpdatePersonalBest(userID, string(req.DistanceType), req.Time); err != nil {
|
|
// Логируем ошибку, но не прерываем выполнение
|
|
fmt.Printf("Failed to update user stats: %v\n", err)
|
|
}
|
|
}
|
|
|
|
return personalBest, nil
|
|
}
|
|
|
|
// GetUserPersonalBests возвращает все личные рекорды пользователя
|
|
func (s *PersonalBestService) GetUserPersonalBests(userID uint) ([]models.PersonalBest, error) {
|
|
return s.pbRepo.GetByUserID(userID)
|
|
}
|
|
|
|
// GetPersonalBestsSummary возвращает сводку лучших результатов
|
|
func (s *PersonalBestService) GetPersonalBestsSummary(userID uint) (*models.PersonalBestsSummary, error) {
|
|
return s.pbRepo.GetPersonalBestsSummary(userID)
|
|
}
|
|
|
|
// VerifyPersonalBest подтверждает личный рекорд
|
|
func (s *PersonalBestService) VerifyPersonalBest(id uint, userID uint) error {
|
|
pb, err := s.pbRepo.GetByID(id)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// Проверяем, что рекорд принадлежит пользователю
|
|
if pb.UserID != userID {
|
|
return gorm.ErrRecordNotFound
|
|
}
|
|
|
|
pb.Verified = true
|
|
return s.pbRepo.Update(pb)
|
|
}
|