veza/veza-backend-api/internal/websocket/chat/handler.go
2026-03-06 10:29:30 +01:00

106 lines
2.8 KiB
Go

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