food-market/docs/api-reference.md
nns 99b84132ba
Some checks failed
Auto-tag / Create date-tag (push) Waiting to run
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
Docker API / Build + push API (push) Has been cancelled
Docker API / Deploy API on stage (push) Has been cancelled
fix(s28): api-reference handle ~/path ASP.NET convention
ASP.NET Core convention для HttpX-атрибутов: `~/path` означает
'absolute from root, ignore class [Route]'. До фикса генератор клеил
`base-route` + `~/path` → невалидный `/~/connect/token`.

Теперь tilde корректно срезается, /connect/token виден в reference.

Также добавлен unit test ApiReferenceDocsJobTests (Sprint 28) для
lock-down regex behavior на double-nested generics.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-09 03:41:15 +05:00

599 lines
25 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 endpoint reference
Сгенерировано Python-сканером (`scripts/gen-api-reference.py`) из `src/food-market.api/Controllers/`.
Sprint 28 версия: ловит endpoint'ы с nested generic return-типами.
Идентичный логике runtime-job `ApiReferenceDocsJob` (Sprint 24); тот пересоздаёт файл
еженедельно при cron `Hangfire:Cron:ApiReferenceDocs`.
Всего endpoint'ов: **240**.
Контроллеров: **58**.
Полная OpenAPI-спека: `/swagger/v1/swagger.json`. Этот reference — human-readable summary.
## `AbcReportController`
Base route: `/api/reports/abc`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/reports/abc` | — | |
| GET | `/api/reports/abc/export` | — | |
## `AdminCleanupController`
Base route: `/api/admin/cleanup`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/admin/cleanup/all` | — | Полная очистка данных текущей организации — всё кроме настроек: остаются Organization, пользователи,… |
| DELETE | `/api/admin/cleanup/counterparties` | — | Удалить всех контрагентов текущей организации. Чтобы не нарваться на FK, сначала обнуляем ссылки (Pr… |
| GET | `/api/admin/cleanup/stats` | — | |
| POST | `/api/admin/cleanup/all/async` | — | |
## `AdminJobsController`
Base route: `/api/admin/jobs`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/admin/jobs/recent` | — | |
| GET | `/api/admin/jobs/{id:guid}` | — | |
## `AuthForgotPasswordController`
Base route: `/api/auth`
| Method | Route | Permission | Summary |
|---|---|---|---|
| POST | `/api/auth/forgot-password` | — | |
| POST | `/api/auth/reset-password` | — | |
## `AuthSignupController`
Base route: `/api/auth`
| Method | Route | Permission | Summary |
|---|---|---|---|
| POST | `/api/auth/signup` | — | |
## `AuthorizationController`
| Method | Route | Permission | Summary |
|---|---|---|---|
| POST | `/connect/token` | — | |
## `CounterpartiesController`
Base route: `/api/catalog/counterparties`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/catalog/counterparties/{id:guid}` | — | |
| GET | `/api/catalog/counterparties` | — | |
| GET | `/api/catalog/counterparties/export` | — | Sprint 19: экспорт списка контрагентов. |
| GET | `/api/catalog/counterparties/{id:guid}` | — | |
| POST | `/api/catalog/counterparties` | — | |
| PUT | `/api/catalog/counterparties/{id:guid}` | — | |
## `CountriesController`
Base route: `/api/catalog/countries`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/catalog/countries/{id:guid}` | — | |
| GET | `/api/catalog/countries` | — | |
| GET | `/api/catalog/countries/{id:guid}` | — | |
| POST | `/api/catalog/countries` | — | |
| PUT | `/api/catalog/countries/{id:guid}` | — | |
## `CurrenciesController`
Base route: `/api/catalog/currencies`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/catalog/currencies` | — | |
| GET | `/api/catalog/currencies/{id:guid}` | — | |
| POST | `/api/catalog/currencies` | — | |
| PUT | `/api/catalog/currencies/{id:guid}` | — | |
## `DashboardController`
Base route: `/api/dashboard`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/dashboard/low-stock` | — | Список товаров с остатком ≤ MinStock (Product.MinStock задан). Сортировка: меньший «запас в днях» → … |
| GET | `/api/dashboard/margin` | — | Маржа за окно N дней: выручка минус COGS (Sum(qty * UnitCost) по строкам проданных товаров). Использ… |
| GET | `/api/dashboard/recent-sales` | — | Последние N проведённых чеков (включая возвраты). Дашборд рендерит их как live-feed: SignalR SalePos… |
| GET | `/api/dashboard/top-products` | — | Top-N товаров по выручке за окно последних N дней. Default: 7 дней, top-5. Только проведённые чеки (… |
## `DemandsController`
Base route: `/api/sales/demands`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/sales/demands/{id:guid}` | — | |
| GET | `/api/sales/demands` | — | |
| GET | `/api/sales/demands/{id:guid}` | — | |
| POST | `/api/sales/demands` | — | |
| POST | `/api/sales/demands/{id:guid}/post` | — | |
| POST | `/api/sales/demands/{id:guid}/unpost` | — | |
| PUT | `/api/sales/demands/{id:guid}` | — | |
## `DemoSeedController`
Base route: `/api/admin/seed-demo`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/admin/seed-demo/status` | — | Сводка: какие демо-сущности уже наполнены. Дешёвый — только count'ы, не вызывает seed. UI использует… |
| POST | `/api/admin/seed-demo` | — | Запустить seed демо-данных. Идемпотентен — если уже наполнено, возвращает existing summary без встав… |
## `DiagnosticController`
Base route: `/api/admin/diagnostic`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/admin/diagnostic/run` | — | |
## `EmployeeRolesController`
Base route: `/api/organization/employee-roles`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/organization/employee-roles/{id:guid}` | — | |
| GET | `/api/organization/employee-roles` | — | |
| GET | `/api/organization/employee-roles/{id:guid}` | — | |
| POST | `/api/organization/employee-roles` | — | |
| PUT | `/api/organization/employee-roles/{id:guid}` | — | |
## `EmployeesController`
Base route: `/api/organization/employees`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/organization/employees/{id:guid}` | — | |
| GET | `/api/organization/employees` | — | |
| GET | `/api/organization/employees/{id:guid}` | — | |
| POST | `/api/organization/employees` | — | |
| PUT | `/api/organization/employees/{id:guid}` | — | |
## `EntersController`
Base route: `/api/inventory/enters`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/inventory/enters/{id:guid}` | — | |
| GET | `/api/inventory/enters` | — | |
| GET | `/api/inventory/enters/{id:guid}` | — | |
| POST | `/api/inventory/enters` | — | |
| POST | `/api/inventory/enters/{id:guid}/post` | — | |
| POST | `/api/inventory/enters/{id:guid}/unpost` | — | |
| PUT | `/api/inventory/enters/{id:guid}` | — | |
## `ExternalAuthController`
Base route: `/api/auth/external`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/auth/external/callback` | — | Callback после успешного OAuth у провайдера. Читает claims и решает, что делать: связать с существую… |
| GET | `/api/auth/external/providers` | — | Список доступных SSO-провайдеров. Web-фронт по этому списку решает, какие кнопки рисовать на /login. |
| GET | `/api/auth/external/{provider}` | — | Инициирует OAuth challenge на провайдере. Если провайдер не сконфигурирован — 503 с подсказкой. |
## `FeedbackController`
Base route: `/api/feedback`
| Method | Route | Permission | Summary |
|---|---|---|---|
| POST | `/api/feedback` | — | |
## `GlobalSearchController`
Base route: `/api/search`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/search/global` | — | |
## `InventoriesController`
Base route: `/api/inventory/inventories`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/inventory/inventories/{id:guid}` | — | |
| GET | `/api/inventory/inventories` | — | |
| GET | `/api/inventory/inventories/{id:guid}` | — | |
| POST | `/api/inventory/inventories` | — | |
| POST | `/api/inventory/inventories/{id:guid}/post` | — | |
| POST | `/api/inventory/inventories/{id:guid}/unpost` | — | |
| PUT | `/api/inventory/inventories/{id:guid}` | — | |
## `LossesController`
Base route: `/api/inventory/losses`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/inventory/losses/{id:guid}` | — | |
| GET | `/api/inventory/losses` | — | |
| GET | `/api/inventory/losses/{id:guid}` | — | |
| POST | `/api/inventory/losses` | — | |
| POST | `/api/inventory/losses/{id:guid}/post` | — | |
| POST | `/api/inventory/losses/{id:guid}/unpost` | — | |
| PUT | `/api/inventory/losses/{id:guid}` | — | |
## `LoyaltyCardsController`
Base route: `/api/loyalty/cards`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/loyalty/cards/{id:guid}` | — | |
| GET | `/api/loyalty/cards` | — | |
| GET | `/api/loyalty/cards/lookup` | — | Lookup по CardNumber — используется кассой при оплате. Возвращает 404 если карты нет, 409 если карта… |
| POST | `/api/loyalty/cards/issue` | — | |
| POST | `/api/loyalty/cards/{id:guid}/block` | — | |
| POST | `/api/loyalty/cards/{id:guid}/unblock` | — | |
## `LoyaltyProgramsController`
Base route: `/api/loyalty/programs`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/loyalty/programs/{id:guid}` | — | |
| GET | `/api/loyalty/programs` | — | |
| GET | `/api/loyalty/programs/{id:guid}` | — | |
| POST | `/api/loyalty/programs` | — | |
| PUT | `/api/loyalty/programs/{id:guid}` | — | |
## `MeAccountController`
Base route: `/api/me`
| Method | Route | Permission | Summary |
|---|---|---|---|
| POST | `/api/me/change-password` | — | Сменить пароль текущему юзеру. Требует текущий пароль для защиты от случайного/злонамеренного измене… |
## `MeSessionsController`
Base route: `/api/me/sessions`
| Method | Route | Permission | Summary |
|---|---|---|---|
| POST | `/api/me/sessions/revoke-all` | — | Гасит все refresh-токены текущего юзера. Использовать когда есть подозрение на угон cookies/пароля. |
## `MoySkladImportController`
Base route: `/api/admin/moysklad`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/admin/moysklad/settings` | — | |
| POST | `/api/admin/moysklad/import-counterparties` | — | |
| POST | `/api/admin/moysklad/import-products` | — | |
| POST | `/api/admin/moysklad/test` | — | |
| PUT | `/api/admin/moysklad/settings` | — | |
## `MoySkladSyncStatusController`
Base route: `/api/moysklad`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/moysklad/sync-status` | — | |
## `OrgAuditLogController`
Base route: `/api/admin/audit-log`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/admin/audit-log` | — | |
| POST | `/api/admin/audit-log/export` | — | Sprint 22: streaming-export audit-log для compliance / расследований. Multi-tenant — query-filter пр… |
## `OrgExportController`
Base route: `/api/org/export`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/org/export` | — | |
| GET | `/api/org/export/download/{token}` | — | Anonymous download по токену. Не требует авторизации — security через 256-битный random token + TTL … |
| GET | `/api/org/export/{id:guid}` | — | |
| POST | `/api/org/export` | — | Создать новый экспорт. Возвращает 202 + Id; полезно сразу polled'ить GET /api/org/export/{id} до Sta… |
## `OrgFiscalSettingsController`
Base route: `/api/organization/fiscal`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/organization/fiscal` | — | |
| GET | `/api/organization/fiscal/providers` | — | Доступные значения провайдера для select'а в UI. Возвращаем массив, потому что enum-значения мы НЕ х… |
| POST | `/api/organization/fiscal/test-send` | — | Тестовая отправка: создаёт «фейк-чек» (in-memory, не в БД) и отправляет через выбранного провайдера.… |
| PUT | `/api/organization/fiscal` | — | |
## `OrganizationSettingsController`
Base route: `/api/organization`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/organization/settings` | — | |
| PUT | `/api/organization/settings` | — | |
## `PlatformSettingsController`
Base route: `/api/super-admin/platform-settings`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/super-admin/platform-settings` | — | |
| POST | `/api/super-admin/platform-settings/test-send` | — | |
| PUT | `/api/super-admin/platform-settings` | — | |
## `PosController`
Base route: `/api/pos/v1`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/pos/v1/sync` | — | |
| POST | `/api/pos/v1/sales` | — | |
## `PriceTypesController`
Base route: `/api/catalog/price-types`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/catalog/price-types/{id:guid}` | — | |
| GET | `/api/catalog/price-types` | — | |
| GET | `/api/catalog/price-types/{id:guid}` | — | |
| POST | `/api/catalog/price-types` | — | |
| PUT | `/api/catalog/price-types/{id:guid}` | — | |
## `ProductGroupsController`
Base route: `/api/catalog/product-groups`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/catalog/product-groups/{id:guid}` | — | |
| GET | `/api/catalog/product-groups` | — | |
| GET | `/api/catalog/product-groups/{id:guid}` | — | |
| POST | `/api/catalog/product-groups` | — | |
| PUT | `/api/catalog/product-groups/{id:guid}` | — | |
## `ProductImagesController`
Base route: `/api/catalog/products/{productId:guid}/images`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/catalog/products/{productId:guid}/images/{imageId:guid}` | — | |
| GET | `/api/catalog/products/{productId:guid}/images` | — | |
| POST | `/api/catalog/products/{productId:guid}/images` | — | |
| POST | `/api/catalog/products/{productId:guid}/images/{imageId:guid}/main` | — | |
## `ProductsController`
Base route: `/api/catalog/products`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/catalog/products/{id:guid}` | — | |
| GET | `/api/catalog/products` | — | |
| GET | `/api/catalog/products/barcode-duplicates` | — | Находит штрихкоды, привязанные к более чем одному товару в текущей организации. Уникальный индекс эт… |
| GET | `/api/catalog/products/by-barcode/{value}` | — | Точный поиск по штрихкоду (для сканера). 0 → 404, 1 → объект, несколько → { items: [...] } чтобы UI … |
| GET | `/api/catalog/products/export` | — | Sprint 19: экспорт списка товаров с теми же фильтрами что и /api/catalog/products. Сервер-side генер… |
| GET | `/api/catalog/products/quick-search` | — | Лёгкий поиск для inline-добавления строк в документы (приёмка, продажа). Ранжирует точное совпадение… |
| GET | `/api/catalog/products/{id:guid}` | — | |
| PATCH | `/api/catalog/products/{id:guid}/price` | — | |
| POST | `/api/catalog/products` | — | |
| POST | `/api/catalog/products/bulk-update` | — | |
| POST | `/api/catalog/products/import-csv` | — | |
| POST | `/api/catalog/products/import/1c-csv` | — | |
| POST | `/api/catalog/products/{id:guid}/recalc-retail` | — | «Привести розничную к себестоимости»: ставит дефолтную розничную цену = ceil(Cost * (1 + Group.Marku… |
| PUT | `/api/catalog/products/{id:guid}` | — | |
## `ProfitReportController`
Base route: `/api/reports/profit`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/reports/profit` | — | |
| GET | `/api/reports/profit/export` | — | |
## `PromotionsController`
Base route: `/api/promotions`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/promotions/{id:guid}` | — | |
| GET | `/api/promotions` | — | |
| GET | `/api/promotions/{id:guid}` | — | |
| POST | `/api/promotions` | — | |
| PUT | `/api/promotions/{id:guid}` | — | |
## `RetailPointsController`
Base route: `/api/catalog/retail-points`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/catalog/retail-points/{id:guid}` | — | |
| GET | `/api/catalog/retail-points` | — | |
| GET | `/api/catalog/retail-points/{id:guid}` | — | |
| POST | `/api/catalog/retail-points` | — | |
| PUT | `/api/catalog/retail-points/{id:guid}` | — | |
## `RetailSalesController`
Base route: `/api/sales/retail`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/sales/retail/{id:guid}` | — | |
| GET | `/api/sales/retail` | — | |
| GET | `/api/sales/retail/export` | — | Sprint 19: экспорт списка чеков с фильтрами status/storeId/from/to. |
| GET | `/api/sales/retail/stats` | — | Aggregated sales metrics + daily series for the dashboard. Series buckets are days; defaults to last… |
| GET | `/api/sales/retail/{id:guid}` | — | |
| POST | `/api/sales/retail` | — | |
| POST | `/api/sales/retail/{id:guid}/create-return` | — | POST /create-return — копирует строки проведённого чека в новый Draft с IsReturn=true и ReferenceSal… |
| POST | `/api/sales/retail/{id:guid}/post` | — | |
| POST | `/api/sales/retail/{id:guid}/unpost` | — | |
| PUT | `/api/sales/retail/{id:guid}` | — | |
## `SalesReportController`
Base route: `/api/reports/sales`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/reports/sales` | — | |
| GET | `/api/reports/sales/export` | — | |
## `StockController`
Base route: `/api/inventory`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/inventory/movements` | — | |
| GET | `/api/inventory/stock` | — | |
| GET | `/api/inventory/stock/export` | — | Sprint 19: экспорт остатков. |
## `StockReportController`
Base route: `/api/reports/stock`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/reports/stock` | — | |
| GET | `/api/reports/stock/export` | — | |
## `StoresController`
Base route: `/api/catalog/stores`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/catalog/stores/{id:guid}` | — | |
| GET | `/api/catalog/stores` | — | |
| GET | `/api/catalog/stores/{id:guid}` | — | |
| POST | `/api/catalog/stores` | — | |
| PUT | `/api/catalog/stores/{id:guid}` | — | |
## `SuperAdminController`
Base route: `/api/super-admin`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/super-admin/audit-log` | — | |
| GET | `/api/super-admin/dashboard` | — | |
| GET | `/api/super-admin/settings` | — | |
| GET | `/api/super-admin/setup-status` | — | |
| PUT | `/api/super-admin/settings` | — | |
## `SuperAdminEmployeesController`
Base route: `/api/super-admin/organizations/{orgId:guid}/employees`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/super-admin/organizations/{orgId:guid}/employees/{id:guid}` | — | |
| GET | `/api/super-admin/organizations/{orgId:guid}/employees` | — | |
| GET | `/api/super-admin/organizations/{orgId:guid}/employees/{id:guid}` | — | |
| POST | `/api/super-admin/organizations/{orgId:guid}/employees` | — | |
| POST | `/api/super-admin/organizations/{orgId:guid}/employees/{id:guid}/account/toggle-active` | — | |
| POST | `/api/super-admin/organizations/{orgId:guid}/employees/{id:guid}/reset-password` | — | |
| POST | `/api/super-admin/organizations/{orgId:guid}/employees/{id:guid}/toggle-active` | — | |
| PUT | `/api/super-admin/organizations/{orgId:guid}/employees/{id:guid}` | — | |
## `SuperAdminOrganizationsController`
Base route: `/api/super-admin/organizations`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/super-admin/organizations/{id:guid}` | — | |
| GET | `/api/super-admin/organizations` | — | |
| GET | `/api/super-admin/organizations/{id:guid}` | — | |
| POST | `/api/super-admin/organizations` | — | |
| POST | `/api/super-admin/organizations/{id:guid}/archive` | — | |
| POST | `/api/super-admin/organizations/{id:guid}/change-owner` | — | |
| POST | `/api/super-admin/organizations/{id:guid}/restore` | — | |
| PUT | `/api/super-admin/organizations/{id:guid}` | — | |
## `SuperAdminUnitsOfMeasureController`
Base route: `/api/super-admin/units-of-measure`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/super-admin/units-of-measure/{id:guid}` | — | Soft-delete: IsActive=false. Если на единицу ссылаются продукты или активные org-junction'ы — 409 со… |
| GET | `/api/super-admin/units-of-measure` | — | |
| GET | `/api/super-admin/units-of-measure/{id:guid}` | — | |
| POST | `/api/super-admin/units-of-measure` | — | |
| PUT | `/api/super-admin/units-of-measure/{id:guid}` | — | |
## `SupplierReturnsController`
Base route: `/api/purchases/supplier-returns`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/purchases/supplier-returns/{id:guid}` | — | |
| GET | `/api/purchases/supplier-returns` | — | |
| GET | `/api/purchases/supplier-returns/{id:guid}` | — | |
| POST | `/api/purchases/supplier-returns` | — | |
| POST | `/api/purchases/supplier-returns/{id:guid}/post` | — | |
| POST | `/api/purchases/supplier-returns/{id:guid}/unpost` | — | |
| PUT | `/api/purchases/supplier-returns/{id:guid}` | — | |
## `SuppliesController`
Base route: `/api/purchases/supplies`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/purchases/supplies/{id:guid}` | — | |
| GET | `/api/purchases/supplies` | — | |
| GET | `/api/purchases/supplies/export` | — | Sprint 19: экспорт списка приёмок с теми же фильтрами. |
| GET | `/api/purchases/supplies/{id:guid}` | — | |
| POST | `/api/purchases/supplies` | — | |
| POST | `/api/purchases/supplies/{id:guid}/post` | — | |
| POST | `/api/purchases/supplies/{id:guid}/unpost` | — | |
| PUT | `/api/purchases/supplies/{id:guid}` | — | |
## `TelegramBindingController`
Base route: `/api/organization/telegram`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/organization/telegram` | — | |
| GET | `/api/organization/telegram/status` | — | |
| PUT | `/api/organization/telegram/bind` | — | |
## `TransfersController`
Base route: `/api/inventory/transfers`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/inventory/transfers/{id:guid}` | — | |
| GET | `/api/inventory/transfers` | — | |
| GET | `/api/inventory/transfers/{id:guid}` | — | |
| POST | `/api/inventory/transfers` | — | |
| POST | `/api/inventory/transfers/{id:guid}/post` | — | |
| POST | `/api/inventory/transfers/{id:guid}/unpost` | — | |
| PUT | `/api/inventory/transfers/{id:guid}` | — | |
## `TwoFactorController`
Base route: `/api/me/2fa`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/me/2fa/status` | — | |
| POST | `/api/me/2fa/disable` | — | |
| POST | `/api/me/2fa/enroll` | — | |
| POST | `/api/me/2fa/verify` | — | |
## `UnitsOfMeasureController`
Base route: `/api/catalog/units-of-measure`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/catalog/units-of-measure/{id:guid}/enable` | — | Отключить global для текущей орги. Если на эту единицу ссылаются продукты орги — 409 со списком назв… |
| GET | `/api/catalog/units-of-measure` | — | Список единиц для текущей орги: только включённые active globals. Для SuperAdmin без override — все … |
| GET | `/api/catalog/units-of-measure/{id:guid}` | — | |
| POST | `/api/catalog/units-of-measure/{id:guid}/enable` | — | Включить global для текущей орги. Идемпотентно: повторный вызов отдаёт 204 и не плодит дубликатов ju… |
## `UploadsController`
Base route: `/uploads`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/uploads/{*path}` | — | |
## `UserPresetsController`
Base route: `/api/user/presets`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/user/presets/{id:guid}` | — | |
| GET | `/api/user/presets` | — | |
| POST | `/api/user/presets` | — | |
| PUT | `/api/user/presets/{id:guid}` | — | |
## `WhatsNewController`
Base route: `/api/whats-new`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/whats-new` | — | |