Initial commit: Эфир мессенджер
This commit is contained in:
58
internal/api/handlers/websocket.go
Normal file
58
internal/api/handlers/websocket.go
Normal file
@@ -0,0 +1,58 @@
|
||||
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()
|
||||
}
|
||||
Reference in New Issue
Block a user