v0.0.18.8 добавлен отдельный эндпоинт /ws
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
madipo2611 2025-08-18 17:19:46 +03:00
parent 611848a8f7
commit 57fb995718

View File

@ -17,6 +17,7 @@ import (
"tailly_back_v2/internal/http/middleware" "tailly_back_v2/internal/http/middleware"
"tailly_back_v2/internal/service" "tailly_back_v2/internal/service"
"tailly_back_v2/pkg/auth" "tailly_back_v2/pkg/auth"
"time"
) )
type Server struct { type Server struct {
@ -64,16 +65,14 @@ func (s *Server) configureRouter() {
s.router.Use(middleware.MetricsMiddleware) s.router.Use(middleware.MetricsMiddleware)
s.router.Use(middleware.CORS(allowedOrigins)) s.router.Use(middleware.CORS(allowedOrigins))
s.router.Use(middleware.WSAuthMiddleware(s.tokenAuth)) // Основной GraphQL обработчик
s.router.Use(middleware.AuthMiddleware(s.tokenAuth))
resolver := graph.NewResolver(s.services, s.db, s.services.Messages) resolver := graph.NewResolver(s.services, s.db, s.services.Messages)
srv := handler.NewDefaultServer(graph.NewExecutableSchema(graph.Config{ srv := handler.NewDefaultServer(graph.NewExecutableSchema(graph.Config{
Resolvers: resolver, Resolvers: resolver,
})) }))
wsTransport := transport.Websocket{ // Настройка WebSocket транспорта
Upgrader: websocket.Upgrader{ wsUpgrader := websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool { CheckOrigin: func(r *http.Request) bool {
origin := r.Header.Get("Origin") origin := r.Header.Get("Origin")
for _, allowed := range allowedOrigins { for _, allowed := range allowedOrigins {
@ -83,13 +82,23 @@ func (s *Server) configureRouter() {
} }
return false return false
}, },
},
} }
srv.AddTransport(&wsTransport) srv.AddTransport(&transport.Websocket{
Upgrader: wsUpgrader,
KeepAlivePingInterval: 15 * time.Second,
})
// Раздельные эндпоинты:
// 1. Обычные HTTP GraphQL запросы (только POST)
s.router.With(middleware.AuthMiddleware(s.tokenAuth)).Post("/query", srv.ServeHTTP)
// 2. WebSocket подписки (отдельный эндпоинт)
s.router.With(middleware.WSAuthMiddleware(s.tokenAuth)).Get("/ws", srv.ServeHTTP)
// 3. Playground и другие обработчики
s.router.Handle("/", playground.Handler("GraphQL playground", "/query")) s.router.Handle("/", playground.Handler("GraphQL playground", "/query"))
s.router.Handle("/query", srv)
s.router.Handle("/uploads/*", http.StripPrefix("/uploads/", http.FileServer(http.Dir("./uploads")))) s.router.Handle("/uploads/*", http.StripPrefix("/uploads/", http.FileServer(http.Dir("./uploads"))))
} }
@ -105,9 +114,12 @@ func (s *Server) configureMetrics() {
} }
func (s *Server) Run() error { func (s *Server) Run() error {
log.Printf("Server running on %s:%s", s.cfg.Server.Host, s.cfg.Server.Port)
log.Printf("WebSocket subscriptions at /ws")
return http.ListenAndServe(s.cfg.Server.Host+":"+s.cfg.Server.Port, s.router) return http.ListenAndServe(s.cfg.Server.Host+":"+s.cfg.Server.Port, s.router)
} }
func (s *Server) Shutdown(ctx context.Context) error { func (s *Server) Shutdown(ctx context.Context) error {
// Graceful shutdown logic
return nil return nil
} }