package handlers import ( "net/http" gorillaWS "github.com/gorilla/websocket" "messenger/internal/pkg/logger" "messenger/internal/service" ws "messenger/internal/websocket" ) var upgrader = gorillaWS.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true }, } type WebSocketHandler struct { hub *ws.Hub authService *service.AuthService } func NewWebSocketHandler(hub *ws.Hub, authService *service.AuthService) *WebSocketHandler { return &WebSocketHandler{ hub: hub, authService: authService, } } func (h *WebSocketHandler) HandleWebSocket(w http.ResponseWriter, r *http.Request) { token := r.URL.Query().Get("token") if token == "" { http.Error(w, "missing token", http.StatusUnauthorized) return } user, err := h.authService.ValidateToken(token) if err != nil { logger.Error("WebSocket auth failed", "error", err) http.Error(w, "invalid token", http.StatusUnauthorized) return } logger.Info("WebSocket connecting", "user_id", user.ID, "login", user.Login) conn, err := upgrader.Upgrade(w, r, nil) if err != nil { logger.Error("WebSocket upgrade failed", "error", err) return } client := ws.NewClient(h.hub, conn, user) h.hub.GetRegisterChan() <- client go client.WritePump() client.ReadPump() }