fix(gateway): direct DB query and normalized UserID matching in BroadcastToServer
This commit is contained in:
+25
-8
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user