소스 검색

refactor: handlers на интерфейсах вместо конкретных типов

- handlers/interfaces.go: PlaceService, AuthService, UserRepo
- PlaceHandler, SetupHandler, AuthHandler, UserHandler — через интерфейсы
- WSHub: удалён неиспользуемый authSvc
- main.go: обновлён вызов NewWSHub (без authSvc)
neyrogovnarik 1 개월 전
부모
커밋
9cb2c7d7ab

+ 1 - 1
backend/cmd/api/main.go

@@ -100,7 +100,7 @@ func main() {
 	reviewHandler := handlers.NewReviewHandler(reviewRepo)
 	bookingHandler := handlers.NewBookingHandler(bookingRepo)
 	tagHandler := handlers.NewTagHandler(tagRepo, featureRepo)
-	wsHub := handlers.NewWSHub(cfg.AllowedOrigins, cfg.AppEnv == "production", authSvc)
+	wsHub := handlers.NewWSHub(cfg.AllowedOrigins, cfg.AppEnv == "production")
 	go wsHub.Run()
 	setupHandler := handlers.NewSetupHandler(userRepo, authSvc, cfg.AppEnv)
 

+ 2 - 2
backend/internal/handlers/auth.go

@@ -12,11 +12,11 @@ import (
 )
 
 type AuthHandler struct {
-	authSvc  *services.AuthService
+	authSvc  AuthService
 	isProd   bool
 }
 
-func NewAuthHandler(authSvc *services.AuthService, appEnv string) *AuthHandler {
+func NewAuthHandler(authSvc AuthService, appEnv string) *AuthHandler {
 	return &AuthHandler{
 		authSvc: authSvc,
 		isProd:  appEnv == "production",

+ 40 - 0
backend/internal/handlers/interfaces.go

@@ -0,0 +1,40 @@
+package handlers
+
+import (
+	"context"
+
+	"gogs.fxtmmsk.ru/foxtime/photoplaces/backend/internal/models"
+	"gogs.fxtmmsk.ru/foxtime/photoplaces/backend/internal/services"
+)
+
+type PlaceService interface {
+	List(ctx context.Context, filter models.PlaceFilter) (*models.PaginatedPlaces, error)
+	GetByID(ctx context.Context, id string, fetchTags bool) (*models.Place, error)
+	Create(ctx context.Context, input services.CreatePlaceInput) (*models.Place, error)
+	Update(ctx context.Context, input services.UpdatePlaceInput, isModerator bool) (*models.Place, error)
+	Delete(ctx context.Context, id, userID string) error
+	Moderate(ctx context.Context, id, action, comment, moderatorID string) error
+	HardDelete(ctx context.Context, id, moderatorID string) error
+	Restore(ctx context.Context, id, moderatorID string) error
+}
+
+type AuthService interface {
+	Register(ctx context.Context, input services.RegisterInput) (*services.AuthResult, string, error)
+	Login(ctx context.Context, input services.LoginInput) (*services.AuthResult, string, error)
+	RefreshSession(ctx context.Context, plainRefreshToken string) (*services.AuthResult, string, error)
+	RevokeSession(ctx context.Context, plainRefreshToken string) error
+	GetUser(ctx context.Context, userID string) (*models.User, error)
+	ValidateAccessToken(tokenString string) (*services.TokenClaims, error)
+}
+
+type UserRepo interface {
+	GetByID(ctx context.Context, id string) (*models.User, error)
+	GetByEmail(ctx context.Context, email string) (*models.User, error)
+	Create(ctx context.Context, user *models.User) error
+	Update(ctx context.Context, user *models.User) error
+	UpdateRole(ctx context.Context, id, role string) error
+	UpdateStatus(ctx context.Context, id, status string) error
+	HasSuperadmin(ctx context.Context) (bool, error)
+	CountByRole(ctx context.Context, role string) (int, error)
+	List(ctx context.Context, filter models.UserFilter) ([]*models.User, error)
+}

+ 3 - 3
backend/internal/handlers/places.go

@@ -17,11 +17,11 @@ import (
 )
 
 type PlaceHandler struct {
-	placeSvc *services.PlaceService
-	authSvc  *services.AuthService
+	placeSvc PlaceService
+	authSvc  AuthService
 }
 
-func NewPlaceHandler(placeSvc *services.PlaceService, authSvc *services.AuthService) *PlaceHandler {
+func NewPlaceHandler(placeSvc PlaceService, authSvc AuthService) *PlaceHandler {
 	return &PlaceHandler{placeSvc: placeSvc, authSvc: authSvc}
 }
 

+ 3 - 4
backend/internal/handlers/setup.go

@@ -5,18 +5,17 @@ import (
 	"errors"
 	"net/http"
 
-	"gogs.fxtmmsk.ru/foxtime/photoplaces/backend/internal/repository"
 	"gogs.fxtmmsk.ru/foxtime/photoplaces/backend/internal/services"
 	"gogs.fxtmmsk.ru/foxtime/photoplaces/backend/internal/validator"
 )
 
 type SetupHandler struct {
-	userRepo *repository.UserRepo
-	authSvc  *services.AuthService
+	userRepo UserRepo
+	authSvc  AuthService
 	isProd   bool
 }
 
-func NewSetupHandler(userRepo *repository.UserRepo, authSvc *services.AuthService, appEnv string) *SetupHandler {
+func NewSetupHandler(userRepo UserRepo, authSvc AuthService, appEnv string) *SetupHandler {
 	return &SetupHandler{
 		userRepo: userRepo,
 		authSvc:  authSvc,

+ 2 - 3
backend/internal/handlers/users.go

@@ -10,15 +10,14 @@ import (
 	"golang.org/x/crypto/bcrypt"
 	"gogs.fxtmmsk.ru/foxtime/photoplaces/backend/internal/middleware"
 	"gogs.fxtmmsk.ru/foxtime/photoplaces/backend/internal/models"
-	"gogs.fxtmmsk.ru/foxtime/photoplaces/backend/internal/repository"
 	"gogs.fxtmmsk.ru/foxtime/photoplaces/backend/internal/validator"
 )
 
 type UserHandler struct {
-	userRepo *repository.UserRepo
+	userRepo UserRepo
 }
 
-func NewUserHandler(userRepo *repository.UserRepo) *UserHandler {
+func NewUserHandler(userRepo UserRepo) *UserHandler {
 	return &UserHandler{userRepo: userRepo}
 }
 

+ 1 - 4
backend/internal/handlers/websocket.go

@@ -10,7 +10,6 @@ import (
 	"golang.org/x/time/rate"
 
 	"gogs.fxtmmsk.ru/foxtime/photoplaces/backend/internal/middleware"
-	"gogs.fxtmmsk.ru/foxtime/photoplaces/backend/internal/services"
 )
 
 type VisitorDot struct {
@@ -33,11 +32,10 @@ type WSHub struct {
 	broadcast      chan []byte
 	allowedOrigins []string
 	isProd         bool
-	authSvc        *services.AuthService
 	connLimiter    *rate.Limiter
 }
 
-func NewWSHub(allowedOrigins []string, isProd bool, authSvc *services.AuthService) *WSHub {
+func NewWSHub(allowedOrigins []string, isProd bool) *WSHub {
 	return &WSHub{
 		clients:        make(map[*Client]bool),
 		register:       make(chan *Client),
@@ -45,7 +43,6 @@ func NewWSHub(allowedOrigins []string, isProd bool, authSvc *services.AuthServic
 		broadcast:      make(chan []byte, 256),
 		allowedOrigins: allowedOrigins,
 		isProd:         isProd,
-		authSvc:        authSvc,
 		connLimiter:    rate.NewLimiter(maxWSConnections, maxWSConnections),
 	}
 }