package service import "log/slog" // UserRepository — интерфейс репозитория пользователей для UserService. type UserRepository interface { // методы, которые UserService использует из репозитория пользователей } // UserAuthService — интерфейс сервиса авторизации для UserService. type UserAuthService interface { ValidateToken(token string) bool } // UserEventPublisher — интерфейс для публикации событий пользователей. type UserEventPublisher interface { Publish(event string) } // UserService — интерфейс сервиса пользователей. // Структура неэкспортируемая — создать объект можно только через NewUserService. type UserService interface { GetProfile(token string) string } // userService — сервис пользователей. type userService struct { userRepo UserRepository authService UserAuthService events UserEventPublisher } // NewUserService создаёт сервис пользователей. func NewUserService(userRepo UserRepository, authService UserAuthService, events UserEventPublisher) UserService { slog.Info("сервис пользователей создан") return &userService{ userRepo: userRepo, authService: authService, events: events, } } // GetProfile возвращает профиль текущего пользователя. // Сначала проверяет токен через authService — и именно тут взорвётся nil, // если authService не был правильно инициализирован. func (s *userService) GetProfile(token string) string { if !s.authService.ValidateToken(token) { return "unauthorized" } return "user profile data" }