This commit is contained in:
2026-04-13 08:14:09 +03:00
commit 0449337ae7
39 changed files with 2726 additions and 0 deletions
+66
View File
@@ -0,0 +1,66 @@
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
}
+43
View File
@@ -0,0 +1,43 @@
package service
import "log/slog"
// NotificationRepository — интерфейс репозитория уведомлений для NotificationService.
type NotificationRepository interface {
// методы, которые NotificationService использует из репозитория уведомлений
}
// NotificationUserService — интерфейс сервиса пользователей для NotificationService.
type NotificationUserService interface {
// методы, которые NotificationService использует из сервиса пользователей
}
// NotificationEventSubscriber — интерфейс для подписки на события.
type NotificationEventSubscriber interface {
Subscribe(event string, handler func())
}
// NotificationService — интерфейс сервиса уведомлений.
// Структура неэкспортируемая — создать объект можно только через NewNotificationService.
type NotificationService interface{}
// notificationService — сервис уведомлений.
type notificationService struct {
notificationRepo NotificationRepository
userService NotificationUserService
events NotificationEventSubscriber
}
// NewNotificationService создаёт сервис уведомлений.
func NewNotificationService(
notificationRepo NotificationRepository,
userService NotificationUserService,
events NotificationEventSubscriber,
) NotificationService {
slog.Info("сервис уведомлений создан")
return &notificationService{
notificationRepo: notificationRepo,
userService: userService,
events: events,
}
}
+52
View File
@@ -0,0 +1,52 @@
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"
}