Files
core/bible/architecture/api-surface.md

116 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# API Surface
## Health
- `GET /health`
## Registry
- `GET /assets`
- `POST /assets`
- `GET /registry/assets/{id}`
- `PUT /registry/assets/{id}`
- `DELETE /registry/assets/{id}`
- `GET /components`
- `POST /components`
- `GET /registry/components/{id}`
- `PUT /registry/components/{id}`
Registry invariants:
- Assets do not carry `project_id` in request/response contracts.
- Registry `PUT` mutations are history-backed (event + snapshot + projection update), not direct projection writes.
## Ingest
- `POST /ingest/hardware`
- `POST /ingest/manual/csv`
- `GET /ingest/manual/csv/jobs/{id}`
Manual CSV ingest contract:
- `POST /ingest/manual/csv` is asynchronous and returns `202 Accepted` with `job_id`.
- Final result is read from `GET /ingest/manual/csv/jobs/{id}`.
## Timeline
- `GET /assets/{id}/timeline`
- `GET /components/{id}/timeline`
- These routes now return the same structured **timeline cards** contract as history timeline endpoints (breaking change accepted).
## History API
- `GET /api/history/jobs/{id}`
- `GET /api/history/components/{id}/events`
- `GET /api/history/assets/{id}/events`
- `POST /api/history/components/{id}/apply`
- `POST /api/history/assets/{id}/apply`
- `GET /api/history/components/{id}/timeline`
- `GET /api/history/assets/{id}/timeline`
- `GET /api/history/components/{id}/timeline/cards/{card_id}/events`
- `GET /api/history/assets/{id}/timeline/cards/{card_id}/events`
- `GET /api/history/components/{id}/events/{timeline_event_id}/detail`
- `GET /api/history/assets/{id}/events/{timeline_event_id}/detail`
- `DELETE /api/history/components/{id}/events/{event_id}`
- `DELETE /api/history/assets/{id}/events/{event_id}`
- `POST /api/history/components/{id}/rollback`
- `POST /api/history/assets/{id}/rollback`
History API invariants:
- `POST /api/history/*/apply` uses semantic dedupe (no-op changes do not create events/snapshots/timeline rows).
- Delete/rollback/hard-restore are asynchronous and return `202 Accepted` with `job_id`.
- Timeline endpoints are grouped by day by default (`UTC`, optional `tz` override).
- Timeline endpoints return **cards** (single/dedup/bulk), not raw rows.
- Timeline supports server-side filters via query parameters: `date_from`, `date_to`, `action`, `source`, `device`, `slot`, `part_number` (mapped to model), `serial`.
- Card drilldown endpoint (`.../timeline/cards/{card_id}/events`) accepts `tz` and must use the same timezone as the timeline cards response used to render the card.
- `DELETE .../events/{event_id}` is soft-delete + recompute enqueue (not physical delete).
- `POST .../rollback` supports `compensating` and `hard_restore` modes.
## Failures
- `GET /failures`
- `POST /failures`
## UI Routes
- `GET /ui`
- `GET /ui/search`
- `GET /ui/assets`
- `GET /ui/assets/{id}`
- `GET /ui/components`
- `GET /ui/components/{id}`
- `GET /ui/failures`
- `GET /ui/ingest`
- `GET /ui/ingest/manual-template.csv`
## CSV Export Contract
Route: `GET /ui/ingest/manual-template.csv`
Rules:
- Encoding: UTF-8.
- UTF-8 BOM is included at file start for Excel compatibility.
- Delimiter: `;`.
- Line endings: `\r\n`.
- Escaping: RFC4180-compatible (fields with `;`, `"`, `\n`, `\r` are quoted; inner `"` is doubled).
- Header row is always present.
- Stable column order (deterministic, no map-driven order).
- Exported header order:
- ата_осмотра`
- `серийный_номер_сервера`
- `вендор`
- `p/n_устройства`
- `s/n_устройства`
- окейшн_в_сервере`
- ерсия_прошивки`
- `состояние_оборудования`
- Identifier-like columns are exported with Excel-safe text protection (to preserve leading zeros/codes).
- Empty values are exported as empty cells (no `null`/`undefined`).
- HTTP headers:
- `Content-Type: text/csv; charset=utf-8`
- `Content-Disposition: attachment; filename="manual-import-template.csv"`
## Routing Notes
- API router is registered in `internal/api/server.go`.
- Registry, ingest, failures, asset/component pages, and UI routes are attached to `http.ServeMux`.
- History API routes and background history worker are also wired from `internal/api/server.go`.