# Эндпоинты, с которыми взаимодействует 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 <jwt>` (`SetAuthToken` + `SetAuthScheme("Bearer")`). Заголовок `Content-Type: application/json`.

В режиме интеграционных тестов (`INTEGRATION_TESTS=1`) внешний вызов не выполняется — `CheckUserIsAdmin` возвращает `true`.

## Базовые хосты по сервисам и окружениям

Значение берётся из переменной `DJANGO_HOST` (см. `CONFIGURATION.md`). Итоговый URL = `<DJANGO_HOST>` + `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 <jwt пользователя>`, `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`).
