Files
tp/serv_nginx/api_bb/internal/service/personal_best_service.go
T
valitovgaziz 910e6f5e49 new file: serv_nginx/api_bb/internal/repository/achievement_repository.go
modified:   serv_nginx/api_bb/internal/repository/personal_best_repository.go
	new file:   serv_nginx/api_bb/internal/service/achievement_service.go
	new file:   serv_nginx/api_bb/internal/service/personal_best_service.go
	new file:   serv_nginx/api_bb/internal/service/user_stats_service.go
add some services
2025-10-17 08:25:32 +05:00

86 lines
2.5 KiB
Go

// 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)
}