mirror of
https://github.com/juherr/kill-the-news.git
synced 2026-06-20 22:03:48 +00:00
feat(api): add versioned REST API with OpenAPI 3.1 spec
Expose /api/v1/* for feed and email management (feeds CRUD, email list/get/delete, stats) so the service can be automated without scraping the admin UI. Built on @hono/zod-openapi; the OpenAPI 3.1 spec is served at /api/openapi.json with a Scalar reference at /api/docs. Auth is token-based (Authorization: Bearer <ADMIN_PASSWORD>) plus the existing reverse-proxy headers — no cookie, no CSRF. Extracted the auth primitives into src/lib/auth.ts and the feed create/update/delete orchestration into src/lib/feed-service.ts so the admin UI and the REST API share a single source of truth. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
+13
@@ -184,6 +184,19 @@ Password login remains available as a fallback when the proxy check fails.
|
||||
|
||||
> **Security note:** `CF-Connecting-IP` can be spoofed on direct `workers.dev` requests. Disable the `workers.dev` subdomain in production (`workers_dev = false` in `[env.production]`).
|
||||
|
||||
### REST API authentication
|
||||
|
||||
The versioned REST API (`/api/v1/*`) is authenticated independently of the cookie-based
|
||||
admin UI — there is no CSRF check, so it is suited to server-to-server automation. A
|
||||
request is authorized when **either**:
|
||||
|
||||
- it carries `Authorization: Bearer <ADMIN_PASSWORD>` (the same admin password secret), **or**
|
||||
- it passes the reverse-proxy check above (`PROXY_TRUSTED_IPS` + `X-Auth-Proxy-Secret` + `Remote-User`).
|
||||
|
||||
The OpenAPI 3.1 spec (`/api/openapi.json`) and the Scalar reference (`/api/docs`) are
|
||||
public. In the Scalar UI, click **Authorize** and paste the admin password as the bearer
|
||||
token to try requests. See the route table in [README.md](README.md#rest-api).
|
||||
|
||||
## Upgrading dependencies
|
||||
|
||||
To refresh dependencies to latest:
|
||||
|
||||
Reference in New Issue
Block a user