From 2082e5d5dc6bf1f9ff67802e5ea9392fcc2720fd Mon Sep 17 00:00:00 2001 From: MrAlders0n Date: Thu, 10 Sep 2026 07:21:47 -0400 Subject: [PATCH] fix(api): return JSON 500 when bucketed telemetry query fails The bucketed branch declared a new err with :=, so a store error never reached the outer check and the handler dereferenced a nil telemetry. --- internal/api/handlers/observers.go | 3 ++- internal/api/handlers/observers_test.go | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/internal/api/handlers/observers.go b/internal/api/handlers/observers.go index 01491b5..43147b5 100644 --- a/internal/api/handlers/observers.go +++ b/internal/api/handlers/observers.go @@ -222,7 +222,8 @@ func getObserverTelemetry(reader api.Reader) http.HandlerFunc { if bucketHours == 0 { telemetry, err = reader.GetObserverTelemetry(r.Context(), observerID, since, until, afterID) } else { - points, err := reader.GetObserverTelemetryBucketed(r.Context(), observerID, since, until, bucketHours) + var points []api.ObserverTelemetryPoint + points, err = reader.GetObserverTelemetryBucketed(r.Context(), observerID, since, until, bucketHours) if err == nil { telemetry = &api.ObserverTelemetry{Points: points} } diff --git a/internal/api/handlers/observers_test.go b/internal/api/handlers/observers_test.go index 0d4a028..1bf865f 100644 --- a/internal/api/handlers/observers_test.go +++ b/internal/api/handlers/observers_test.go @@ -145,6 +145,29 @@ func TestGetObserverTelemetry_Bucketed_OK(t *testing.T) { } } +func TestGetObserverTelemetry_Bucketed_StoreError(t *testing.T) { + observerID := uuid.MustParse("00000000-0000-0000-0000-000000000001") + r := chi.NewRouter() + r.Get("/observers/{observerId}/telemetry", getObserverTelemetry(stubReader{ + getObserverTelemetryBucketed: func(_ context.Context, _ uuid.UUID, _, _ time.Time, _ int32) ([]api.ObserverTelemetryPoint, error) { + return nil, errors.New("boom") + }, + })) + req := httptest.NewRequest(http.MethodGet, "/observers/"+observerID.String()+"/telemetry?interval=6h", nil) + w := httptest.NewRecorder() + r.ServeHTTP(w, req) + if w.Code != http.StatusInternalServerError { + t.Fatalf("expected 500, got %d", w.Code) + } + var body map[string]APIError + if err := json.NewDecoder(w.Body).Decode(&body); err != nil { + t.Fatalf("expected JSON error body, got %q: %v", w.Body.String(), err) + } + if body["error"].Code != "internal_server_error" { + t.Errorf("expected internal_server_error, got %q", body["error"].Code) + } +} + func TestListObserverAdverts_OK(t *testing.T) { observerID := uuid.MustParse("00000000-0000-0000-0000-000000000001") r := chi.NewRouter()