network/pkg/gateway/handlers/pubsub/presence_handler.go
2026-01-20 10:03:55 +02:00

48 lines
967 B
Go

package pubsub
import (
"fmt"
"net/http"
)
// PresenceHandler handles GET /v1/pubsub/presence?topic=mytopic
func (p *PubSubHandlers) PresenceHandler(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodGet {
writeError(w, http.StatusMethodNotAllowed, "method not allowed")
return
}
ns := resolveNamespaceFromRequest(r)
if ns == "" {
writeError(w, http.StatusForbidden, "namespace not resolved")
return
}
topic := r.URL.Query().Get("topic")
if topic == "" {
writeError(w, http.StatusBadRequest, "missing 'topic'")
return
}
topicKey := fmt.Sprintf("%s.%s", ns, topic)
p.presenceMu.RLock()
members, ok := p.presenceMembers[topicKey]
p.presenceMu.RUnlock()
if !ok {
writeJSON(w, http.StatusOK, map[string]any{
"topic": topic,
"members": []PresenceMember{},
"count": 0,
})
return
}
writeJSON(w, http.StatusOK, map[string]any{
"topic": topic,
"members": members,
"count": len(members),
})
}