# Эндпоинты, с которыми взаимодействует 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`).
