feat: Enhance FilterManager to include filter copying functionality and improve user prompts for server configuration deployment
Publish Fast Tabler Docker image / build-and-push-fast (push) Successful in 6m42s

This commit is contained in:
2025-07-14 12:01:54 +07:00
parent d059892d7e
commit 1869774f73
+37 -22
View File
@@ -136,18 +136,14 @@ function FilterManager() {
const handleSaveServerConfig = async (serverId) => { const handleSaveServerConfig = async (serverId) => {
try { try {
console.log('Starting to save server config for serverId:', serverId);
const config = await generateMikrotikConfig(); const config = await generateMikrotikConfig();
console.log('Generated config:', config);
// Проверяем, что конфигурация не пустая // Проверяем, что конфигурация не пустая
if (!config || config === '// Сначала выберите сервер' || config === '// Нет фильтров для генерации конфигурации') { if (!config || config === '// Сначала выберите сервер' || config === '// Нет фильтров для генерации конфигурации') {
setError('Нет данных для сохранения конфигурации. Убедитесь, что выбран сервер и есть фильтры.'); setError('Нет данных для сохранения конфигурации. Убедитесь, что выбран сервер и есть фильтры.');
return; return;
} }
console.log('Sending config to save:', { config });
await axios.post(`${API_URL}/server-configs/${serverId}`, { config }); await axios.post(`${API_URL}/server-configs/${serverId}`, { config });
setSuccess(`Конфигурация для сервера "${servers.find(s => s.id === serverId)?.name}" сохранена!`); setSuccess(`Конфигурация для сервера "${servers.find(s => s.id === serverId)?.name}" сохранена!`);
@@ -187,7 +183,7 @@ function FilterManager() {
} }
const confirm = window.confirm( const confirm = window.confirm(
`Скопировать конфигурацию с сервера "${sourceServer.name}" на ${targetServers.length} сервер(ов)?\n\n` + `Скопировать конфигурацию и фильтры с сервера "${sourceServer.name}" на ${targetServers.length} сервер(ов)?\n\n` +
`Целевые серверы: ${targetServers.map(s => s.name).join(', ')}` `Целевые серверы: ${targetServers.map(s => s.name).join(', ')}`
); );
@@ -195,9 +191,13 @@ function FilterManager() {
setLoading(true); setLoading(true);
try { try {
// Получаем фильтры исходного сервера
const sourceFiltersResponse = await axios.get(`${API_URL}/server-filters/${sourceServerId}`);
const sourceFilters = sourceFiltersResponse.data;
// Получаем конфигурацию исходного сервера // Получаем конфигурацию исходного сервера
const sourceResponse = await axios.get(`${API_URL}/server-configs/${sourceServerId}`); const sourceConfigResponse = await axios.get(`${API_URL}/server-configs/${sourceServerId}`);
const sourceConfig = sourceResponse.data.config; const sourceConfig = sourceConfigResponse.data.config;
if (!sourceConfig || sourceConfig === '// Конфигурация не найдена') { if (!sourceConfig || sourceConfig === '// Конфигурация не найдена') {
setError(`У сервера "${sourceServer.name}" нет сохраненной конфигурации.`); setError(`У сервера "${sourceServer.name}" нет сохраненной конфигурации.`);
@@ -206,13 +206,18 @@ function FilterManager() {
const results = []; const results = [];
// Копируем конфигурацию на все целевые серверы // Копируем фильтры и конфигурацию на все целевые серверы
for (const targetServer of targetServers) { for (const targetServer of targetServers) {
try { try {
// Копируем фильтры
await axios.post(`${API_URL}/server-filters/${targetServer.id}`, { filters: sourceFilters });
// Копируем конфигурацию
await axios.post(`${API_URL}/server-configs/${targetServer.id}`, { config: sourceConfig }); await axios.post(`${API_URL}/server-configs/${targetServer.id}`, { config: sourceConfig });
results.push({ server: targetServer.name, status: 'success' }); results.push({ server: targetServer.name, status: 'success' });
} catch (error) { } catch (error) {
console.error(`Error copying config to ${targetServer.name}:`, error); console.error(`Error copying to ${targetServer.name}:`, error);
results.push({ server: targetServer.name, status: 'error', error: error.message }); results.push({ server: targetServer.name, status: 'error', error: error.message });
} }
} }
@@ -221,7 +226,12 @@ function FilterManager() {
const errorCount = results.filter(r => r.status === 'error').length; const errorCount = results.filter(r => r.status === 'error').length;
if (errorCount === 0) { if (errorCount === 0) {
setSuccess(`Конфигурация успешно скопирована на ${successCount} сервер(ов)!`); setSuccess(`Конфигурация и фильтры успешно скопированы на ${successCount} сервер(ов)!`);
// Если текущий выбранный сервер был в списке копируемых, обновляем его фильтры
if (selectedServer && targetServers.some(s => s.id === selectedServer.id)) {
await fetchServerFilters(selectedServer.id);
}
} else { } else {
setError( setError(
`Копирование завершено с ошибками:\n` + `Копирование завершено с ошибками:\n` +
@@ -251,20 +261,25 @@ function FilterManager() {
}; };
const handleDeployToAllServers = async () => { const handleDeployToAllServers = async () => {
if (servers.length === 0) { if (!selectedServer) {
setError('Нет серверов для развертывания.'); setError('Сначала выберите сервер с фильтрами для развертывания.');
return; return;
} }
const enabledServers = servers.filter(s => s.enabled); if (serverFilters.length === 0) {
setError('У выбранного сервера нет фильтров для развертывания.');
return;
}
const enabledServers = servers.filter(s => s.enabled && s.id !== selectedServer.id);
if (enabledServers.length === 0) { if (enabledServers.length === 0) {
setError('Нет включенных серверов для развертывания.'); setError('Нет других включенных серверов для развертывания.');
return; return;
} }
const confirm = window.confirm( const confirm = window.confirm(
`Вы уверены, что хотите развернуть конфигурацию на ${enabledServers.length} сервер(ов)?\n\n` + `Развернуть фильтры и конфигурацию с сервера "${selectedServer.name}" на ${enabledServers.length} сервер(ов)?\n\n` +
`Серверы: ${enabledServers.map(s => s.name).join(', ')}` `Целевые серверы: ${enabledServers.map(s => s.name).join(', ')}`
); );
if (!confirm) return; if (!confirm) return;
@@ -276,7 +291,12 @@ function FilterManager() {
for (const server of enabledServers) { for (const server of enabledServers) {
try { try {
// Копируем фильтры
await axios.post(`${API_URL}/server-filters/${server.id}`, { filters: serverFilters });
// Копируем конфигурацию
await axios.post(`${API_URL}/server-configs/${server.id}`, { config }); await axios.post(`${API_URL}/server-configs/${server.id}`, { config });
results.push({ server: server.name, status: 'success' }); results.push({ server: server.name, status: 'success' });
} catch (error) { } catch (error) {
console.error(`Error deploying to ${server.name}:`, error); console.error(`Error deploying to ${server.name}:`, error);
@@ -288,7 +308,7 @@ function FilterManager() {
const errorCount = results.filter(r => r.status === 'error').length; const errorCount = results.filter(r => r.status === 'error').length;
if (errorCount === 0) { if (errorCount === 0) {
setSuccess(`Конфигурация успешно развернута на ${successCount} сервер(ов)!`); setSuccess(`Фильтры и конфигурация успешно развернуты на ${successCount} сервер(ов)!`);
} else { } else {
setError( setError(
`Развертывание завершено с ошибками:\n` + `Развертывание завершено с ошибками:\n` +
@@ -396,15 +416,10 @@ function FilterManager() {
} }
try { try {
console.log('Sending filters to generate config:', serverFilters);
console.log('Making request to:', `${API_URL}/server-filters/generate-config`);
const response = await axios.post(`${API_URL}/server-filters/generate-config`, { const response = await axios.post(`${API_URL}/server-filters/generate-config`, {
filters: serverFilters filters: serverFilters
}); });
console.log('Response from generate-config:', response.data);
console.log('Response status:', response.status);
if (response.data && response.data.config) { if (response.data && response.data.config) {
return response.data.config; return response.data.config;
} else { } else {