feat: FilterManager auto-migrate filters with legacyId
Publish Fast Tabler Docker image / build-and-push-fast (push) Successful in 1m42s
Publish Fast Tabler Docker image / build-and-push-fast (push) Successful in 1m42s
This commit is contained in:
@@ -696,21 +696,50 @@ function FilterManager() {
|
|||||||
// Загружаем фильтры при выборе сервера
|
// Загружаем фильтры при выборе сервера
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (selectedServer) {
|
if (selectedServer) {
|
||||||
fetchServerFilters(selectedServer.id);
|
fetchServerFilters(selectedServer.id, selectedServer.legacyId);
|
||||||
} else {
|
} else {
|
||||||
setServerFilters([]);
|
setServerFilters([]);
|
||||||
}
|
}
|
||||||
}, [selectedServer]);
|
}, [selectedServer]);
|
||||||
|
|
||||||
const fetchServerFilters = async (serverId) => {
|
const fetchServerFilters = async (serverId, legacyId = null) => {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
try {
|
try {
|
||||||
|
// Сначала пробуем загрузить по новому id
|
||||||
const response = await api.get(`/server-filters/${serverId}`);
|
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('');
|
setError('');
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error fetching server filters:', error);
|
console.error('Error fetching server filters:', error);
|
||||||
setServerFilters([]); // Если файл не существует, создаем пустой массив
|
setServerFilters([]);
|
||||||
} finally {
|
} finally {
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
}
|
}
|
||||||
@@ -718,27 +747,51 @@ function FilterManager() {
|
|||||||
|
|
||||||
// Функции для управления серверами
|
// Функции для управления серверами
|
||||||
// Загружаем jumphost'ы из раздела "Серверы" (/api/servers)
|
// Загружаем jumphost'ы из раздела "Серверы" (/api/servers)
|
||||||
|
// + загружаем старые server-configs для маппинга legacyId
|
||||||
const fetchServers = async () => {
|
const fetchServers = async () => {
|
||||||
try {
|
try {
|
||||||
const response = await api.get(`/servers`);
|
const [serversRes, legacyRes] = await Promise.all([
|
||||||
const allServers = Array.isArray(response.data) ? response.data : [];
|
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-ноды)
|
// Фильтруем только jumphost'ы (не exit-ноды)
|
||||||
const jumphosts = allServers
|
const jumphosts = allServers
|
||||||
.filter(s => s.type !== 'exit')
|
.filter(s => s.type !== 'exit')
|
||||||
.map(s => ({
|
.map(s => {
|
||||||
id: s.id || s.ip, // Используем id или ip как идентификатор
|
const shortName = s.dns?.split('.')[0] || s.ip;
|
||||||
name: s.dns?.split('.')[0] || s.ip, // Короткое имя из DNS или IP
|
// Ищем legacyId по имени сервера
|
||||||
fullName: s.dns || s.ip,
|
const legacyId = legacyIdMap[shortName.toLowerCase()] ||
|
||||||
description: `${s.provider || ''} ${s.country || ''}`.trim(),
|
legacyIdMap[s.ip] ||
|
||||||
enabled: true,
|
legacyIdMap[(s.dns || '').toLowerCase()];
|
||||||
ip: s.ip,
|
|
||||||
dns: s.dns,
|
return {
|
||||||
country: s.country,
|
id: s.id || s.ip, // Новый id
|
||||||
provider: s.provider,
|
legacyId: legacyId, // Старый id для миграции фильтров
|
||||||
tunnel: s.tunnel,
|
name: shortName,
|
||||||
gateways: normalizeGateways(s.gateways, s.dns?.split('.')[0] || s.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, shortName)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
setServers(jumphosts);
|
setServers(jumphosts);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -894,7 +947,7 @@ function FilterManager() {
|
|||||||
|
|
||||||
// Если текущий выбранный сервер был в списке копируемых, обновляем его фильтры
|
// Если текущий выбранный сервер был в списке копируемых, обновляем его фильтры
|
||||||
if (selectedServer && targetServers.some(s => s.id === selectedServer.id)) {
|
if (selectedServer && targetServers.some(s => s.id === selectedServer.id)) {
|
||||||
await fetchServerFilters(selectedServer.id);
|
await fetchServerFilters(selectedServer.id, selectedServer.legacyId);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
setError(
|
setError(
|
||||||
|
|||||||
Reference in New Issue
Block a user