feat(integration): switch data sections to EvoBGP v1 API
Publish Docker image / build-and-push (push) Successful in 2m12s

Move Domains, IP ranges, ASNs and Communities managers from legacy /api endpoints to direct EvoBGP /v1 modules/communities endpoints with a dedicated adapter layer.

Made-with: Cursor
This commit is contained in:
2026-04-07 22:50:54 +07:00
parent 0703d2eccd
commit 23d7b67813
6 changed files with 315 additions and 177 deletions
+8 -56
View File
@@ -30,8 +30,7 @@ import ErrorAlert from './components/ErrorAlert.jsx';
import Pagination from './components/Pagination.jsx';
import IconPicker from './components/IconPicker.jsx';
import { getIconById } from './lib/brandIcons.js';
const API_URL = '/api';
import { listCommunities, saveCommunitiesData } from './lib/evobgpData.js';
const normalizeCommunityValue = (value) => {
const trimmed = String(value || '').trim();
@@ -90,57 +89,12 @@ function CommunitiesManager() {
const fetchItems = async () => {
setLoading(true);
try {
const [dictRes, asnsRes, ipRes, domRes] = await Promise.all([
api.get(`/communities`),
api.get(`/asns`, { params: { offset: 0, limit: 0 } }).catch(() => ({ data: [] })),
api.get(`/ip-ranges`, { params: { offset: 0, limit: 0 } }).catch(() => ({ data: [] })),
api.get(`/domains-new`, { params: { offset: 0, limit: 0 } }).catch(() => ({ data: [] })),
]);
const dict = Array.isArray(dictRes.data) ? dictRes.data : [];
const asnsPayload = Array.isArray(asnsRes.data?.items) ? asnsRes.data.items : (Array.isArray(asnsRes.data) ? asnsRes.data : []);
const ipPayload = Array.isArray(ipRes.data?.items) ? ipRes.data.items : (Array.isArray(ipRes.data) ? ipRes.data : []);
const domPayload = Array.isArray(domRes.data?.items) ? domRes.data.items : (Array.isArray(domRes.data) ? domRes.data : []);
const usedCommunities = new Set();
// ASNs: fields domain/type
for (const it of asnsPayload) {
const v = normalizeCommunityValue(it.type);
if (v) usedCommunities.add(v);
}
// IP ranges: fields ipRange/community
for (const it of ipPayload) {
const v = normalizeCommunityValue(it.community);
if (v) usedCommunities.add(v);
}
// Domains: fields domain/community
for (const it of domPayload) {
const v = normalizeCommunityValue(it.community);
if (v) usedCommunities.add(v);
}
const map = new Map();
// put dictionary items first
for (const d of dict) {
const raw = String(d.value || '').trim();
if (!raw) continue;
const value = normalizeCommunityValue(raw);
map.set(value, {
value,
name: String(d.name || ''),
description: String(d.description || ''),
tags: Array.isArray(d.tags) ? d.tags : [],
color: String(d.color || ''),
icon: String(d.icon || ''),
_external: false,
});
}
// add unknown ones from usage
for (const v of usedCommunities) {
if (!map.has(v)) {
map.set(v, { value: v, name: '', description: '', tags: [], color: '', icon: '', _external: true });
}
}
setItems(Array.from(map.values()));
const rows = await listCommunities();
const normalized = rows.map((item) => ({
...item,
value: normalizeCommunityValue(item.value),
}));
setItems(normalized);
setError('');
} catch (e) {
console.error('Error fetching communities:', e);
@@ -189,9 +143,7 @@ function CommunitiesManager() {
const saveAll = async (data) => {
setLoading(true);
try {
// не отправляем служебное поле _external
const payload = data.map(({ _external: _, ...rest }) => rest);
await api.post(`/communities`, { communities: payload });
await saveCommunitiesData(data);
setSuccess('Справочник сохранён!');
setTimeout(() => setSuccess(''), 3000);
} catch (e) {