# OpenAPI / Swagger API публикует OpenAPI-документ через `Swashbuckle.AspNetCore`. Описание включает security-scheme `Bearer` (OpenIddict JWT), стабильные `operationId = Controller_Action`, уникальные `schemaId` с префиксом из неймспейса (одноимённые nested record'ы в разных контроллерах не схлопываются). ## Эндпоинты | URL | Когда | |---|---| | `/swagger` | UI, только Development | | `/swagger/v1/swagger.json` | JSON-документ, только Development | На stage/prod swagger отключён — отдельный endpoint enumeration не должен раскрываться неавторизованным клиентам. Если нужно — поднимать локальный API из той же ветки. ## TypeScript-клиент В `src/food-market.web` подключён `openapi-typescript` (devDependency). Команда: ```bash # Терминал 1: поднять API ASPNETCORE_ENVIRONMENT=Development dotnet run --project src/food-market.api # Терминал 2: сгенерировать types cd src/food-market.web pnpm run gen:api # читает http://localhost:5081/swagger/v1/swagger.json # → src/lib/api.generated.ts ``` Альтернативно (без живого API) — через `Swashbuckle.AspNetCore.Cli` (версия должна совпадать с `Swashbuckle.AspNetCore`, у нас 6.9.0): ```bash dotnet tool install --global Swashbuckle.AspNetCore.Cli --version 6.9.0 dotnet build src/food-market.api swagger tofile --output /tmp/swagger.json \ src/food-market.api/bin/Debug/net8.0/foodmarket.Api.dll v1 cd src/food-market.web pnpm exec openapi-typescript /tmp/swagger.json -o src/lib/api.generated.ts ``` ## Использование Тонкая обёртка в `src/food-market.web/src/lib/apiClient.ts` экспортирует типизированные хелперы для отчётов (Reports/Sales, Reports/ABC, Reports/Profit) — образец постепенной миграции с ручных типов в `types.ts`. В новом коде использовать обёртку и переэкспортированные типы; старые страницы переписывать по мере правок. ## Версионирование Document `v1` — единственный. Если будут breaking changes — поднимаем `v2` рядом, не ломая `v1`. У `operationId` стабильное имя `Controller_Action` — переименование контроллера ломает TS-клиент, относиться как к public API.