Files
pargar/docs/api.md
T

81 lines
2.8 KiB
Markdown
Raw Permalink Normal View History

# API
Base: `/api`. Signed media: `/media/…`. Health: `GET /api/health` (outside the rate-limited mux).
## Response contract
### Success
Ordinary JSON; standard 2xx codes.
### Error
```json
{
"error": "user-facing message",
"code": "unauthorized",
"requestId": "…"
}
```
Response header: `X-Request-ID` (generated by the server if the client did not send one).
The frontend maps these via `toUserError` and `ApiError`.
## Authentication
| Method | Use |
|--------|-----|
| Cookie `pargar_access` | Same-origin browser |
| `Authorization: Bearer <access>` | Tests, tools, in-memory token frontends |
| Cookie / body `refreshToken` | `POST /api/auth/refresh` |
WS: Bearer → subprotocol `bearer` + token → access cookie. Query string is forbidden.
## Public (no login)
| Method | Path | Notes |
|--------|------|--------|
| GET | `/api/auth/captcha` | Image challenge |
| POST | `/api/auth/login` | Login |
| POST | `/api/auth/refresh` | Session rotation |
| POST | `/api/auth/recovery/challenge` | Disabled (404) — public student recovery is off |
| POST | `/api/auth/recovery/reset` | Disabled (404) |
| GET | `/api/auth/register-status` | Whether public registration is on |
| POST | `/api/auth/register` | Public registration |
| GET/POST | `/api/auth/register-invite/{token}` | Invite status / consume |
| GET | `/api/certificates/{publicId}` | Public certificate |
| GET | `/api/community` | Donation / support |
| GET | `/api/sponsors` | Landing sponsors |
| GET | `/api/exports/chats/{token}` | Single-use chat archive download |
## Authenticated (student+)
Key examples:
- `GET /api/auth/me` · `POST /api/auth/logout`
- Tree and lessons: `/api/tree` · `/api/lessons/{id}` · heartbeat · quiz
- `GET /api/leaderboard/weekly` · `GET /api/challenges`
- Events and RSVP: `/api/events…`
- Chat: `/api/chats/…` · upload `/api/chats/upload`
- Notifications, unlock/reset requests
- My certificate: `/api/me/certificate` · issue · physical
- Avatar: `PUT /api/me/avatar` · `POST /api/me/avatar-photo`
- `GET /api/ws`
Full handler list: [`backend/internal/api/router.go`](../backend/internal/api/router.go).
## Staff / admin
Prefix `/api/admin/…`:
- **admin:** stats, users (CRUD, lock, role, reset-password), challenges, announcements, settings, sponsors, physical orders, invites, phone whitelist/blacklist, chat-export (+ tokens)
- **staff (admin + mentor):** learning overview/students, student unlock, chapters / lessons / questions / videos, events
- `GET /api/media/sign` staff only
Mentors do not manage accounts, registration, challenges, announcements, or site settings; they handle learning status and teaching content.
## Versioning
No version prefix for now; call out breaking changes in CHANGELOG/PR. External clients should prefer same-origin cookies or short-lived Bearer tokens.