Give every JSON answer @meta, errors included (closes #201)
check / check (push) Canceled after 0s

A panic in a JSON route's handler answered 500 with an empty body,
because the router's recoverer sits outside the middleware that adds
`@meta`. `JSONValidationMiddleware` now wraps the handler in the same
recoverer, and answers the panic with the JSON error body.

A method that `/status.json` or the health check does not take got
chi's empty 405. Each such method now goes to the JSON 405 that the
routes under `/api/v1` and `/ip` give.

The home page's IP lookup card showed only the answer's `data`. It now
shows the whole answer, `@meta` included.

A table test checks `@meta` on every JSON route, in its successes and
its errors.

Model: opus-5-5
This commit is contained in:
2026-10-27 20:03:14 +00:00
parent e8d04f1304
commit 10ba759ee6
8 changed files with 209 additions and 31 deletions
+7
View File
@@ -35,6 +35,13 @@ tested.
# Completed Steps
- 2026-10-27: every JSON answer carries `@meta`. A panic on a JSON route answers
500 with the JSON error body. A method that `/status.json` or the health check
does not take answers 405 with it, as under `/api/v1`. Both used to answer
with an empty body. The home page's IP lookup shows the whole JSON answer,
`@meta` included. It used to show only the answer's `data`, or only the
message of an error answer. A test checks `@meta` on every JSON route, in its
successes and its errors (closes #201)
- 2026-10-27: every value in a JSON answer that has a unit is a number, with the
unit at the end of its field name. `@meta.execution_time` is now
`execution_time_ms`. The stats' `uptime`, `connection_duration` and