fix(gateway): direct DB query and normalized UserID matching in BroadcastToServer

This commit is contained in:
2026-07-27 09:12:35 -04:00
parent a54a67e41b
commit beb04196ca
+25 -8
View File
@@ -5,6 +5,7 @@ import (
"database/sql" "database/sql"
"encoding/json" "encoding/json"
"log/slog" "log/slog"
"strings"
"sync" "sync"
"time" "time"
) )
@@ -285,15 +286,30 @@ func (h *Hub) BroadcastToServer(serverID string, event Event) {
return return
} }
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
rows, err := h.db.QueryContext(ctx, `SELECT user_id FROM members WHERE server_id = $1`, serverID)
if err != nil {
h.logger.Error("failed to load server members", "server_id", serverID, "error", err)
return
}
defer rows.Close()
members := make(map[string]bool)
for rows.Next() {
var uid string
if err := rows.Scan(&uid); err == nil {
members[strings.ToLower(strings.TrimSpace(uid))] = true
}
}
h.mu.RLock() h.mu.RLock()
defer h.mu.RUnlock() defer h.mu.RUnlock()
for client := range h.clients { for client := range h.clients {
servers, ok := h.userServers[client.UserID] cID := strings.ToLower(strings.TrimSpace(client.UserID))
if !ok { if members[cID] {
continue
}
if _, member := servers[serverID]; member {
select { select {
case client.send <- data: case client.send <- data:
default: default:
@@ -322,18 +338,19 @@ func (h *Hub) BroadcastToConversation(convID string, event Event) {
} }
defer rows.Close() defer rows.Close()
members := make(map[string]struct{}) members := make(map[string]bool)
for rows.Next() { for rows.Next() {
var uid string var uid string
if err := rows.Scan(&uid); err == nil { if err := rows.Scan(&uid); err == nil {
members[uid] = struct{}{} members[strings.ToLower(strings.TrimSpace(uid))] = true
} }
} }
h.mu.RLock() h.mu.RLock()
defer h.mu.RUnlock() defer h.mu.RUnlock()
for client := range h.clients { for client := range h.clients {
if _, ok := members[client.UserID]; ok { cID := strings.ToLower(strings.TrimSpace(client.UserID))
if members[cID] {
select { select {
case client.send <- data: case client.send <- data:
default: default: