# Эндпоинты, с которыми взаимодействует bim-backend-v2 Документ описывает все HTTP-эндпоинты внешних сервисов, к которым обращается сам сервис `bim-backend-v2` (исходящие вызовы). Эндпоинты, которые сервис **предоставляет**, описаны в `openapi.yaml`. ## Как устроено взаимодействие Исходящие вызовы выполняются HTTP-клиентом на базе [`go-resty/resty`](https://github.com/go-resty/resty) в пакете `pkg/django_client` (`DjangoClient`). Клиент создаётся в `NewRestClient`: - базовый хост — `SetHostURL(cfg.DjangoHost)` (переменная `DJANGO_HOST`); - таймаут запроса — `SetTimeout(10 * time.Second)`; - число повторов — `SetRetryCount(5)`. Аутентификация проксируется: JWT пользователя извлекается из контекста запроса (`auth.JWTFromContext`), при необходимости отбрасывается схема `Bearer `, и токен передаётся во внешний сервис заголовком `Authorization: Bearer ` (`SetAuthToken` + `SetAuthScheme("Bearer")`). Заголовок `Content-Type: application/json`. В режиме интеграционных тестов (`INTEGRATION_TESTS=1`) внешний вызов не выполняется — `CheckUserIsAdmin` возвращает `true`. ## Базовые хосты по сервисам и окружениям Значение берётся из переменной `DJANGO_HOST` (см. `CONFIGURATION.md`). Итоговый URL = `` + `path` эндпоинта. | Сервис | Назначение | Значение `DJANGO_HOST` | | --- | --- | --- | | `django` (Sarex backend) | Проверка прав пользователя (админ/не админ) | локально/`stage`: `https://stage.sarex.io`; `preprod`: `https://lk.preprod.sarex.io`; `prod`: `https://lk.sarex.io`; контур (IaC): `http://backend.django.svc.cluster.local:8000` | ## Эндпоинты по сервисам ### `django` — Sarex backend | Метод | Путь | Назначение | | --- | --- | --- | | GET | `api/client/settings/` | Получить настройки текущего пользователя. Используется поле `is_admin` (проверка прав администратора в `CheckUserIsAdmin`) | Детали вызова `GET api/client/settings/`: | Параметр | Значение | | --- | --- | | Заголовки | `Authorization: Bearer `, `Content-Type: application/json` | | Тело запроса | нет | | Ожидаемый ответ | `{ "is_admin": bool }` (структура `userSettingsFromDjango`) | | Успешные статусы | `200`, `201` | | Поведение при ошибке | Любая ошибка транспорта, `resp == nil` или статус вне `200/201` логируется, метод трактует пользователя как **не администратора** (`false`) | ## Где используется Проверка `CheckUserIsAdmin` вызывается в обработчиках, изменяющих модели статусов (требуют прав администратора). При отсутствии прав такие эндпоинты возвращают `403 No admin rights`: - `POST /api/v1/bims/{bim_id}/status_model` — создание модели статусов BIM; - `DELETE /api/v1/bims/{bim_id}/delete_status_model` — удаление модели статусов BIM; - `POST /api/v1/companies/{company_id}/status_model` — создание модели статусов компании; - `DELETE /api/v1/companies/{company_id}/status_model` — удаление модели статусов компании. ## Замечания - Единственная внешняя HTTP-зависимость сервиса — Django-бэкенд (`DJANGO_HOST`). Прочие интеграции (PostgreSQL, pprof) не являются HTTP-вызовами к внешним REST-сервисам. - Подпись JWT самим сервисом не проверяется — проброшенный токен просто пересылается в Django, который и выполняет авторизацию (см. также раздел «Аутентификация» в `openapi.yaml`).