diff --git a/frontend/src/FilterManager.jsx b/frontend/src/FilterManager.jsx index db69099..f4c386d 100644 --- a/frontend/src/FilterManager.jsx +++ b/frontend/src/FilterManager.jsx @@ -696,21 +696,50 @@ function FilterManager() { // Загружаем фильтры при выборе сервера useEffect(() => { if (selectedServer) { - fetchServerFilters(selectedServer.id); + fetchServerFilters(selectedServer.id, selectedServer.legacyId); } else { setServerFilters([]); } }, [selectedServer]); - const fetchServerFilters = async (serverId) => { + const fetchServerFilters = async (serverId, legacyId = null) => { setLoading(true); try { + // Сначала пробуем загрузить по новому id const response = await api.get(`/server-filters/${serverId}`); - setServerFilters(response.data); + const filters = Array.isArray(response.data) ? response.data : []; + + if (filters.length > 0) { + setServerFilters(filters); + setError(''); + return; + } + + // Если фильтров нет и есть legacyId - пробуем загрузить по старому id + if (legacyId && legacyId !== serverId) { + try { + const legacyResponse = await api.get(`/server-filters/${legacyId}`); + const legacyFilters = Array.isArray(legacyResponse.data) ? legacyResponse.data : []; + + if (legacyFilters.length > 0) { + // Нашли фильтры по legacyId - мигрируем их на новый id + await api.post(`/server-filters/${serverId}`, { filters: legacyFilters }); + setServerFilters(legacyFilters); + setSuccess(`Фильтры мигрированы с сервера (legacy id: ${legacyId})`); + setTimeout(() => setSuccess(''), 3000); + return; + } + } catch (legacyError) { + // Фильтров по legacyId тоже нет - это нормально + console.log('No legacy filters found'); + } + } + + setServerFilters([]); setError(''); } catch (error) { console.error('Error fetching server filters:', error); - setServerFilters([]); // Если файл не существует, создаем пустой массив + setServerFilters([]); } finally { setLoading(false); } @@ -718,27 +747,51 @@ function FilterManager() { // Функции для управления серверами // Загружаем jumphost'ы из раздела "Серверы" (/api/servers) + // + загружаем старые server-configs для маппинга legacyId const fetchServers = async () => { try { - const response = await api.get(`/servers`); - const allServers = Array.isArray(response.data) ? response.data : []; + const [serversRes, legacyRes] = await Promise.all([ + api.get(`/servers`), + api.get(`/server-configs`).catch(() => ({ data: [] })) // Старые конфиги для маппинга + ]); + + const allServers = Array.isArray(serversRes.data) ? serversRes.data : []; + const legacyConfigs = Array.isArray(legacyRes.data) ? legacyRes.data : []; + + // Создаём маппинг name → legacyId из старых конфигов + const legacyIdMap = {}; + legacyConfigs.forEach(cfg => { + if (cfg.name && cfg.id) { + // Нормализуем имя для сравнения + legacyIdMap[cfg.name.toLowerCase()] = cfg.id; + } + }); // Фильтруем только jumphost'ы (не exit-ноды) const jumphosts = allServers .filter(s => s.type !== 'exit') - .map(s => ({ - id: s.id || s.ip, // Используем id или ip как идентификатор - name: s.dns?.split('.')[0] || s.ip, // Короткое имя из DNS или IP - fullName: s.dns || s.ip, - description: `${s.provider || ''} ${s.country || ''}`.trim(), - enabled: true, - ip: s.ip, - dns: s.dns, - country: s.country, - provider: s.provider, - tunnel: s.tunnel, - gateways: normalizeGateways(s.gateways, s.dns?.split('.')[0] || s.ip) - })); + .map(s => { + const shortName = s.dns?.split('.')[0] || s.ip; + // Ищем legacyId по имени сервера + const legacyId = legacyIdMap[shortName.toLowerCase()] || + legacyIdMap[s.ip] || + legacyIdMap[(s.dns || '').toLowerCase()]; + + return { + id: s.id || s.ip, // Новый id + legacyId: legacyId, // Старый id для миграции фильтров + name: shortName, + fullName: s.dns || s.ip, + description: `${s.provider || ''} ${s.country || ''}`.trim(), + enabled: true, + ip: s.ip, + dns: s.dns, + country: s.country, + provider: s.provider, + tunnel: s.tunnel, + gateways: normalizeGateways(s.gateways, shortName) + }; + }); setServers(jumphosts); } catch (error) { @@ -894,7 +947,7 @@ function FilterManager() { // Если текущий выбранный сервер был в списке копируемых, обновляем его фильтры if (selectedServer && targetServers.some(s => s.id === selectedServer.id)) { - await fetchServerFilters(selectedServer.id); + await fetchServerFilters(selectedServer.id, selectedServer.legacyId); } } else { setError(