# Эндпоинты, с которыми взаимодействует rfi-frontend Документ описывает все HTTP-эндпоинты внешних сервисов, к которым обращается модуль (микрофронтенд `rfi-frontend`). ## Как устроено взаимодействие Все запросы собраны в реестре `module/api/index.ts` и сгруппированы по объектам-«API»: `RfiAPI`, `AttachmentsAPI`, `CoreAPI`, `ResourcesAPI` и функция `getAttributes`. Каждый вызов идёт через единый `httpService` (`module/api/http-service.ts`), созданный фабрикой `createHttpService` из `@sarex-team/sdk-js` (поверх axios). Вызов задаётся объектом: - `service` — логическое имя сервиса (см. таблицу хостов ниже); - `url` — путь запроса (дописывается к базовому хосту сервиса); - `data` — тело запроса (для POST/PUT/PATCH); - `axiosConfig` — доп. настройки axios, чаще всего `params` (query-параметры: `limit`, `offset`, `company_id` и т.п.); - `showErrorNotification` — показывать ли уведомление об ошибке; - `controller` — `AbortController` для отмены запроса. Методы `httpService`: `getRequest`, `postRequest`, `putRequest`, `patchRequest`, `deleteRequest`. Базовый хост подставляется по `service` из `module/api/hosts.ts` в зависимости от `BUILD_ENV`. ## Базовые хосты по сервисам и окружениям Значения из `module/api/hosts.ts`. Итоговый URL = `<базовый хост сервиса>` + `url`. Использовано пять сервисов (остальные ключи в `hosts.ts` объявлены, но модулем не вызываются). | Сервис (`service`) | Назначение | `stage` | `prod` | | --- | --- | --- | --- | | `rfi` | Собственный backend RFI (этот сервис) | `https://stage-api.sarex.io/rfi/api/v1` | `https://api.sarex.io/rfi/api/v1` | | `sarexApi` | Gateway/API Sarex (attachments, users v2) | `https://stage-api.sarex.io` | `https://api.sarex.io` | | `sarex` | Локальный backend Sarex (`/api/core`, `/api/client`) | `https://stage.sarex.io` | `https://lk.sarex.io` | | `gateway_api_v1` | Gateway API v1 (resources) | `https://stage-api.sarex.io/gateway/api/v1` | `https://api.sarex.io/gateway/api/v1` | | `eav_api_v0` | EAV — сервис атрибутов/схем | `https://stage-api.sarex.io/eav/api/v0` | `https://api.sarex.io/eav/api/v0` | > Также определены окружения `local`, `preprod` и `contour`. В `local` сервис `sarex` проксируется на `/sarex-backend`; в `contour` используются относительные пути. Подключаемый удалённый модуль documentations описан отдельно в `module/api/module-hosts.ts` (Module Federation `remoteEntry.js`). ## Эндпоинты по сервисам ### `rfi` — Backend RFI (этот сервис) `RfiAPI` из `module/api/index.ts`. Пути указаны относительно базы `.../rfi/api/v1`. | Метод (`RfiAPI`) | HTTP | Путь | Назначение | | --- | --- | --- | --- | | `getRfi` | POST | `/rfi/filter/` | Список RFI по фильтру (query `limit`/`offset`, тело — фильтры) | | `postRfi` | POST | `/rfi/` | Создать RFI | | `putRfi` | PUT | `/rfi/{rfiId}/` | Полное обновление RFI | | `patchRfi` | PATCH | `/rfi/{rfiId}/` | Частичное обновление RFI | | `copyRfi` | POST | `/rfi/{rfiId}/copy/` | Скопировать RFI (тело `{ name }`) | | `getRfiById` | GET | `/rfi/{id}/` | RFI по id | | `deleteRfi` | DELETE | `/rfi/{id}/` | Удалить RFI (soft-delete) | | `getHistory` | GET | `/rfi/history/` | История изменений по списку RFI (query-параметры фильтра) | | `getStatusCount` | POST | `/rfi/status-count/` | Количество RFI по статусам (по `resource_id`) | | `getPriorityCount` | POST | `/rfi/priority-count/` | Количество RFI по приоритетам (по `resource_id`) | | `createRfiMessage` | POST | `/messages/` | Создать сообщение в RFI | | `getMessagesByRfiId` | GET | `/messages/?request_id={id}` | Сообщения по id запроса | | `patchRfiMessage` | PATCH | `/messages/{id}/` | Отметить сообщение решением (`is_solution`) | | `getStatuses` | GET | `/statuses/` | Список статусов (query `company_id`, `limit`, `offset`) | | `getStatusModels` | GET | `/status-models/` | Модели статусов компании (query `company_id`) | | `getPriorities` | GET | `/priorities/` | Список приоритетов (query `company_id`, `limit`, `offset`) | | `getPriorityModels` | GET | `/priority-models/` | Модели приоритетов компании (query `company_id`) | ### `sarexApi` — Gateway/API Sarex `AttachmentsAPI` и `CoreAPI.getUsersV2`. Пути указаны относительно базы `https://(stage-)api.sarex.io`. | Метод | HTTP | Путь | Назначение | | --- | --- | --- | --- | | `AttachmentsAPI.uploadFiles` | POST | `/gateway/api/v1/attachments/` | Загрузить файлы (`multipart/form-data`) | | `AttachmentsAPI.deleteFile` | DELETE | `/gateway/api/v1/attachments/{id}` | Удалить файл | | `AttachmentsAPI.getFilesByRfiId` | GET | `/gateway/api/v1/attachments/?company_id={companyId}&instance_id={rfiId}&model_name={ATTACHMENTS_MODEL_NAME}` | Файлы, привязанные к RFI | | `CoreAPI.getUsersV2` | GET | `/gateway/api/v2/users/` | Пользователи (query `company_id`, `permissions`, `resource_id`, `limit`, `offset`) | ### `sarex` — Backend Sarex `CoreAPI`. Пути указаны относительно базы `https://stage.sarex.io` / `https://lk.sarex.io`. | Метод | HTTP | Путь | Назначение | | --- | --- | --- | --- | | `CoreAPI.getUsers` | GET | `/api/core/users/` | Пользователи (query `company`, `perm`, `resource_id`, `limit`, `offset`) | | `CoreAPI.getDepartments` | GET | `/api/core/admin/departments/?company={companyId}&{query}` | Отделы компании | | `CoreAPI.getPositions` | GET | `/api/core/admin/positions/?company={companyId}&{query}` | Должности компании | | `CoreAPI.getSettings` | GET | `/api/client/settings/` | Клиентские настройки | ### `gateway_api_v1` — Gateway API v1 `ResourcesAPI`. База уже включает `/gateway/api/v1`. | Метод | HTTP | Путь | Назначение | | --- | --- | --- | --- | | `ResourcesAPI.getResources` | GET | `/resources/` | Список ресурсов (query `company_id`) | ### `eav_api_v0` — EAV (атрибуты) Функция `getAttributes`. База уже включает `/eav/api/v0`. | Метод | HTTP | Путь | Назначение | | --- | --- | --- | --- | | `getAttributes` | GET | `/schema/?model_name=flow&company_id={companyId}` | Схема атрибутов по компании | ## Обработка ошибок Ошибки обрабатываются в `httpService` (`@sarex-team/sdk-js`). Тип ответа с ошибкой описан в `module/api/types.ts` (`ErrorResponse` — `{ response?.data?.detail }`). Часть запросов включает показ уведомления об ошибке флагом `showErrorNotification: true` (например `getSettings`, `AttachmentsAPI.*`). Права доступа (`core.can_*_RFI`) описаны в `module/api/permissions.ts` и проверяются на стороне backend RFI (`RFITokenBasedPermission`).