From 795fb7facf403f4e3d452d2e08ba11f98e8ee997 Mon Sep 17 00:00:00 2001 From: wikiapiserver Date: Thu, 25 Jun 2026 21:35:50 +0200 Subject: feat: log article API failures to database - Created api_logs table (username, article_name, status_code, response_time_ms, error, request_url) - GetArticle logs failures (network errors and non-2xx responses) with timing, status code, and response body - Successful requests are not logged --- api/handlers.go | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) (limited to 'api/handlers.go') diff --git a/api/handlers.go b/api/handlers.go index c9c3031..04fcc23 100644 --- a/api/handlers.go +++ b/api/handlers.go @@ -227,16 +227,30 @@ func (h *Handler) GetArticle(w http.ResponseWriter, r *http.Request) { return } - base := "https://api.enterprise.wikimedia.com/v2/structured-contents/" + url.QueryEscape(article) - req, err := http.NewRequestWithContext(ctx, "GET", base+"?limit=1&filters[project]=en.wikipedia.org", nil) + baseURL := "https://api.enterprise.wikimedia.com/v2/structured-contents/" + url.QueryEscape(article) + queryURL := baseURL + "?limit=1&filters[project]=en.wikipedia.org" + + req, err := http.NewRequestWithContext(ctx, "GET", queryURL, nil) if err != nil { serverError(w, "could not build request") return } req.Header.Set("Authorization", "Bearer "+acct.AccessToken) + start := time.Now() resp, err := http.DefaultClient.Do(req) + elapsed := int(time.Since(start).Milliseconds()) + if err != nil { + log.Printf("article request failed: user=%s article=%s error=%v (%dms)", username, article, err, elapsed) + h.db.LogApiCall(ctx, &db.ApiLogEntry{ + Username: username, + ArticleName: article, + StatusCode: 0, + ResponseMs: elapsed, + Error: err.Error(), + RequestURL: queryURL, + }) serverError(w, "wikimedia api error") return } @@ -244,6 +258,16 @@ func (h *Handler) GetArticle(w http.ResponseWriter, r *http.Request) { if resp.StatusCode < 200 || resp.StatusCode >= 300 { b, _ := io.ReadAll(resp.Body) + log.Printf("article request failed: user=%s article=%s status=%d body=%s (%dms)", + username, article, resp.StatusCode, string(b), elapsed) + h.db.LogApiCall(ctx, &db.ApiLogEntry{ + Username: username, + ArticleName: article, + StatusCode: resp.StatusCode, + ResponseMs: elapsed, + Error: string(b), + RequestURL: queryURL, + }) http.Error(w, string(b), resp.StatusCode) return } -- cgit v1.2.3