veza/veza-backend-api/internal/handlers/chat_websocket_handler.go

69 lines
1.6 KiB
Go
Raw Normal View History

package handlers
import (
"context"
"net/http"
"github.com/coder/websocket"
"github.com/gin-gonic/gin"
"go.uber.org/zap"
"veza-backend-api/internal/services"
chatws "veza-backend-api/internal/websocket/chat"
)
type ChatWebSocketHandler struct {
chatService *services.ChatService
hub *chatws.Hub
handler *chatws.MessageHandler
logger *zap.Logger
}
func NewChatWebSocketHandler(chatService *services.ChatService, hub *chatws.Hub, handler *chatws.MessageHandler, logger *zap.Logger) *ChatWebSocketHandler {
if logger == nil {
logger = zap.NewNop()
}
return &ChatWebSocketHandler{
chatService: chatService,
hub: hub,
handler: handler,
logger: logger,
}
}
func (h *ChatWebSocketHandler) HandleWebSocket(c *gin.Context) {
tokenString := c.Query("token")
if tokenString == "" {
c.JSON(http.StatusUnauthorized, gin.H{"error": "missing token"})
return
}
claims, err := h.chatService.ValidateChatToken(tokenString)
if err != nil {
h.logger.Warn("Invalid chat token",
zap.Error(err))
c.JSON(http.StatusUnauthorized, gin.H{"error": "invalid or expired token"})
return
}
conn, err := websocket.Accept(c.Writer, c.Request, &websocket.AcceptOptions{
InsecureSkipVerify: true,
})
if err != nil {
h.logger.Error("Failed to accept WebSocket",
zap.Error(err),
zap.String("user_id", claims.UserID.String()))
return
}
client := chatws.NewClient(h.hub, conn, claims.UserID, claims.Username, h.handler, h.logger)
h.hub.Register(client)
client.SendJSON(chatws.NewActionConfirmedResponse("connected", true))
ctx := context.Background()
go client.WritePump(ctx)
go client.ReadPump(ctx)
}