iac/apps/workspaces/ENDPOINTS-workspace-v2-frontend.md
2026-07-13 17:50:20 +03:00

207 lines
20 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.

# Эндпоинты, с которыми взаимодействует workspace-v2-frontend
Документ описывает все HTTP-эндпоинты внешних сервисов, к которым обращается микрофронтенд `workspace-v2-frontend`, а также способ конфигурирования базовых хостов на этапе сборки.
## Как устроено взаимодействие
Все запросы описаны декларативно в реестре `module/networking/endpoints.ts` (объект `endpoints`). Каждый эндпоинт задаётся структурой `Endpoint`:
- `service` — логическое имя сервиса (enum `EServices` из `module/httpService/hosts.ts`);
- `method` — HTTP-метод (`EMethod`: `GET`/`POST`/`PUT`/`PATCH`/`DELETE`);
- `auth` — требуется ли авторизация;
- `path(args)` — функция, возвращающая путь запроса (с подстановкой параметров/query);
- `body(args)` — опционально, формирование тела запроса.
Запрос выполняется единой функцией `fetch(endpoint, params)` (`module/networking/endpoints.ts`), которая вызывает `httpService.getRequest(...)` (`module/httpService/httpService.tsx`, поверх `@sarex-team/sdk-js`). Базовый хост подставляется `resolveHost(service)` из `module/httpService/hosts.ts` — обёрткой над `resolveHost` из SDK, которая по `buildEnv` выбирает набор хостов из `allHosts`. Подключаемые удалённые модули (module federation) описаны отдельно в `module/config/module-hosts.ts`.
## Конфигурирование (базовые хосты, `BUILD_ENV`)
Фронтенд конфигурируется **только на этапе сборки** — переменной окружения `BUILD_ENV`. Рантайм-переменных окружения у собранного бандла нет.
Значение подставляется в бандл через `webpack.DefinePlugin` как константа `__BUILD_ENV__` (`webpack/config.build.js`, `config.serve.js`, `config.start.js`). Модуль `module/httpService/buildEnv.ts` читает её: `buildEnv = __BUILD_ENV__ || EBuildEnv.prod`**по умолчанию `prod`**. Допустимые значения проверяются в `webpack/env.js` (`BUILD_ENV = process.env.BUILD_ENV || "prod"`).
| Переменная | Где задаётся | Назначение |
| --- | --- | --- |
| `BUILD_ENV` | build-arg в `.gitlab-ci.yml``ARG BUILD_ENV` в `Dockerfile``npm run build` | Окружение сборки; определяет набор базовых хостов. Значение по умолчанию — `prod` |
| `NPM_NEXUS_TOKEN` | build-arg в `.gitlab-ci.yml``ARG NPM_NEXUS_TOKEN` в `Dockerfile` (`.npmrc`) | Токен доступа к приватному npm-реестру `nexus.infra.sarex.io` при установке зависимостей |
Допустимые значения `BUILD_ENV` (`EBuildEnv` в `module/httpService/buildEnv.ts` / `webpack/env.js`): `local`, `stage`, `prod`, `preprod`, `contour`, `severstal`, `uralchem`. В CI (`.gitlab-ci.yml`) собираются стадии `preprod`, `stage`, `prod`. Локальные npm-скрипты: `start``local`, `serve``stage`, `storybook``local`.
> Замечание: окружения `severstal` и `uralchem` в коде помечены комментариями «уточнить в будущем используется ли».
## Базовые хосты по сервисам и окружениям
Значения из `module/httpService/hosts.ts` (`allHosts`). Итоговый URL = `<базовый хост сервиса>` + `path` эндпоинта. Ниже приведены основные окружения `stage` и `prod`; полный набор (`local`, `preprod`, `contour`, `severstal`, `uralchem`) — в `allHosts`.
| Сервис (`EServices`) | Назначение | `stage` | `prod` |
| --- | --- | --- | --- |
| `workspaces` | Сервис рабочих областей | `https://stage-api.sarex.io/workspaces` | `https://api.sarex.io/workspaces` |
| `documentations` | Сервис документации | `https://stage-api.sarex.io/documentations` | `https://api.sarex.io/documentations` |
| `workflows` | Сервис обработки документов | `https://stage-api.sarex.io/workflows` | `https://api.sarex.io/workflows` |
| `sarexApi` | Gateway/API Sarex (`/gateway`, `/files`, `/issues`, `/notes`, `/mapper`) | `https://stage-api.sarex.io` | `https://api.sarex.io` |
| `gateway` | Gateway Sarex | `https://stage-api.sarex.io/gateway` | `https://api.sarex.io/gateway` |
| `sarex` | Локальный сервис данных (ядро/ЛК) | `/` | `/` |
| `bim` | BIM-API (v1) | `https://stage-api.sarex.io/bim` | `https://api.sarex.io/bim` |
| `bimv2` | BIM-API (v2) | `https://stage-api.sarex.io/bimv2` | `https://api.sarex.io/bimv2` |
| `comparisons` | Сервис сравнений | `https://stage-api.sarex.io/comparisons` | `https://api.sarex.io/comparisons` |
| `checklists` | Сервис чек-листов | `https://stage-api.sarex.io/checklists` | `https://api.sarex.io/checklists` |
| `remarks` | Сервис замечаний | `https://stage-api.sarex.io/remarks` | `https://api.sarex.io/remarks` |
| `google` | Временное хранилище (GCS) | `https://storage.googleapis.com/srx-tmp` | `https://storage.googleapis.com/srx-tmp` |
| `zitadel` | IdP (аутентификация) | `https://idp.dev.stage.sarex.io` | `https://login.sarex.io` |
| `sarexAgents` | Сервис агентов | `https://sarex-agents.dev.stage.sarex.io` | `https://agents.sarex.tech` |
| `eavV4` | EAV API v4 | `https://stage-api.sarex.io/eav/api/v4` | `https://api.sarex.io/eav/api/v4` |
| `premises` | Сервис помещений | `https://stage-api.sarex.io/premises/api/v1` | `https://api.sarex.io/premises/api/v1` |
| `absolute` | Пустой хост (относительные/полные URL) | `""` | `""` |
> В `local` сервис `sarex` проксируется на `https://localhost:9000/sarex-backend`, остальные — на `https://localhost:9000/sarex-api-backend/...`. В `contour` используются относительные пути (`/workspaces`, `/documentations` и т.д.). Сервисы `checklists`, `remarks` (помечен в коде как «не используется»), `google`, `zitadel`, `sarexAgents`, `eavV4`, `premises` объявлены в хостах, но в текущем реестре `endpoints.ts` эндпоинтов к ним нет.
## Подключаемые модули (module federation)
Хосты remoteEntry для микрофронтендов (`module/config/module-hosts.ts`, выбор по `buildEnv`):
| Модуль | `stage` | `prod` |
| --- | --- | --- |
| `documentations` | `https://stage-modules.sarex.io/documentations/static/module/remoteEntry.js` | `https://modules.sarex.io/documentations/static/module/remoteEntry.js` |
| `assistant` | `https://stage-modules.sarex.io/assistant/static/module/remoteEntry.js` | `https://modules.sarex.io/assistant/static/module/remoteEntry.js` |
## Эндпоинты по сервисам
### `workspaces` — Сервис рабочих областей
| Ключ | Метод | Auth | Путь | Назначение |
| --- | --- | --- | --- | --- |
| `getWorkspaceStates` | GET | да | `/api/v1/workspaces/{uuid}/states` | Список состояний рабочей области |
| `getWorkspaceStatesActual` | GET | да | `/api/v1/workspaces/{uuid}?version={currentStateIdState}` | Актуальное состояние по версии |
| `saveWorkspaceState` | POST | да | `/api/v1/workspaces/{uuid}/states` | Сохранить состояние (тело — объект `state`) |
| `editWorkspaceState` | PATCH | да | `/api/v1/states/{uuid}` | Изменить состояние (`name`/`data`) |
| `putDefaultState` | PATCH | да | `/api/v1/states/{uuid}` | Пометить состояние как дефолтное (`is_default`) |
| `deleteWorkspaceState` | DELETE | да | `/api/v1/states/{uuid}` | Удалить состояние |
| `getCompanyApps` | GET | да | `/api/v1/company/{companyId}/apps` | Приложения компании |
| `createAppInstance` | POST | да | `/api/v1/workspaces/{workspaceId}/apps/{appId}/instances` | Создать инстанс приложения |
| `postDocument` | POST | да | `/api/v1/workspaces/{uuid}/documents` | Привязать документ к рабочей области (`document_id`) |
| `deleteDocument` | DELETE | да | `/api/v1/workspaces/{workspaceId}/documents/{documentId}` | Отвязать документ от рабочей области |
### `documentations` — Сервис документации
| Ключ | Метод | Auth | Путь | Назначение |
| --- | --- | --- | --- | --- |
| `getDocumet` | GET | да | `/api/v1/documents/{docId}?extend=bundles` | Документ с бандлами |
| `deleteWorkspace` | DELETE | да | `/api/v1/documents/{id}` | Удалить документ |
| `getCompanyIdByDocId` | GET | да | `/api/v1/documents/{docId}/company` | Компания документа |
| `getDocumentTypes` | GET | да | `/api/v1/documents/types` | Типы документов |
| `getDocumentPermissions` | GET | да | `/api/v1/documents/{id}/permissions` | Права доступа документа |
| `getDisks` | GET | да | `/api/v1/disks` | Список дисков |
| `getDocumentsByDisk` | GET | да | `/api/v1/disks/{diskId}/documents` | Документы диска |
| `fetchReviewDocuments` | POST | да | `/api/v1/disks/{diskId}/documents` | Документы по набору id (`document_ids`) |
| `getFile` | GET | да | `/api/v1/bundles/{bundleId}/pdf/download` | Скачать PDF бандла |
| `downloadFile` | GET | да | `/api/v1/bundles/{bundleId}/{key}/download` | Скачать файл бандла |
| `downloadAllFiles` | GET | да | `/api/v1/bundles/{bundleId}/download` | Скачать все файлы бандла |
| `updateBundle` | PATCH | да | `/api/v1/bundles/{bundleId}` | Обновить бандл (`attributes`) |
| `restartWorkflow` | POST | да | `/api/v1/bundles/{bundleId}/restart` | Перезапустить workflow бандла |
### `sarexApi` — Gateway/API Sarex
| Ключ | Метод | Auth | Путь | Назначение |
| --- | --- | --- | --- | --- |
| `getDocuments` | GET | да | `/gateway/api/v1/disks/{diskId}/documents?parent_id=&child_id=&search=` | Документы диска (фильтры) |
| `loadFile` | GET | да | `/files/api/v1/bundles/{bundleId}/{key}` | Файл бандла |
| `getPagePdf` | GET | да | `{url}` | PDF-страница по произвольному URL |
| `getRemarksByDocument` | POST | да | `/issues/api/issues/filter/?limit=&offset=` | Замечания документа (фильтр) |
| `getRemark` | GET | да | `/issues/api/issues/{uuid}/` | Замечание по uuid |
| `getCustomStatuses` | GET | да | `/issues/api/companies/{companyId}/status-model/v2/?issue_type_id={issueType}` | Модель статусов замечаний компании |
| `getIssueTypes` | GET | да | `/issues/api/issue-types/?company_id={companyId}` | Типы замечаний компании |
| `getNotes` | GET | да | `/mapper/api/v1/notes/workspace/workspace/{instanceId}/?{query}` | Заметки рабочей области |
| `createLinkNote` | POST | да | `/notes/api/v1/links/` | Привязать ссылку к заметке (`link_id`, `note_id`) |
| `updateLinkNote` | POST | да | `/notes/api/v1/links/` | Обновить привязку ссылки к заметке |
### `sarex` — Локальный сервис данных (ядро/PM)
| Ключ | Метод | Auth | Путь | Назначение |
| --- | --- | --- | --- | --- |
| `getUsers` | GET | да | `/api/core/users` | Список пользователей |
| `getUser` | GET | да | `/api/core/users/{id}/` | Пользователь по id |
| `getUsersByIDs` | GET | да | `/api/core/users/?id={ids}` | Пользователи по набору id |
| `getTarget` | GET | да | `/api/core/targets/{targetId}/` | Таргет по id |
| `getCoordinates` | GET | да | `/api/commons/cs/` | Системы координат |
| `createLink` | POST | да | `/api/core/target-links/` | Создать ссылку таргета |
| `updateLink` | PUT | да | `/api/core/target-links/{id}/` | Обновить ссылку таргета |
| `deleteLink` | DELETE | да | `/api/core/target-links/{id}/` | Удалить ссылку таргета |
| `getProject` | GET | да | `/api/pm/msp/projects/?bundle_id={bundleID}&schema=tiny` | Проект по бандлу |
| `getProjectStates` | GET | да | `/api/pm/msp/projects/{projectID}/states/` | Состояния проекта |
| `getResources` | GET | да | `/api/pm/msp/resources/?parent=&type=&projects=&limit=&offset=` | Список ресурсов |
| `getResourceById` | GET | да | `/api/pm/msp/resources/{id}/` | Ресурс по id |
| `getInstancesResources` | GET | да | `/api/pm/msp/resources/?{query}&model={model}` | Ресурсы по инстансам/модели |
| `getResourcesTasks` | GET | да | `/api/pm/msp/resources-tasks/?{query}` | Задачи ресурсов |
| `getResourcesByElementAndDocumentId` | GET | да | `/api/pm/msp/resources/?limit=50000&offset=0&{instance}&model=&{path}&{projects}&documents={document}` | Ресурсы по элементу и документу |
| `createResource` | POST | да | `/api/pm/msp/resources/` | Создать ресурс |
| `updateResource` | PATCH | да | `/api/pm/msp/resources/{id}/` | Обновить ресурс |
| `deleteResource` | DELETE | да | `/api/pm/msp/resources/{id}/` | Удалить ресурс |
| `bulkCreate` | POST | да | `/api/pm/msp/resources/bulk_create/` | Массовое создание ресурсов |
| `createResourceConnection` | POST | да | `/api/pm/msp/resources/{resourceId}/bind_elements/` | Привязать элементы к ресурсу |
| `getResourceConnection` | GET | да | `/api/pm/msp/resources-elements/?resources=&instances=&path=` | Связи ресурс–элемент |
| `deleteResourceConnection` | DELETE | да | `/api/pm/msp/resources-elements/{connectionId}/` | Удалить связь ресурс–элемент |
### `gateway` — Gateway Sarex
| Ключ | Метод | Auth | Путь | Назначение |
| --- | --- | --- | --- | --- |
| `getThumbnails` | POST | да | `/api/v1/disks/{diskId}/thumbnails` | Превью документов (`document_ids`) |
| `getWorkspaceState` | GET | да | `/api/v1/workspace/states/{uuid}` | Состояние рабочей области |
| `getScreenShot` | GET | да | `/api/v1/workspace/{wsId}` | Скриншот/данные рабочей области |
| `getRelatedDocuments` | GET | да | `/api/v1/documents/related_documents?scope_id={bimId}&entity_id={bimElementId}` | Связанные документы элемента |
| `bindRelatedDocuments` | POST | да | `/api/v1/documents/related_documents` | Привязать связанные документы |
| `unbindRelatedDocuments` | POST | да | `/api/v1/documents/related_documents/bulk_delete` | Отвязать связанные документы (по `ids`) |
### `workflows` — Сервис обработки документов
| Ключ | Метод | Auth | Путь | Назначение |
| --- | --- | --- | --- | --- |
| `getWorkflow` | GET | да | `/api/v1/workflows/{id}` | Workflow по id |
### `bim` — BIM-API (v1)
| Ключ | Метод | Auth | Путь | Назначение |
| --- | --- | --- | --- | --- |
| `getElementsByIds` | GET | да | `/api/v1/bims/{id}/sarexid/{elementSarexIds}` | Элементы по sarex-id |
| `getElements` | GET | да | `{url}` | Элементы по произвольному URL |
| `postElementsStatus` | POST | да | `/api/v1/changes` | Обновить статус элементов |
### `bimv2` — BIM-API (v2)
| Ключ | Метод | Auth | Путь | Назначение |
| --- | --- | --- | --- | --- |
| `getBimElementById` | GET | да | `/api/v1/bims/{bimId}` | BIM-модель по id |
| `getElementsByIdsV2` | POST | да | `/api/v1/bims/{id}/sarexid?with_hierarchy={isHierarchy}` | Элементы по sarex-id (`sarex_ids`) |
| `getElementsV2` | GET | да | `{url}` | Элементы по произвольному URL |
| `getElementsAsCsv` | POST | да | `/api/v1/bims/{bundleBimId}/csv_properties` | Выгрузка свойств элементов в CSV |
| `getElementPropertiesById` | GET | да | `/api/v1/bims/{bimId}/elements/{elementSarexId}/properties` | Свойства элемента |
| `getElementStatusesById` | GET | да | `/api/v1/bims/{bimId}/status_models` | Модели статусов |
| `getElementsFilterFields` | GET | да | `/api/v1/bims/{bimId}/filter_fields` | Поля фильтрации элементов |
| `postFilterElements` | POST | да | `/api/v1/bims/{bimId}/elements` | Фильтрация элементов (`filters`) |
| `postElementsStatusV2` | POST | да | `/api/v1/changes` | Обновить статус элементов |
| `updateElementsStatuses` | POST | да | `/api/v1/bims/{bimId}/changes?with_hierarchy={isHierarchy}` | Обновить статусы (`new_status_type/value`) |
| `fetchChangeLogs` | GET | да | `/api/v1/bims/{bimId}/changes?sarex_ids=&status_type=&offset=&limit=` | Журнал изменений статусов |
| `fetchElementsStatuses` | GET | да | `/api/v1/bims/{bimId}/statuses` | Статусы элементов |
| `fetchElementsStatusColor` | GET | да | `/api/v1/bims/{bimId}/statuses_color` | Цвета статусов |
### `comparisons` — Сервис сравнений
| Ключ | Метод | Auth | Путь | Назначение |
| --- | --- | --- | --- | --- |
| `getComparisonElements` | GET | да | `/api/v1/elements?{params}` | Элементы сравнения |
| `getFilterFields` | GET | да | `/api/v1/filter_fields?doc_id={id}` | Поля фильтрации |
| `getTolerance` | GET | да | `/api/v1/tolerance?bundle_id={id}` | Допуски по бандлу |
| `updateElementField` | PATCH | да | `/api/v1/elements/{elementId}` | Обновить поле элемента |
### `absolute` — Пустой хост (произвольные URL)
| Ключ | Метод | Auth | Путь | Назначение |
| --- | --- | --- | --- | --- |
| `cloudJS` | GET | нет | `{path}` | Загрузка ресурса по пути без авторизации |
| `cloudJSWithAuth` | GET | да | `{path}` | То же, с авторизацией |
| `getLoadElements` | GET | да | `{path}` | Загрузка элементов по произвольному пути |
## Обработка ошибок
Запросы проходят через `fetch` (`module/networking/endpoints.ts`): при ошибке она логируется в консоль (`console.error`) и возвращается объект ошибки вызывающему коду. Централизованного маппинга кодов ответов в человекочитаемые сообщения (как в v1-фронтенде) в реестре нет — обработка ошибок выполняется на уровне вызывающих модулей/`httpService`.