From e5f576d11e3467652e94c7fe694531b52c262453 Mon Sep 17 00:00:00 2001 From: shats Date: Thu, 22 Jan 2026 10:45:03 +0700 Subject: [PATCH] feat(FilterManager): integrate network configuration gateways for enhanced filtering; implement async loading of gateways from /network-config endpoint --- frontend/src/FilterManager.jsx | 55 ++++++++++++++++++++++++++++++---- 1 file changed, 50 insertions(+), 5 deletions(-) diff --git a/frontend/src/FilterManager.jsx b/frontend/src/FilterManager.jsx index df589d1..0abe5fc 100644 --- a/frontend/src/FilterManager.jsx +++ b/frontend/src/FilterManager.jsx @@ -753,6 +753,8 @@ function FilterManager() { const [baseAS, setBaseAS] = useState('65001'); // Inventory servers (from /servers endpoint) const [inventoryServers, setInventoryServers] = useState([]); + // Network config gateways (from /network-config endpoint) + const [networkConfigGateways, setNetworkConfigGateways] = useState([]); // Собираем gateways только для выбранного сервера const selectedServerGateways = (() => { @@ -765,12 +767,41 @@ function FilterManager() { String(srv.ip || '').trim() === selectedServer.name ); - const gws = []; const serverDns = matchedServer?.dns || matchedServer?.hostName || selectedServer.name || ''; + const serverId = matchedServer?.id || matchedServer?.ip || selectedServer.id || selectedServer.name || ''; const country = matchedServer?.country || ''; + const provider = matchedServer?.provider || ''; - // Добавляем только реальные gateways из inventoryServers - if (matchedServer && Array.isArray(matchedServer.gateways)) { + const gws = []; + + // ПРИОРИТЕТ 1: Gateways из NetworkConfigManager (новая страница) + // Ищем gateways по serverId (может быть id, ip или dns) + const networkGateways = networkConfigGateways.filter(gw => { + if (!gw.serverId) return false; + // Сравниваем по разным вариантам идентификатора + return ( + gw.serverId === serverId || + gw.serverId === matchedServer?.ip || + gw.serverId === matchedServer?.dns || + gw.serverId === selectedServer.name || + gw.serverId === serverDns + ); + }); + + networkGateways.forEach(gw => { + gws.push({ + name: gw.name, + ip: gw.ip || '', + comment: gw.description || '', + serverDns: serverDns, + country: country, + provider: provider, + primary: false // В network-config нет поля primary, но можно добавить если нужно + }); + }); + + // ПРИОРИТЕТ 2: Fallback на старые gateways из inventoryServers (если нет в network-config) + if (gws.length === 0 && matchedServer && Array.isArray(matchedServer.gateways)) { matchedServer.gateways.forEach(gw => { // Пропускаем шлюзы, у которых имя совпадает с названием сервера (это fallback) if (gw.name && gw.name !== serverDns && gw.name !== selectedServer.name) { @@ -780,14 +811,15 @@ function FilterManager() { comment: gw.comment || '', serverDns: serverDns, country: country, + provider: provider, primary: gw.primary }); } }); } - // Также проверяем gateways из selectedServer (server-configs) - if (Array.isArray(selectedServer.gateways)) { + // ПРИОРИТЕТ 3: Fallback на gateways из selectedServer (server-configs) + if (gws.length === 0 && Array.isArray(selectedServer.gateways)) { selectedServer.gateways.forEach(gw => { // Пропускаем fallback шлюзы с названием сервера if (gw.name && gw.name !== serverDns && gw.name !== selectedServer.name && !gws.some(g => g.name === gw.name)) { @@ -797,6 +829,7 @@ function FilterManager() { comment: gw.comment || '', serverDns: serverDns, country: country, + provider: provider, primary: gw.primary }); } @@ -841,6 +874,18 @@ function FilterManager() { // мягко игнорируем, дополнительная информация необязательна } })(); + + // Загружаем gateways из NetworkConfigManager + (async () => { + try { + const res = await api.get(`/network-config`); + const networkConfig = res.data || {}; + setNetworkConfigGateways(Array.isArray(networkConfig.gateways) ? networkConfig.gateways : []); + } catch (e) { + // Если файла нет или ошибка - используем пустой массив (fallback на старую логику) + setNetworkConfigGateways([]); + } + })(); }, []); const filterKey = (f) => {