# Эндпоинты, с которыми взаимодействует remarks-frontend Документ описывает все HTTP-эндпоинты внешних сервисов, к которым обращается модуль (микрофронтенд `remarks-frontend`). ## Как устроено взаимодействие В отличие от `transmittal-frontend`, в `remarks-frontend` **нет декларативного реестра эндпоинтов** (`endpoints.ts`). Запросы формируются по месту — в API-объектах (`module/api/*.ts`) и в MobX-сторах (`module/store/*.ts`) — прямыми вызовами методов `httpService`: - `httpService.getRequest(options)` - `httpService.postRequest(options)` - `httpService.putRequest(options)` (объявлен, в коде не используется) - `httpService.patchRequest(options)` - `httpService.deleteRequest(options)` Каждый вызов задаётся объектом-параметром: - `service` — логическое имя сервиса (см. таблицу хостов ниже), определяет базовый хост; - `url` — путь запроса (часто шаблонная строка с подстановкой id/query); - `data` — тело запроса (для `POST`/`PATCH`/`PUT`); - `axiosConfig` — доп. настройки axios (`params` для query-параметров, `responseType: "blob"` для файлов и т.п.); - `showErrorNotification` — включает показ уведомления об ошибке средствами SDK. `httpService` (`module/api/http-client.ts`) — это `Proxy` поверх базового `baseHttpService` (`module/api/http-service.ts`, создаётся через `createHttpService` из `@sarex-team/sdk-js`). Прокси добавляет единую обработку ответа `403`: показывает toast с текстом `response.data.detail` либо сообщением «У вас недостаточно прав для выполнения данного действия.». Базовый хост подставляется SDK по значению `service` и текущему окружению `BUILD_ENV` (значения — из `module/api/hosts.ts`, по умолчанию `prod`). В окружении `local` тип HTTP-сервиса переключается на `zitadel` (`setTypeOfHttpService("zitadel")`). Итоговый URL = `<базовый хост сервиса>` + `url` эндпоинта. ## Базовые хосты по сервисам и окружениям Значения из `module/api/hosts.ts`. | Сервис (`service`) | Назначение | `stage` | `prod` | | --- | --- | --- | --- | | `remarks` | Сервис замечаний | `https://stage-api.sarex.io/remarks` | `https://api.sarex.io/remarks` | | `sarexApi` | Gateway/API Sarex (`/issues`, `/flows`, `/eav`) | `https://stage-api.sarex.io` | `https://api.sarex.io` | | `gateway` | Gateway Sarex | `https://stage-api.sarex.io/gateway` | `https://api.sarex.io/gateway` | | `documentations` | Сервис документации | `https://stage-api.sarex.io/documentations` | `https://api.sarex.io/documentations` | | `eavV4` | Сервис атрибутов/ассетов (EAV v4) | `https://stage-api.sarex.io/eav/api/v4` | `https://api.sarex.io/eav/api/v4` | | `sarex` | Локальный сервис данных (`/api/core`, `/api/client`) | `""` (относительные пути) | `""` | | `zitadel` | IdP (аутентификация) | `https://idp.dev.stage.sarex.io` | `https://login.sarex.io` | > Также определены окружения `local` и `preprod`. В `preprod` хосты указывают на `https://api.preprod.sarex.io/*` (для `zitadel` — `https://login.preprod.sarex.io`). В `local` сервис `sarex` проксируется на `/sarex-backend`, а остальные сервисы указывают на `stage`-хосты (`https://stage-api.sarex.io/*`, `zitadel` → `https://idp.dev.stage.sarex.io`). Сервис `zitadel` явно в коде не вызывается — используется SDK для аутентификации. ## Эндпоинты по сервисам ### `sarexApi` — Gateway/API Sarex (issues / flows / eav) Базовый хост — корневой (`https://-api.sarex.io`); маршрутизация задаётся префиксами пути (`/issues/api`, `/flows/api`, `/eav/api`). | Метод | Путь | Назначение | Где вызывается | | --- | --- | --- | --- | | POST | `/issues/api/issues/filter/` | Список/фильтрация замечаний (пагинация `limit`/`offset`) | `api/issues/issues.ts` | | POST | `/issues/api/issues/` | Создать замечание | `store/collectionRemarks.ts` | | GET | `/issues/api/issues/{uuid}/` | Замечание по uuid | `store/collectionRemarks.ts` | | PATCH | `/issues/api/issues/{uuid}/` | Обновить замечание | `store/collectionRemarks.ts`, `store/remarks.ts` | | POST | `/issues/api/issues/export/?{params}` | Экспорт замечаний (ответ `blob`) | `store/remarks.ts` | | GET | `/issues/api/issues/daterange/` | Диапазон дат замечаний | `store/filters.ts` | | POST | `/issues/api/issues/filter-options/?{params}` | Опции фильтра замечаний | `store/filters.ts` | | GET | `/issues/api/issue-changes/?issue_id={uuid}` | История изменений замечания | `store/remark.ts` | | POST | `/issues/api/comments/` | Создать комментарий | `store/collectionRemarks.ts` | | DELETE | `/issues/api/comments/{id}/` | Удалить комментарий | `store/collectionRemarks.ts` | | GET | `/issues/api/attachments/{fileId}/` | Получить вложение | `store/collectionRemarks.ts` | | POST | `/issues/api/attachments/` | Загрузить вложение | `store/collectionRemarks.ts` | | DELETE | `/issues/api/attachments/{id}/` | Удалить вложение | `store/collectionRemarks.ts` | | GET | `/issues/api/companies/{companyId}/status-model/v2/` | Модель статусов компании | `store/remarks.ts` | | GET | `/flows/api/v1/documents/` | Документы (flows) | `store/filters.ts` | | GET | `/flows/api/v1/documents/?{query}&offset=0&limit=100000` | Документы (flows, полная выборка) | `store/remarks.ts` | | POST | `/flows/api/v1/flows/filter/` | Фильтрация flows | `store/filters.ts` | | GET | `/eav/api/v0/attribute/?company_id={params}` | Атрибуты компании (EAV v0) | `store/remarks.ts` | ### `remarks` — Сервис замечаний | Метод | Путь | Назначение | Где вызывается | | --- | --- | --- | --- | | GET | `/api/v1/remarks?target=true{params}` | Список замечаний по target | `store/remarks.ts` | | DELETE | `/api/v1/remarks/{uuid}` | Удалить замечание | `store/collectionRemarks.ts` | ### `gateway` — Gateway Sarex | Метод | Путь | Назначение | Где вызывается | | --- | --- | --- | --- | | GET | `/api/v2/users/?{query}` | Пользователи (с фильтрами прав/таргета) | `store/remarks.ts` | | GET | `/api/v2/users/` | Пользователи (без фильтров) | `store/remarks.ts` | | GET | `/api/v1/documents/{docId}/attributes/` | Атрибуты документа | `store/remarks.ts` | | GET | `/api/v1/resources/` | Список ресурсов | `store/resourcesStore.ts` | ### `documentations` — Сервис документации | Метод | Путь | Назначение | Где вызывается | | --- | --- | --- | --- | | GET | `/api/v1/documents/{docId}?extend=bundles` | Документ с бандлами | `store/remark.ts` | ### `eavV4` — Сервис ассетов (EAV v4) Базовый хост уже включает префикс `/eav/api/v4`. | Метод | Путь | Назначение | Где вызывается | | --- | --- | --- | --- | | POST | `/assets/search/` | Поиск ассетов по набору id | `api/assets.ts` | | GET | `/assets/` | Список ассетов (фильтры, пагинация, `tag`) | `api/assets.ts` | ### `sarex` — Локальный сервис данных | Метод | Путь | Назначение | Где вызывается | | --- | --- | --- | --- | | GET | `/api/client/settings/` | Клиентские настройки | `store/remarks.ts` | | GET | `/api/core/admin/departments/?company={companyId}` | Отделы компании (пагинация по `next`) | `store/remarks.ts` | | GET | `/api/core/admin/positions/?company={companyId}` | Должности компании (пагинация по `next`) | `store/remarks.ts` | ## Обработка ошибок Отдельного файла-маппера ошибок (аналога `module/api/errors.ts` в `transmittal-frontend`) в проекте нет. Обработка сосредоточена в двух местах: - `module/api/http-client.ts` — прокси перехватывает ответ `403` и показывает toast (`react-toastify`) с текстом `response.data.detail` или сообщением по умолчанию «У вас недостаточно прав для выполнения данного действия.»; - SDK `@sarex-team/sdk-js` — при `showErrorNotification: true` показывает стандартное уведомление об ошибке; в сторах ряд операций дополнительно оборачивается в `try/catch` с собственными toast-сообщениями (напр. «Замечание успешно создано!» / «Произошла ошибка при создании замечания»).