// service/auth_service.go package service import ( "errors" "fmt" "time" "api_bb/internal/models" "api_bb/internal/repository" ) type AuthService interface { Register(user *models.User) error Login(email, password string) (*models.User, string, error) GetUserProfile(userID uint) (*models.User, error) UpdateProfile(user *models.User) error } type authService struct { userRepo repository.UserRepository jwtService JWTService } func NewAuthService(userRepo repository.UserRepository, jwtService JWTService) AuthService { return &authService{ userRepo: userRepo, jwtService: jwtService, } } func (s *authService) UpdateProfile(user *models.User) error { // Находим существующего пользователя через репозиторий existingUser, err := s.userRepo.FindByID(user.ID) if err != nil { return fmt.Errorf("user not found") } // Создаем карту для обновления только разрешенных полей updateData := &models.User{ ID: existingUser.ID, // Важно сохранить ID FirstName: user.FirstName, LastName: user.LastName, Phone: user.Phone, Experience: user.Experience, Goals: user.Goals, Newsletter: user.Newsletter, UpdatedAt: time.Now(), // Не обновляем: Email, Password, Role, CreatedAt } // Сохраняем обновленные данные через репозиторий if err := s.userRepo.Update(updateData); err != nil { return err } // Копируем обновленные данные обратно в переданный объект user.Email = existingUser.Email user.Password = existingUser.Password user.Role = existingUser.Role user.CreatedAt = existingUser.CreatedAt user.UpdatedAt = updateData.UpdatedAt return nil } func (s *authService) Register(user *models.User) error { // Проверяем, существует ли пользователь existingUser, err := s.userRepo.FindByEmail(user.Email) if err == nil && existingUser != nil { return errors.New("user with this email already exists") } // Хешируем пароль if err := user.HashPassword(); err != nil { return err } return s.userRepo.Create(user) } func (s *authService) Login(email, password string) (*models.User, string, error) { user, err := s.userRepo.FindByEmail(email) if err != nil { return nil, "", errors.New("invalid email or password") } if !user.CheckPassword(password) { return nil, "", errors.New("invalid email or password") } token, err := s.jwtService.GenerateToken(user.ID, user.Email) if err != nil { return nil, "", err } return user, token, nil } func (s *authService) GetUserProfile(userID uint) (*models.User, error) { return s.userRepo.FindByID(userID) }