package httpapi import ( "net/http" "cloudipvalidator/internal/db" ) func (s *Server) handleHealthz(w http.ResponseWriter, r *http.Request) { writeJSON(w, http.StatusOK, okResponse{OK: true}) } func (s *Server) handleAdminStatus(w http.ResponseWriter, r *http.Request) { ips, err := s.DB.ListIPs(r.Context()) if err != nil { writeError(w, http.StatusInternalServerError, err.Error()) return } validators, err := s.DB.ListValidators(r.Context()) if err != nil { writeError(w, http.StatusInternalServerError, err.Error()) return } byState := map[string]int{} for _, ip := range ips { byState[ip.State]++ } writeJSON(w, http.StatusOK, map[string]interface{}{ "total_ips": len(ips), "ips_by_state": byState, "total_validators": len(validators), }) } func (s *Server) handleAdminIPs(w http.ResponseWriter, r *http.Request) { ips, err := s.DB.ListIPs(r.Context()) if err != nil { writeError(w, http.StatusInternalServerError, err.Error()) return } writeJSON(w, http.StatusOK, ips) } func (s *Server) handleAdminIPDetail(w http.ResponseWriter, r *http.Request) { address := r.PathValue("ip") item, err := s.DB.GetIPByAddress(r.Context(), address) if err != nil { writeError(w, http.StatusNotFound, "unknown ip: "+address) return } checks, err := s.DB.ListChecksForAttempt(r.Context(), item.ID, item.AttemptNumber) if err != nil { writeError(w, http.StatusInternalServerError, err.Error()) return } events, err := s.DB.ListEventsForIP(r.Context(), item.ID) if err != nil { writeError(w, http.StatusInternalServerError, err.Error()) return } writeJSON(w, http.StatusOK, struct { IP *db.IPQueueItem `json:"ip"` Checks []db.Check `json:"checks"` Events []db.Event `json:"events"` }{item, checks, events}) } func (s *Server) handleAdminValidators(w http.ResponseWriter, r *http.Request) { validators, err := s.DB.ListValidators(r.Context()) if err != nil { writeError(w, http.StatusInternalServerError, err.Error()) return } writeJSON(w, http.StatusOK, validators) }