import
This commit is contained in:
@@ -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
|
||||
}
|
||||
@@ -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 ¬ificationService{
|
||||
notificationRepo: notificationRepo,
|
||||
userService: userService,
|
||||
events: events,
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
Reference in New Issue
Block a user