4.1 KiB
4.1 KiB
API Surface
Health
GET /health
Registry
GET /assetsPOST /assetsGET /registry/assets/{id}PUT /registry/assets/{id}DELETE /registry/assets/{id}GET /componentsPOST /componentsGET /registry/components/{id}PUT /registry/components/{id}
Registry invariants:
- Assets do not carry
project_idin request/response contracts. - Registry
PUTmutations are history-backed (event + snapshot + projection update), not direct projection writes.
Ingest
POST /ingest/hardwarePOST /ingest/manual/csvGET /ingest/manual/csv/jobs/{id}
Manual CSV ingest contract:
POST /ingest/manual/csvis asynchronous and returns202 Acceptedwithjob_id.- Final result is read from
GET /ingest/manual/csv/jobs/{id}.
Timeline
GET /assets/{id}/timelineGET /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}/eventsGET /api/history/assets/{id}/eventsPOST /api/history/components/{id}/applyPOST /api/history/assets/{id}/applyGET /api/history/components/{id}/timelineGET /api/history/assets/{id}/timelineGET /api/history/components/{id}/timeline/cards/{card_id}/eventsGET /api/history/assets/{id}/timeline/cards/{card_id}/eventsGET /api/history/components/{id}/events/{timeline_event_id}/detailGET /api/history/assets/{id}/events/{timeline_event_id}/detailDELETE /api/history/components/{id}/events/{event_id}DELETE /api/history/assets/{id}/events/{event_id}POST /api/history/components/{id}/rollbackPOST /api/history/assets/{id}/rollback
History API invariants:
POST /api/history/*/applyuses semantic dedupe (no-op changes do not create events/snapshots/timeline rows).- Delete/rollback/hard-restore are asynchronous and return
202 Acceptedwithjob_id. - Timeline endpoints are grouped by day by default (
UTC, optionaltzoverride). - 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) acceptstzand 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 .../rollbacksupportscompensatingandhard_restoremodes.
Failures
GET /failuresPOST /failures
UI Routes
GET /uiGET /ui/searchGET /ui/assetsGET /ui/assets/{id}GET /ui/componentsGET /ui/components/{id}GET /ui/failuresGET /ui/ingestGET /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,\rare 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-8Content-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.