# Эндпоинты внешних сервисов, с которыми взаимодействует documentations-api

Документ описывает HTTP-эндпоинты внешних сервисов, к которым обращается сервис документаций (оба бинарника — `cmd/api` и `cmd/filestreamer`). В отличие от фронтенда, единого декларативного реестра эндпоинтов здесь нет — каждый внешний сервис инкапсулирован в собственном клиенте в каталогах `clients/` и `pkg/`.

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

Клиенты создаются при старте (`cmd/api/routes_api.go`, `cmd/filestreamer/*`) и используют базовый URL из соответствующей переменной окружения (см. `config/config.go`). Большинство клиентов построены на `go-resty/resty` (метод `SetHostURL`/`SetBaseURL`), часть — на внутренних http-обёртках `gitlab.sarex.io/platform/gotools`. Итоговый URL = `<базовый URL сервиса>` + путь из клиента.

Аутентификация исходящих запросов:

- к Sarex backend (Django) — HTTP Basic (`DJANGO_BASIC_AUTH`, а для получения пользователей — `DJANGO_BASIC_AUTH_FOR_GET_USER`); для части ручек проксируется заголовок `Identity`/`Bearer`;
- к остальным сервисам — по внутренней сети кластера, как правило без внешней авторизации.

## Базовые URL по сервисам

| Сервис | Переменная окружения | Клиент (каталог) |
| --- | --- | --- |
| Sarex backend (Django) | `DJANGO_HOST` | `clients/django`, `pkg/django`, `pkg/users`, `pkg/sarex_backend`, `clients/accounts` |
| Flows | `FLOWS_URL` | `pkg/flows` |
| Workflows | `WORKFLOW_URL` | `clients/workflow`, `pkg/workflows` |
| Workspaces | `WORKSPACE_URL` | `clients/workspace` |
| Transmittals | `TRANSMITTALS_BASE_URL` (опц.) | `pkg/transmittal` |
| Automation | `AUTOMATION_URL` | `pkg/automation` |
| Marks (штампы, HTTP) | `MARKS_PROCESSING_URL` | `pkg/marks/base` |
| Marks (штампы, RabbitMQ) | `MARKS_RABBITMQ_*` | `pkg/marks/rpc` |
| BIM-API v1 | `BIM_API_URL` | `clients/bim-api` |
| BIM-API v2 (bim-core-api) | `BIM_API_V2_URL` | `clients/bim-api-v2` |
| System log | `SYSTEM_LOG_URL` | `pkg/system_log` |

Дополнительно сервис работает с S3 (объектное хранилище, креды из `S3_SERVICE_ACCOUNT`/`S3_SERVICE_ACCOUNT_STR`) и PostgreSQL — это не HTTP-сервисы и в таблицах ниже не приводятся.

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

### Sarex backend (Django) — `DJANGO_HOST`

| Метод | Путь | Клиент | Назначение |
| --- | --- | --- | --- |
| GET | `/api/core/users/` | `clients/django/users.go` | Список пользователей |
| GET | `/api/core/users/{id}/` | `clients/django/users.go`, `pkg/users/client.go` | Пользователь по id |
| GET | `/api/core/users/{id}/introspect` | `clients/django/users.go` | Интроспекция пользователя |
| GET | `/api/core/users/{id}` | `pkg/django/client.go` | Пользователь по id (внутренний клиент) |
| GET | `/api/client/settings/` | `clients/django/settings.go` | Клиентские настройки |
| GET | `/api/core/service-accounts/personalized/` | `clients/django/settings.go` | Персонализированные сервисные аккаунты |
| GET | `/api/core/service_accounts/` | `clients/django/service_accounts.go`, `clients/accounts` | Сервисные аккаунты |
| GET | `/api/core/companies/` | `clients/django/companies.go` | Список компаний |
| GET | `/api/core/mrpa/{id}/` | `pkg/sarex_backend/client.go` | MRPA по id (прокидывается заголовок `Identity`) |

### Flows — `FLOWS_URL`

| Метод | Путь | Клиент | Назначение |
| --- | --- | --- | --- |
| GET | `internal/v1/documents/?full=true&document_ids={id}` | `pkg/flows/client.go` | Документы в процессах (flows) по id |
| GET/POST | `internal/v1/documents/` | `pkg/flows/client.go` | Документы процессов |

### Workflows — `WORKFLOW_URL`

| Метод | Путь | Клиент | Назначение |
| --- | --- | --- | --- |
| POST | `internal/v1/companies/{company_id}/workflows` | `clients/workflow/client.go` | Создать workflow обработки (BIM/PDF/DWG/DEM/DOCX и т. д.); образы задач — из `CONTAINER_REGISTRY` + `WORKFLOWS_IMAGES_VERSION` |
| GET | `v1/workflows/{id}` | `pkg/workflows/client.go` | Прочитать workflow по id |

### Workspaces — `WORKSPACE_URL`

| Метод | Путь | Клиент | Назначение |
| --- | --- | --- | --- |
| POST | `internal/v2/workspaces` | `clients/workspace/client.go` | Создать воркспейс |
| DELETE | `internal/v2/documents/{ids}` | `clients/workspace/client.go` | Удалить документы воркспейса |
| PATCH | `internal/v2/documents/restore` | `clients/workspace/client.go` | Восстановить документы воркспейса |

### Transmittals — `TRANSMITTALS_BASE_URL`

Клиент создаётся только если переменная задана.

| Метод | Путь | Клиент | Назначение |
| --- | --- | --- | --- |
| POST | `/internal/v1/transmittals/by_bundle_ids` | `pkg/transmittal/client.go` | Трансмитталы по списку bundle-id |

### Automation — `AUTOMATION_URL`

| Метод | Путь | Клиент | Назначение |
| --- | --- | --- | --- |
| — | `/internal/v1/automations/{process_name}` | `pkg/automation/client.go` | Запуск/получение автоматизации по имени процесса |

### Marks (штампы/маркировки)

Режим выбирается флагом `USE_MARKS_RABBITMQ`.

| Метод | Путь / транспорт | Клиент | Назначение |
| --- | --- | --- | --- |
| POST | `/api/v1/marks/{bundle_id}` (HTTP, `MARKS_PROCESSING_URL`) | `pkg/marks/base/client.go` | Наложение штампов на бандл (HTTP-режим) |
| — | RabbitMQ (`MARKS_RABBITMQ_*`) | `pkg/marks/rpc` | Наложение штампов через очередь (RPC-режим, не HTTP) |

### BIM-API v1 — `BIM_API_URL`

| Метод | Путь | Клиент | Назначение |
| --- | --- | --- | --- |
| POST | `/internal/v1/targets/{target_id}/bims-pdm` | `clients/bim-api/client.go` | Создать BIM для target (PDM) |
| POST | `/internal/v1/targets/{target_id}/bims-v2-pdm` | `clients/bim-api/client.go` | Создать BIM v2 для target (PDM) |

### BIM-API v2 (bim-core-api) — `BIM_API_V2_URL`

| Метод | Путь | Клиент | Назначение |
| --- | --- | --- | --- |
| POST | `/internal/v1/projects/{project_id}/bims` | `clients/bim-api-v2/client.go` | Создать BIM для проекта |

### System log — `SYSTEM_LOG_URL`

| Метод | Путь | Клиент | Назначение |
| --- | --- | --- | --- |
| POST | `/api/v0/system_log` | `pkg/system_log/client.go` | Отправить запись в системный лог |

## Обработка ошибок

Клиенты, как правило, проверяют код ответа и оборачивают ошибку через `github.com/rotisserie/eris` (напр. «invalid response code %d expected 200»). Для случая недоступности исходного сервиса в самом API определён нестандартный статус `523` (`network/consts.go`, `StatusOriginIsUnreachable`).
