# Эндпоинты и хосты сервисов для sarex-frontend

Документ описывает базовые хосты сервисов, к которым обращается фронтенд-шелл
`sarex-frontend`, и удалённые модули (Module Federation), которые он подгружает.
Backend для этого приложения — `sarex-backend` (Django), его конфигурация и
переменные описаны в `CONFIGURATION.md`, а серверное REST API — в `openapi.yaml`.

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

`sarex-frontend` — это host-приложение на **Webpack Module Federation**. Реестр
хостов задаётся декларативно в `endpoints.js` (корень репозитория): объект вида
`<сервис>.<тип>.<окружение>` → URL. Возможные типы:

- `api` / `apiV1` / `apiV2` / … — базовый URL REST API сервиса;
- `module` — URL `remoteEntry.js` удалённого микрофронтенда;
- `gateway` — базовый URL gateway.

Окружение выбирается сборочной переменной `ENDPOINT` (`process.env.ENDPOINT`,
по умолчанию `prod`) в `webpack.common.js`. Значения `endpoints.js[сервис][тип][ENDPOINT]`
пробрасываются в код как константы `process.env.<CONST>` через `DefinePlugin`
(объект `processEnvByEndpoint`), напр. `endpoints.bim.api[ENDPOINT]` → `BIM_API`.

Для локального запуска backend-таргет задаётся отдельно в `env.js`
(`SAREX_BACKEND`, по умолчанию `https://stage.sarex.io/`) и используется
dev-сервером (`webpack.dev.js`) как прокси; собственный Django-backend в окружении
`contour` доступен по относительным путям (пустой хост).

## Окружения (`ENDPOINT`)

| Значение | Назначение |
| --- | --- |
| `prod` | Продакшн (`https://api.sarex.io`, `https://modules.sarex.io`) |
| `stage` | Stage (`https://stage-api.sarex.io`, `https://stage-modules.sarex.io`) |
| `preprod` | Preprod (`https://api.preprod.sarex.io`, `https://modules.preprod.sarex.io`) |
| `contour` | Изолированный контур — относительные пути (пустой хост) |
| `local` | Локальная разработка (задан не у всех сервисов) |

> У части сервисов `gateway` определены также специальные ключи `contour_local`
> (`https://stage.sarex.io`) и `contour_prod` (`https://lk.sarex.io`).

## Базовые хосты API-сервисов

Итоговый URL = `<базовый хост сервиса>` + путь запроса.

| Сервис (`endpoints.*`) | Константа | `stage` | `prod` | `contour` |
| --- | --- | --- | --- | --- |
| `api.api` | `SAREX_API` | `https://stage-api.sarex.io` | `https://api.sarex.io` | `""` |
| `bim.api` | `BIM_API` | `https://stage-api.sarex.io/bim/api/v1` | `https://api.sarex.io/bim/api/v1` | `""` |
| `bim.apiV2` | `BIM_API_V2` | `…/bim/api/v2` | `…/bim/api/v2` | `""` |
| `bim.files` | `BIM_FILES` | `…/bim` | `…/bim` | `""` |
| `workspaces.api` / `workspacesV2.api` | `WORKSPACESV2_API` | `…/workspaces/` | `…/workspaces/` | `/workspaces/` |
| `workflows.api` | `WORKFLOWS_API` | `…/workflows` | `…/workflows` | `/workflows` |
| `remarks.api` | `REMARKS_API` | `…/remarks/api/v1` | `…/remarks/api/v1` | `/remarks/api/v1` |
| `issues.api` | `ISSUES_API` | `…/issues/api/v1` | `…/issues/api/v1` | `/issues/api/v1` |
| `issuesBase.api` | `ISSUES_BASE_API` | `…/issues/api` | `…/issues/api` | `/issues/api` |
| `flows.api` | — | `…/issues/api/v1` | `…/issues/api/v1` | `/issues/api/v1` |
| `inspections.api` | — | `…/inspections/api/v1` | `…/inspections/api/v1` | `/inspections/api` |
| `documentations.api` | `DOCUMENTATIONS_API` | `…/documentations/api/v1` | `…/documentations/api/v1` | `/documentations/api/v1` |
| `pm.api` | — | `…/documentations/api/v1` | `…/documentations/api/v1` | `/documentations/api/v1` |
| `analyticsV2.api` | — | `…/analytics-v2/api/v1` | `…/analytics-v2/api/v1` | `/analytics-v2/api/v1` |
| `analytics.api` | `ANALYTICS_API` | `…/analytics` | `…/analytics` | `/analytics` |
| `processes.api` | `PROCESSES_API` | `…/flows/api/v1` | `…/flows/api/v1` | `/flows/api/v1` |
| `gateway.gateway` | `GATEWAY` | `…/gateway` | `…/gateway` | (local: `http://localhost:9000/gateway`) |
| `gateway.api` | `GATEWAY_API` | `…/gateway/api/v1` | `…/gateway/api/v1` | `/gateway/api/v1` |
| `gateway.apiV2` | `GATEWAY_API_V2` | `…/gateway/api/v2` | `…/gateway/api/v2` | `/gateway/api/v2` |
| `eav.api` | `EAV_API` | `…/eav/api/v0` | `…/eav/api/v0` | `/eav/api/v0` |
| `eav.apiV1…apiV4` | `EAV_API_V1…V4` | `…/eav/api/v1…v4` | `…/eav/api/v1…v4` | `/eav/api/v1…v4` |
| `notifications.api` | `NOTIFICATIONS_API` | `…/lambdas/notification/` | `…/lambdas/notification/` | `""` |
| `lambdas.api` | `LAMBDAS_API` | `…/lambdas` | `…/lambdas` | `/lambdas` |
| `automations.api` | `AUTOMATIONS_API` | `…/automation/api/v1` | `…/automation/api/v1` | `/automation/api/v1` |
| `orchestrator.api` | `ORCHESTRATOR_API` | `…/orchestrator` | `…/orchestrator/api` | `/orchestrator/api` |

> `…` = `https://stage-api.sarex.io` (stage) или `https://api.sarex.io` (prod).
> Собственный Django-backend (`sarex-backend`) в контуре обслуживается по
> относительным путям `/api/...` — см. `openapi.yaml`.

## Удалённые модули (Module Federation, `remoteEntry.js`)

Хост подгружает микрофронтенды по URL из `endpoints.<сервис>.module[ENDPOINT]`.
Базовый хост модулей: `https://stage-modules.sarex.io` (stage) /
`https://modules.sarex.io` (prod); в контуре — относительные пути.

| Сервис | Константа | Путь `module` (относительный, контур) |
| --- | --- | --- |
| `workspaces` | `WORKSPACES_MODULE` | `/workspaces/module/remoteEntry.js` |
| `workspacesV2` | `WORKSPACESV2_MODULE` | `/workspaces-v2/module/remoteEntry.js` |
| `workflows` | `WORKFLOWS_MODULE` | `/workflows/module/remoteEntry.js` |
| `remarks` | `REMARKS_MODULE` | `/remarks/static/module/remoteEntry.js` |
| `issues` | `ISSUES_MODULE` | `/issues/static/module/remoteEntry.js` |
| `flows` | `FLOWS_MODULE` | `/flows/static/module/remoteEntry.js` |
| `inspections` | `INSPECTIONS_MODULE` | `/inspections/static/module/remoteEntry.js` |
| `documentations` | `DOCUMENTATIONS_MODULE` | `/documentations/static/module/remoteEntry.js` |
| `pm` | `PM_MODULE` | `/pm/module/remoteEntry.js` |
| `projects` | `PROJECTS_MODULE` | `/projects/static/module/remoteEntry.js` |
| `analyticsV2` | `ANALYTICS_MODULE` | `/analytics-v2/static/module/remoteEntry.js` |
| `reviews` | `REVIEWS_MODULE` | `/reviews/static/module/remoteEntry.js` |
| `administration` | `ADMINISTRATION_MODULE` | `/control-interface/modules/admin/remoteEntry.js` |
| `adminProc` | `ADMIN_PROC_MODULE` | `/admin-frontend/static/module/remoteEntry.js` |
| `assets` | `ASSETS_MODULE` | `/control-interface/modules/assets/remoteEntry.js` |
| `premises` | `PREMISES_MODULE` | `/premises/static/module/remoteEntry.js` |
| `contracts` | `CONTRACTS_MODULE` | `/cotracts/static/module/remoteEntry.js` |
| `transmittal` | `TRANSMITTAL_MODULE` | `/transmittal/static/module/remoteEntry.js` |
| `prescriptions` | `PRESCRIPTIONS_MODULE` | `/prescriptions/static/module/remoteEntry.js` |
| `rfi` | `RFI_MODULE` | `/rfi/static/module/remoteEntry.js` |
| `assistant` | — | `/assistant/static/module/remoteEntry.js` |

Список подключаемых в ЛК модулей (пункты меню) дублируется на стороне backend в
`SAREX_MODULES` (ConfigMap `django-configmap`): `remarks`, `issues`,
`documentations`, `reviews`, `processes`, `rfi`, `transmittal`.

## Backend, обслуживающий шелл

Основной API самого шелла (аутентификация, пользователи, настройки приложения,
проекты/цели/миссии, аналитика) — это `sarex-backend` под префиксом `/api/...`
(и `/internal/...` для внутрикластерных вызовов). Полное описание серверных
эндпоинтов приведено в `openapi.yaml`. Ключевые группы:

| Префикс | Назначение |
| --- | --- |
| `/api/token…`, `/api/auth/…`, `/api/login`, `/api/logout` | Аутентификация и JWT |
| `/api/app-settings/` | Настройки приложения |
| `/api/core/…` | Пользователи, компании, цели, миссии, ортофото, облака точек и т.д. |
| `/api/client/…` | Клиентский дашборд, загрузки, self-сервис |
| `/api/analytics/…` | Аналитические дашборды, метрики, виджеты |
| `/api/map/…` | Кадастр и заметки на карте |
| `/api/pg/…` | Облака точек, экспорт, измерения |
| `/internal/client/…` | Внутренние вызовы (настройки, токены) |
