// services/personal_best_service.go package service import ( "api_bb/internal/models" "api_bb/internal/repository" "gorm.io/gorm" ) type PersonalBestService struct { pbRepo repository.PersonalBestRepository } func NewPersonalBestService(pbRepo repository.PersonalBestRepository) *PersonalBestService { return &PersonalBestService{ pbRepo: pbRepo, } } // 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 { // Здесь можно вызвать метод для обновления UserStats } 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) }