package gateway import ( "encoding/json" "net/http" ) // Database HTTP handlers func (g *Gateway) networkStatusHandler(w http.ResponseWriter, r *http.Request) { if g.client == nil { writeError(w, http.StatusServiceUnavailable, "client not initialized") return } ctx := r.Context() status, err := g.client.Network().GetStatus(ctx) if err != nil { writeError(w, http.StatusInternalServerError, err.Error()) return } writeJSON(w, http.StatusOK, status) } func (g *Gateway) networkPeersHandler(w http.ResponseWriter, r *http.Request) { if g.client == nil { writeError(w, http.StatusServiceUnavailable, "client not initialized") return } ctx := r.Context() peers, err := g.client.Network().GetPeers(ctx) if err != nil { writeError(w, http.StatusInternalServerError, err.Error()) return } writeJSON(w, http.StatusOK, peers) } func (g *Gateway) networkConnectHandler(w http.ResponseWriter, r *http.Request) { if g.client == nil { writeError(w, http.StatusServiceUnavailable, "client not initialized") return } if r.Method != http.MethodPost { writeError(w, http.StatusMethodNotAllowed, "method not allowed") return } var body struct { Multiaddr string `json:"multiaddr"` } if err := json.NewDecoder(r.Body).Decode(&body); err != nil || body.Multiaddr == "" { writeError(w, http.StatusBadRequest, "invalid body: expected {multiaddr}") return } if err := g.client.Network().ConnectToPeer(r.Context(), body.Multiaddr); err != nil { writeError(w, http.StatusInternalServerError, err.Error()) return } writeJSON(w, http.StatusOK, map[string]any{"status": "ok"}) } func (g *Gateway) networkDisconnectHandler(w http.ResponseWriter, r *http.Request) { if g.client == nil { writeError(w, http.StatusServiceUnavailable, "client not initialized") return } if r.Method != http.MethodPost { writeError(w, http.StatusMethodNotAllowed, "method not allowed") return } var body struct { PeerID string `json:"peer_id"` } if err := json.NewDecoder(r.Body).Decode(&body); err != nil || body.PeerID == "" { writeError(w, http.StatusBadRequest, "invalid body: expected {peer_id}") return } if err := g.client.Network().DisconnectFromPeer(r.Context(), body.PeerID); err != nil { writeError(w, http.StatusInternalServerError, err.Error()) return } writeJSON(w, http.StatusOK, map[string]any{"status": "ok"}) } func (g *Gateway) validateNamespaceParam(r *http.Request) bool { qns := r.URL.Query().Get("namespace") if qns == "" { return true } if v := r.Context().Value(ctxKeyNamespaceOverride); v != nil { if s, ok := v.(string); ok && s != "" { return s == qns } } // If no namespace in context, disallow explicit namespace param return false }