feat: FilterManager auto-migrate filters with legacyId
Publish Fast Tabler Docker image / build-and-push-fast (push) Successful in 1m42s

This commit is contained in:
2026-01-20 15:06:41 +07:00
parent 549c695117
commit 9a1991c23c
+73 -20
View File
@@ -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(