feat(EasySwitchManager): integrate network-config gateways into server data loading and filtering logic for improved accuracy
Publish Fast Tabler Docker image / build-and-push-fast (push) Successful in 3m4s

This commit is contained in:
2026-02-10 21:49:55 +07:00
parent ecee4ab601
commit b3739388e5
+94 -18
View File
@@ -34,6 +34,8 @@ function EasySwitchManager() {
const [servers, setServers] = useState([]);
const [inventoryServers, setInventoryServers] = useState([]);
const [communitiesDirectory, setCommunitiesDirectory] = useState([]); // Справочник communities
// Gateways и интерфейсы из /network-config (единый источник правды для шлюзов)
const [networkConfigGateways, setNetworkConfigGateways] = useState([]);
// Поиск и фильтры
const [searchQuery, setSearchQuery] = useState('');
@@ -62,9 +64,22 @@ function EasySwitchManager() {
const invRes = await api.get(`/servers`);
const inventory = Array.isArray(invRes.data) ? invRes.data : [];
setInventoryServers(inventory);
// Загружаем network-config (gateways и туннели)
let ncGateways = [];
try {
const ncRes = await api.get(`/network-config`);
const ncData = ncRes.data || {};
ncGateways = Array.isArray(ncData.gateways) ? ncData.gateways : [];
} catch (e) {
// Если файла нет или ошибка - используем пустой массив (fallback на старую логику)
console.warn('EasySwitch: не удалось загрузить /network-config, используется fallback:', e?.message || e);
ncGateways = [];
}
setNetworkConfigGateways(ncGateways);
// Загружаем данные серверов и фильтров
await loadDataWithParams(communities, inventory);
await loadDataWithParams(communities, inventory, ncGateways);
} catch (e) {
console.error('Error initializing data:', e);
setError('Ошибка загрузки данных');
@@ -73,7 +88,7 @@ function EasySwitchManager() {
initData();
}, []);
const loadDataWithParams = async (communities, inventory) => {
const loadDataWithParams = async (communities, inventory, ncGatewaysParam) => {
setLoading(true);
setError('');
@@ -90,36 +105,85 @@ function EasySwitchManager() {
const filtersResponse = await api.get(`/server-filters/${server.id}`);
const filters = Array.isArray(filtersResponse.data) ? filtersResponse.data : [];
// Получаем gateways сервера из inventory или server-configs
const matchedInventoryServer = inventory.find(srv =>
// Получаем gateways сервера:
// 1) из /network-config (основной источник, как на странице фильтров)
// 2) fallback на inventory (/servers)
// 3) fallback на server-configs
const matchedInventoryServer = inventory.find((srv) =>
String(srv.dns || '').trim() === server.name ||
String(srv.hostName || '').trim() === server.name ||
String(srv.ip || '').trim() === server.name
);
const serverDns = matchedInventoryServer?.dns || matchedInventoryServer?.hostName || server.name || '';
const serverId =
matchedInventoryServer?.id ||
matchedInventoryServer?.ip ||
server.id ||
server.name ||
'';
const serverCountry = matchedInventoryServer?.country || server.country || '';
const serverProvider = matchedInventoryServer?.provider || server.provider || '';
let serverGateways = [];
// Берем gateways из inventory
if (matchedInventoryServer && Array.isArray(matchedInventoryServer.gateways)) {
// ПРИОРИТЕТ 1: Gateways из /network-config (совпадают со страницей фильтров)
const allNetworkGateways = Array.isArray(ncGatewaysParam)
? ncGatewaysParam
: networkConfigGateways;
if (allNetworkGateways.length > 0) {
const networkGatewaysForServer = allNetworkGateways.filter((gw) => {
if (!gw.serverId) return false;
return (
gw.serverId === serverId ||
gw.serverId === matchedInventoryServer?.ip ||
gw.serverId === matchedInventoryServer?.dns ||
gw.serverId === server.name ||
gw.serverId === serverDns
);
});
networkGatewaysForServer.forEach((gw) => {
if (!gw.ip) return; // Пропускаем gateway без IP
serverGateways.push({
// Используем IP как имя, чтобы совпадало с FilterManager и значением gateway в фильтрах
name: gw.ip,
ip: gw.ip,
comment: gw.description || '',
primary: false,
country: gw.country || serverCountry,
provider: gw.provider || serverProvider,
});
});
}
// ПРИОРИТЕТ 2: Fallback на старые gateways из inventoryServers (если нет в network-config)
if (serverGateways.length === 0 && matchedInventoryServer && Array.isArray(matchedInventoryServer.gateways)) {
serverGateways = matchedInventoryServer.gateways
.filter(gw => gw.name && gw.name !== server.name)
.map(gw => ({
// Пропускаем шлюзы, у которых имя совпадает с названием сервера (fallback)
.filter((gw) => gw.name && gw.name !== serverDns && gw.name !== server.name)
.map((gw) => ({
name: gw.name,
ip: gw.ip || '',
comment: gw.comment || '',
primary: gw.primary || false
primary: gw.primary || false,
country: gw.country || serverCountry,
provider: gw.provider || serverProvider,
}));
}
// Если нет в inventory, берем из server-configs
// ПРИОРИТЕТ 3: Fallback на gateways из server-configs
if (serverGateways.length === 0 && Array.isArray(server.gateways)) {
serverGateways = server.gateways
.filter(gw => gw.name && gw.name !== server.name)
.map(gw => ({
.filter((gw) => gw.name && gw.name !== serverDns && gw.name !== server.name)
.map((gw) => ({
name: gw.name,
ip: gw.ip || '',
comment: gw.comment || '',
primary: gw.primary || false
primary: gw.primary || false,
country: gw.country || serverCountry,
provider: gw.provider || serverProvider,
}));
}
@@ -391,9 +455,21 @@ function EasySwitchManager() {
const invRes = await api.get(`/servers`);
const inventory = Array.isArray(invRes.data) ? invRes.data : [];
setInventoryServers(inventory);
// Загружаем network-config (gateways и туннели)
let ncGateways = [];
try {
const ncRes = await api.get(`/network-config`);
const ncData = ncRes.data || {};
ncGateways = Array.isArray(ncData.gateways) ? ncData.gateways : [];
} catch (e) {
console.warn('EasySwitch: не удалось обновить /network-config, используется fallback:', e?.message || e);
ncGateways = [];
}
setNetworkConfigGateways(ncGateways);
// Загружаем данные серверов и фильтров
await loadDataWithParams(communities, inventory);
// Загружаем данные серверов и фильтров с учетом network-config gateways
await loadDataWithParams(communities, inventory, ncGateways);
} catch (e) {
console.error('Error refreshing data:', e);
setError('Ошибка обновления данных');