iac/apps/bim/ENDPOINTS.md

56 lines
4.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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