# Эндпоинты, с которыми взаимодействует flows-frontend

Документ описывает все HTTP-эндпоинты внешних сервисов, к которым обращается модуль (микрофронтенд `flows-frontend`).

## Как устроено взаимодействие

В отличие от единого реестра эндпоинтов, запросы во `flows-frontend` выполняются **точечно** из MobX-сторов (`module/store/stores/*.ts`) через общий HTTP-клиент `httpService`.

`httpService` создаётся в `module/api/http-service.ts` фабрикой `createHttpService` из `@sarex-team/sdk-js`. Клиент предоставляет методы `getRequest`, `postRequest`, `putRequest`, `patchRequest`, `deleteRequest`, каждый из которых принимает объект вида:

```ts
httpService.getRequest({
    service: "flows",              // логическое имя сервиса (ключ из hosts.ts)
    url: `/flows/${id}/?full=true`, // путь запроса относительно базового хоста сервиса
    data: { ... },                  // тело запроса (для post/put/patch)
    // ...прочие опции axios
});
```

Базовый хост сервиса подставляется по ключу `service` из `module/api/hosts.ts` в зависимости от `BUILD_ENV`. Итоговый URL = `<базовый хост сервиса>` + `url`.

Окружение выбирается переменной `BUILD_ENV` (`module/env.js`): одно из `local`, `stage`, `prod`, `preprod`, `contour`, `severstal`, `uralchem`. В `webpack.config.js` значение прокидывается в бандл через `DefinePlugin`. Значение по умолчанию при резолве хоста — `prod`.

Подключаемый удалённый модуль (`documentations`) описан отдельно в `module/api/modules-hosts.ts` и резолвится функцией `getModuleHost` (Module Federation, `remoteEntry.js`).

## Базовые хосты по сервисам и окружениям

Значения из `module/api/hosts.ts`. Показаны `stage` и `prod`; дополнительно определены `local`, `preprod` и `contour` (в `contour` — относительные пути для изолированного контура; в `local` сервис `sarex` проксируется на `/sarex-backend`).

| Сервис (`service`) | Назначение | `stage` | `prod` |
| --- | --- | --- | --- |
| `flows` | Сервис процессов согласования (flows, reviews, steps, statuses) | `https://stage-api.sarex.io/flows/api/v1` | `https://api.sarex.io/flows/api/v1` |
| `sarex` | Локальный backend (Django `core`/`client`) | `""` (относительные пути) | `""` |
| `gateway_api_v1` | Gateway API v1 (ресурсы) | `https://stage-api.sarex.io/gateway/api/v1` | `https://api.sarex.io/gateway/api/v1` |
| `gateway_api_v2` | Gateway API v2 (пользователи) | `https://stage-api.sarex.io/gateway/api/v2` | `https://api.sarex.io/gateway/api/v2` |
| `documentations` | Сервис документации (диски, документы) | `https://stage-api.sarex.io/documentations/api/v1` | `https://api.sarex.io/documentations/api/v1` |
| `eav_api_v0` | Сервис EAV (атрибуты/схемы) | `https://stage-api.sarex.io/eav/api/v0` | `https://api.sarex.io/eav/api/v0` |
| `checklists` | Сервис чек-листов | `https://stage-api.sarex.io/checklists/api/v1` | `https://api.sarex.io/checklists/api/v1` |
| `transmittals` | Сервис передачи документации (шаблоны) | `https://stage-api.sarex.io/transmittals/api/v1` | `https://api.sarex.io/transmittals/api/v1` |
| `zitadel` | IdP (аутентификация) | `https://idp.dev.stage.sarex.io` | `https://login.sarex.io` |

Удалённые модули (`module/api/modules-hosts.ts`):

| Модуль | `stage` | `prod` |
| --- | --- | --- |
| `documentations` | `https://stage-modules.sarex.io/documentations/static/module/remoteEntry.js` | `https://modules.sarex.io/documentations/static/module/remoteEntry.js` |

## Эндпоинты по сервисам

### `flows` — Сервис процессов согласования

Источник: `module/store/stores/processes.ts`, `module/store/stores/resources.ts`.

| Метод (`*Request`) | Путь | Стор / метод | Назначение |
| --- | --- | --- | --- |
| GET | `/flows/{id}/?full=true` | `processes.loadFlow` | Маршрут по id (с шагами/статусами) |
| POST | `/flows/filter/` | `processes` (фильтр) | Список маршрутов по фильтру |
| POST | `/flows/count_flows_by_resource/` | `processes` | Количество маршрутов по ресурсам |
| POST | `/flows/count_flows_by_resource/` | `processes.getCountByResourceId` | Количество маршрутов для одного ресурса |
| POST | `/flows/` | `processes.createFlow` | Создать маршрут |
| POST | `/flows/{id}/copy/?full=true` | `processes` (копирование) | Копировать маршрут |
| PUT | `/flows/{id}/?full=true` | `processes` (обновление) | Обновить маршрут |
| PATCH | `/flows/bulk-update/` | `processes.bulkUpdateFlow` | Массовое обновление маршрутов |
| POST | `/steps/` | `processes.createStep` | Создать шаг |
| PUT | `/steps/{id}/?full=true` | `processes.updateStep` | Обновить шаг |
| PATCH | `/steps/{stepId}/update_reviewers/` | `processes` | Обновить согласующих шага |
| GET | `/steps/{id}/active_reviews/` | `processes.getActiveReviewsForReviewer` | Активные review на шаге |
| POST | `/statuses/` | `processes.createStatus` | Создать статус |
| DELETE | `/statuses/{id}/` | `processes.deleteStatus` | Удалить статус |
| POST | `/reviews/count_by_resource_id/` | `resources` | Количество review по ресурсу |

### `sarex` — Локальный backend (Django)

Источник: `module/store/stores/users.ts`.

| Метод | Путь | Стор / метод | Назначение |
| --- | --- | --- | --- |
| GET | `/api/client/settings/` | `users.getCurrentUser` | Настройки/данные текущего пользователя |
| GET | `/api/core/users/?company={id}&{query}` | `users.getUsers` / `getUsersByCompanyId` / `getAllUsersByCompanyId` | Пользователи компании |
| GET | `/api/core/admin/departments/?{query}` | `users.fetchDepartmentsSA` | Департаменты (service account) |
| GET | `/api/core/admin/departments/?company={id}&{query}` | `users.fetchDepartmentsByCompanyId` | Департаменты компании |
| GET | `/api/core/admin/positions/?{query}` | `users.fetchPositionsSA` | Должности (service account) |
| GET | `/api/core/admin/positions/?company={id}&{query}` | `users.fetchPositionsByCompanyId` | Должности компании |

### `gateway_api_v1` — Gateway API v1 (ресурсы)

Источник: `module/store/stores/resources.ts`.

| Метод | Путь | Стор / метод | Назначение |
| --- | --- | --- | --- |
| GET | `/resources/?{query}` | `resources` | Список ресурсов (по фильтру) |
| GET | `/resources/?company_id={id}` | `resources` | Ресурсы компании |

### `gateway_api_v2` — Gateway API v2 (пользователи)

Источник: `module/store/stores/users.ts`.

| Метод | Путь | Стор / метод | Назначение |
| --- | --- | --- | --- |
| GET | `/users/?{query}` | `users.getUsersByResourceId` | Пользователи по ресурсу |

### `documentations` — Сервис документации

Источник: `module/store/stores/documents.ts`.

| Метод | Путь | Стор / метод | Назначение |
| --- | --- | --- | --- |
| GET | `/disks/{id}/documents` | `documents.fetchDocumentsByDiskId` | Документы диска |

### `eav_api_v0` — Сервис EAV (атрибуты)

Источник: `module/store/stores/attributes.ts`.

| Метод | Путь | Стор / метод | Назначение |
| --- | --- | --- | --- |
| GET | `/schema/?model_name=flow&company_id={id}` | `attributes.fetchFlowsAttributes` | Схема атрибутов для модели `flow` |

### `checklists` — Сервис чек-листов

Источник: `module/store/stores/checklists.ts`.

| Метод | Путь | Стор / метод | Назначение |
| --- | --- | --- | --- |
| POST | `/checklists/filter/` | `checklists.fetchChecklists` | Список чек-листов по фильтру |

### `transmittals` — Сервис передачи документации

Источник: `module/store/stores/transmittals.ts`.

| Метод | Путь | Стор / метод | Назначение |
| --- | --- | --- | --- |
| POST | `/transmittal_templates` | `transmittals` | Шаблоны трансмитталов (пагинация по `next`, фильтр по `resources`) |

### `zitadel` — IdP

Хост определён в `hosts.ts` для аутентификации через SDK; прямых вызовов из сторов в текущей версии модуля нет (используется инфраструктурой `@sarex-team/sdk-js`).

## Замечания

- Единого файла-реестра эндпоинтов (`endpoints.ts`) во `flows-frontend` нет — вызовы разбросаны по сторам `module/store/stores/*`. При добавлении нового запроса указывайте `service` строго из ключей `hosts.ts`.
- Часть путей содержит завершающий слэш и query-параметры прямо в строке `url` (напр. `/flows/{id}/?full=true`) — это соответствует поведению backend (`flows-backend`), где роуты объявлены со слэшем на конце.
- Сервис `sarex` в `stage`/`prod` имеет пустой базовый хост (`""`), то есть запросы идут по относительным путям того же origin; в `local` он проксируется на `/sarex-backend`, в `contour` — на относительные пути контура.
