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) }