58 lines
1.2 KiB
Go
58 lines
1.2 KiB
Go
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()
|
|
} |