package chat import ( "context" "veza-backend-api/internal/repositories" "veza-backend-api/internal/services" "go.uber.org/zap" ) type MessageHandler struct { msgRepo *repositories.ChatMessageRepository readRepo *repositories.ReadReceiptRepository deliveredRepo *repositories.DeliveredStatusRepository reactionRepo *repositories.ReactionRepository userRepo repositories.UserRepository pubsub *services.ChatPubSubService permissions *PermissionService rateLimiter *RateLimiter hub *Hub logger *zap.Logger } func NewMessageHandler( hub *Hub, msgRepo *repositories.ChatMessageRepository, readRepo *repositories.ReadReceiptRepository, deliveredRepo *repositories.DeliveredStatusRepository, reactionRepo *repositories.ReactionRepository, userRepo repositories.UserRepository, pubsub *services.ChatPubSubService, permissions *PermissionService, rateLimiter *RateLimiter, logger *zap.Logger, ) *MessageHandler { if logger == nil { logger = zap.NewNop() } return &MessageHandler{ hub: hub, msgRepo: msgRepo, readRepo: readRepo, deliveredRepo: deliveredRepo, reactionRepo: reactionRepo, userRepo: userRepo, pubsub: pubsub, permissions: permissions, rateLimiter: rateLimiter, logger: logger, } } func (h *MessageHandler) Dispatch(ctx context.Context, client *Client, msg *IncomingMessage) { switch msg.Type { case TypePing: client.SendJSON(NewPongResponse()) case TypeSendMessage: h.HandleSendMessage(ctx, client, msg) case TypeEditMessage: h.HandleEditMessage(ctx, client, msg) case TypeDeleteMessage: h.HandleDeleteMessage(ctx, client, msg) case TypeJoinConversation: h.HandleJoinConversation(ctx, client, msg) case TypeLeaveConversation: h.HandleLeaveConversation(ctx, client, msg) case TypeFetchHistory: h.HandleFetchHistory(ctx, client, msg) case TypeSearchMessages: h.HandleSearchMessages(ctx, client, msg) case TypeSyncMessages: h.HandleSyncMessages(ctx, client, msg) case TypeTyping: h.HandleTyping(ctx, client, msg) case TypeMarkAsRead: h.HandleMarkAsRead(ctx, client, msg) case TypeDelivered: h.HandleDelivered(ctx, client, msg) case TypeAddReaction: h.HandleAddReaction(ctx, client, msg) case TypeRemoveReaction: h.HandleRemoveReaction(ctx, client, msg) case TypeCallOffer: h.HandleCallOffer(ctx, client, msg) case TypeCallAnswer: h.HandleCallAnswer(ctx, client, msg) case TypeICECandidate: h.HandleICECandidate(ctx, client, msg) case TypeCallHangup: h.HandleCallHangup(ctx, client, msg) case TypeCallReject: h.HandleCallReject(ctx, client, msg) default: h.logger.Warn("Unknown message type", zap.String("type", msg.Type), zap.String("user_id", client.UserID.String())) client.SendJSON(NewErrorResponse("Unknown message type: " + msg.Type)) } }