v0.0.18.8.1 Добавлен отдельный хэндлер для вебсокета
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
d369d58d17
commit
d2750ba384
@ -17,7 +17,6 @@ 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 {
|
||||||
@ -65,40 +64,34 @@ 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))
|
||||||
|
|
||||||
// Основной GraphQL обработчик
|
s.router.Use(middleware.WSAuthMiddleware(s.tokenAuth))
|
||||||
|
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,
|
||||||
}))
|
}))
|
||||||
|
|
||||||
// Настройка WebSocket транспорта
|
wsTransport := transport.Websocket{
|
||||||
wsUpgrader := websocket.Upgrader{
|
Upgrader: 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 {
|
||||||
if origin == allowed {
|
if origin == allowed {
|
||||||
return true
|
return true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
return false
|
||||||
return false
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
srv.AddTransport(&transport.Websocket{
|
srv.AddTransport(&wsTransport)
|
||||||
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("/ws", srv)
|
||||||
|
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"))))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -114,12 +107,9 @@ 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
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user