56 lines
4.6 KiB
Markdown
56 lines
4.6 KiB
Markdown
# Эндпоинты, с которыми взаимодействует 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`).
|