package service import "log/slog" // AuthUserRepository — интерфейс репозитория пользователей для AuthService. type AuthUserRepository interface { // методы, которые AuthService использует из репозитория пользователей } // AuthSessionRepository — интерфейс репозитория сессий для AuthService. type AuthSessionRepository interface { // методы, которые AuthService использует из репозитория сессий } // AuthCache — интерфейс кэша для AuthService (хранит токены). type AuthCache interface { Get(key string) (string, error) Set(key, value string) error } // AuthEventPublisher — интерфейс для публикации событий авторизации. type AuthEventPublisher interface { Publish(event string) } // AuthService — интерфейс сервиса авторизации. // Структура неэкспортируемая — создать объект можно только через NewAuthService. type AuthService interface { ValidateToken(token string) bool } // authService — сервис авторизации. type authService struct { userRepo AuthUserRepository sessionRepo AuthSessionRepository cache AuthCache events AuthEventPublisher } // NewAuthService создаёт сервис авторизации. func NewAuthService( userRepo AuthUserRepository, sessionRepo AuthSessionRepository, cache AuthCache, events AuthEventPublisher, ) AuthService { slog.Info("сервис авторизации создан") return &authService{ userRepo: userRepo, sessionRepo: sessionRepo, cache: cache, events: events, } } // ValidateToken проверяет токен авторизации. // Проверяет наличие токена в кэше — именно тут взорвётся nil, // если кэш не был правильно инициализирован (как в antipattern-broken). func (s *authService) ValidateToken(token string) bool { slog.Info("проверяем токен", "token", token) // Проверяем токен в кэше. Если cache == nil — паника. _, err := s.cache.Get(token) return err == nil }