Merge pull request 'Sprint 0 / #19: OpenAPI 3.1 контракт API v1 + TS-клиент и контрактные тесты' (#57) from feat/19-openapi into main
Sprint 0 / #19: OpenAPI 3.1 контракт API v1 + TS-клиент и контрактные тесты AC проверены независимо (ревью TechLead): генератор TS-клиента (blob сверен), отклонение схемы роняет контрактный тест (мутации), секретов в ответах нет. Гейты: ruff/mypy чисто, pytest 93 passed / coverage 95.48% (порог 70%). CI green недостижим — runner отсутствует (#52); отклонение зафиксировано в PR. Refs #19, #15, #52.
This commit was merged in pull request #57.
This commit is contained in:
@@ -0,0 +1,20 @@
|
||||
#!/usr/bin/env bash
|
||||
# Генерация TypeScript-типов клиента из контракта (docs/openapi.yaml, issue #19).
|
||||
#
|
||||
# Требуется Node.js >= 20 (генератор запускается через npx, версия запинена).
|
||||
# Результат коммитится в ui/src/api/generated/schema.d.ts и проверяется в CI.
|
||||
set -euo pipefail
|
||||
|
||||
root_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
||||
spec="${root_dir}/docs/openapi.yaml"
|
||||
out_dir="${root_dir}/ui/src/api/generated"
|
||||
generator="openapi-typescript@7"
|
||||
|
||||
if [[ ! -f "${spec}" ]]; then
|
||||
echo "contract not found: ${spec}" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
mkdir -p "${out_dir}"
|
||||
npx --yes "${generator}" "${spec}" -o "${out_dir}/schema.d.ts"
|
||||
echo "OK: ${out_dir}/schema.d.ts <- ${spec}"
|
||||
@@ -0,0 +1,27 @@
|
||||
# ui/src/api/generated — сгенерированный API-клиент
|
||||
|
||||
**Файлы в этой папке не редактируются руками.**
|
||||
|
||||
| Файл | Источник |
|
||||
|---|---|
|
||||
| `schema.d.ts` | `docs/openapi.yaml` (контракт API v1, issue #19) через `openapi-typescript@7` |
|
||||
|
||||
## Перегенерация
|
||||
|
||||
```bash
|
||||
bash ui/scripts/generate-api.sh
|
||||
```
|
||||
|
||||
Требуется Node.js >= 20. CI-джоба `ts-client-is-current` повторяет генерацию и падает,
|
||||
если закоммиченный файл расходится со спецификацией.
|
||||
|
||||
## Секреты
|
||||
|
||||
Поля `private_key` (TunnelConfig), `preshared_key` (PeerConfig) и `password`
|
||||
(AuthLoginRequest) помечены в контракте `writeOnly`:
|
||||
|
||||
* их **можно** передавать в запросах (`PUT /api/v1/config`, `POST /api/v1/auth/login`);
|
||||
* их **нельзя** ожидать в ответах — сервер обязан их вырезать (см. контрактный тест
|
||||
`backend/tests/test_contract_responses.py::test_responses_contain_no_secret_material`).
|
||||
|
||||
Поэтому UI читает секреты только из полей ввода и никогда не рендерит их из ответов API.
|
||||
Vendored
+1229
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user