Files
EvoBGP/docs/router-lists-ui-integration.md
Denozordec c811c43bbc
CI / changes (push) Successful in 5s
CI / openapi (push) Successful in 22s
CI / go (push) Successful in 38s
CI / bird2 (push) Has been cancelled
CI / docker-go-prime (push) Has been cancelled
CI / docker-go (deploy/docker/evobgp-agent/Dockerfile, , evobgp-agent) (push) Has been cancelled
CI / docker-go (evobgp-all, 1, deploy/docker/gobinary/Dockerfile, , evobgp-all) (push) Has been cancelled
CI / docker-go (evobgp-api, 1, deploy/docker/gobinary/Dockerfile, , evobgp-api) (push) Has been cancelled
CI / docker-go (evobgp-deploy, 0, deploy/docker/gobinary/Dockerfile, , evobgp-deploy) (push) Has been cancelled
CI / docker-go (evobgp-ingest, 0, deploy/docker/gobinary/Dockerfile, , evobgp-ingest) (push) Has been cancelled
CI / docker-go (evobgp-node, 0, deploy/docker/gobinary/Dockerfile, , evobgp-node) (push) Has been cancelled
CI / docker-go (evobgp-render, 0, deploy/docker/gobinary/Dockerfile, , evobgp-render) (push) Has been cancelled
CI / docker-go (evobgp-scheduler, 0, deploy/docker/gobinary/Dockerfile, , evobgp-scheduler) (push) Has been cancelled
CI / docker-web (deploy/docker/evobgp-web/Dockerfile, , evobgp-web) (push) Has started running
CI / docker-web (deploy/docker/evobgp-web/Dockerfile, evobgp-all, evobgp-web-all) (push) Has been cancelled
CI / docker-bird (push) Has been cancelled
feat: add aggregated router-lists catalog endpoint and update module listing filters
Introduced a new endpoint `GET /v1/router-lists/catalog` that returns a consolidated view of modules, domain entries, ASNs, IP ranges, and communities. Enhanced the existing module listing functionality to support filtering by type and enabled status. Updated documentation to reflect these changes and added tests for the new endpoint and filtering capabilities.
2026-04-07 23:15:40 +07:00

120 lines
5.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.
# Интеграция router-lists-ui с EvoBGP API
Документ описывает подключение разделов `Домены`, `IP-диапазоны`, `AS`, `Community` из проекта `router-lists-ui` напрямую к EvoBGP API (`/v1`).
Источник правды по контракту: [openapi.yaml](openapi.yaml).
## 1. Базовые требования
- Base URL API: `https://<evobgp-host>/v1`
- Аутентификация: `Authorization: Bearer <api_key>`
- CORS на стороне EvoBGP: переменная `EVOBGP_CORS_ORIGINS`
- Роли:
- чтение: `viewer+`
- изменение данных: `editor+`
- apply/деплой: `operator`
## 2. Маппинг legacy -> EvoBGP
| Раздел UI | Legacy endpoint | EvoBGP endpoint |
|---|---|---|
| Домены | `/api/domains-new` | `/v1/modules?type=DOMAINS` + `/v1/modules/{module_id}/domain-entries` |
| IP-диапазоны | `/api/ip-ranges` | `/v1/modules?type=IP_RANGES` + `/v1/modules/{module_id}/ip-range-entries` |
| AS | `/api/asns` | `/v1/modules?type=AS_PREFIXES` + `/v1/modules/{module_id}/as-entries` |
| Community | `/api/communities` | `/v1/communities` |
Для упрощённой интеграции доступен агрегированный endpoint: `GET /v1/router-lists/catalog` (модули + entries + communities в одном ответе).
## 3. Маппинг полей
| Legacy модель | EvoBGP модель | Комментарий |
|---|---|---|
| `{ domain, community }` | `DomainEntry { fqdn, community_id }` | `community` в UI резолвится в `community_id` через `/v1/communities` |
| `{ ipRange, community }` | `IpRangeEntry { prefix, community_id }` | Для `IP_RANGES` `community_id` обязателен |
| `{ domain, type }` (AS) | `AsEntry { asn, community_id }` | `domain` legacy = ASN |
| `{ value, name }` (Community dict) | `BgpCommunity { community, title }` | `value -> community`, `name -> title` |
## 4. Алгоритм работы по разделам
### 4.1 Домены / IP / AS (общая схема)
1. Найти модуль нужного типа через `GET /v1/modules?type=...`.
2. Если модуль отсутствует, создать через `POST /v1/modules`.
3. Загрузить entries:
- домены: `GET /v1/modules/{module_id}/domain-entries`
- IP: `GET /v1/modules/{module_id}/ip-range-entries`
- AS: `GET /v1/modules/{module_id}/as-entries`
4. При сохранении:
- удалить отсутствующие записи (`DELETE .../{entry_id}`)
- обновить изменённые (`PATCH .../{entry_id}`)
- добавить новые (`POST ...`)
### 4.2 Community
1. Получить список: `GET /v1/communities`
2. Для сохранения diff:
- новые -> `POST /v1/communities`
- изменённые -> `PATCH /v1/communities/{id}`
- удалённые -> `DELETE /v1/communities/{id}`
## 5. Разрешение community
- Перед работой с entries загрузить `/v1/communities`.
- Основной путь: сопоставление по `id`.
- Для UI-формы использовать значение `community` (например, `65001:120`) и перед записью преобразовывать в `community_id`.
- Если community не найдена:
- для `IP_RANGES` считать ошибкой валидации;
- для `DOMAINS` и `AS_PREFIXES` можно передать `null` только если это допускается бизнес-логикой.
## 6. Пагинация и ошибки
- Списки используют `cursor + limit`.
- Формат ошибок: `application/problem+json` (RFC 9457).
- Базовая обработка:
- `401` — неверный/отсутствующий токен
- `403` — недостаточно прав
- `404` — ресурс не найден
- `422` — ошибка валидации
## 7. Примеры (PowerShell)
```powershell
$base = "http://localhost:8080/v1"
$token = "YOUR_API_KEY"
$h = @{ Authorization = "Bearer $token" }
# 1) Найти модуль DOMAINS
$modules = Invoke-RestMethod -Uri "$base/modules?type=DOMAINS&limit=50" -Headers $h
$moduleId = $modules.items[0].id
# 2) Прочитать домены
Invoke-RestMethod -Uri "$base/modules/$moduleId/domain-entries?limit=100" -Headers $h
```
```powershell
# Создать community
$body = @{
community = "65001:120"
title = "Video"
} | ConvertTo-Json
Invoke-RestMethod -Method Post -Uri "$base/communities" -Headers $h -ContentType "application/json" -Body $body
```
## 8. Настройки router-lists-ui для прямой интеграции
Рекомендуемые переменные frontend:
- `VITE_EVOBGP_API_URL` (по умолчанию `/v1`)
- `VITE_EVOBGP_API_TOKEN` (опционально; либо хранить токен в `localStorage` как `evobgp_api_token`)
Для dev-прокси Vite добавить маршрут `/v1 -> http://localhost:8080`.
## 9. Контрольный список интеграции
- [ ] `Домены`: list/create/update/delete работают через `/v1/modules/{id}/domain-entries`
- [ ] `IP-диапазоны`: list/create/update/delete работают через `/v1/modules/{id}/ip-range-entries`
- [ ] `AS`: list/create/update/delete работают через `/v1/modules/{id}/as-entries`
- [ ] `Community`: CRUD работает через `/v1/communities`
- [ ] ошибки `problem+json` корректно отображаются в UI