fix: add filter manager
Publish Fast Tabler Docker image / build-and-push-fast (push) Successful in 6m5s

This commit is contained in:
2025-07-14 11:50:48 +07:00
parent 71ab7b24d3
commit d059892d7e
2 changed files with 49 additions and 34 deletions
+40 -34
View File
@@ -684,45 +684,13 @@ app.get('/api/server-filters/:serverId', async (req, res) => {
}
});
// Update server filters
app.post('/api/server-filters/:serverId', async (req, res) => {
const { serverId } = req.params;
const { filters } = req.body;
// Validate filters structure
if (!Array.isArray(filters)) {
return res.status(400).send('Filters must be an array');
}
// Validate each filter has required fields
for (let i = 0; i < filters.length; i++) {
const filter = filters[i];
if (!filter.community || !filter.gateway) {
return res.status(400).send(`Filter at index ${i} is missing required fields`);
}
}
const params = {
Bucket: BUCKET_NAME,
Key: `server-filters-${serverId}.json`,
Body: JSON.stringify(filters, null, 2), // Pretty print JSON
ContentType: 'application/json',
};
try {
await s3.putObject(params).promise();
res.send('Server filters updated successfully');
} catch (error) {
console.error(error);
res.status(500).send('Error writing server filters to S3');
}
});
// Generate MikroTik configuration from server filters
app.post('/api/server-filters/generate-config', async (req, res) => {
console.log('Received generate-config request with filters:', req.body);
const { filters } = req.body;
if (!Array.isArray(filters) || filters.length === 0) {
console.log('No filters provided, returning empty config');
return res.json({ config: '// No filters to generate configuration' });
}
@@ -735,6 +703,8 @@ app.post('/api/server-filters/generate-config', async (req, res) => {
gatewayGroups[filter.gateway].push(filter.community);
});
console.log('Grouped filters by gateway:', gatewayGroups);
let config = '// Frouting filter configuration for MikroTik 7.14+\n';
config += '// Generated automatically\n';
config += `// Date: ${new Date().toISOString()}\n\n`;
@@ -776,9 +746,45 @@ app.post('/api/server-filters/generate-config', async (req, res) => {
});
}
console.log('Generated config:', config);
console.log('Sending response:', { config });
res.json({ config });
});
// Update server filters
app.post('/api/server-filters/:serverId', async (req, res) => {
const { serverId } = req.params;
const { filters } = req.body;
// Validate filters structure
if (!Array.isArray(filters)) {
return res.status(400).send('Filters must be an array');
}
// Validate each filter has required fields
for (let i = 0; i < filters.length; i++) {
const filter = filters[i];
if (!filter.community || !filter.gateway) {
return res.status(400).send(`Filter at index ${i} is missing required fields`);
}
}
const params = {
Bucket: BUCKET_NAME,
Key: `server-filters-${serverId}.json`,
Body: JSON.stringify(filters, null, 2), // Pretty print JSON
ContentType: 'application/json',
};
try {
await s3.putObject(params).promise();
res.send('Server filters updated successfully');
} catch (error) {
console.error(error);
res.status(500).send('Error writing server filters to S3');
}
});
// The "catchall" handler: for any request that doesn't
// match one above, send back React's index.html file.
app.get('*', (req, res) => {
+9
View File
@@ -136,14 +136,18 @@ function FilterManager() {
const handleSaveServerConfig = async (serverId) => {
try {
console.log('Starting to save server config for serverId:', serverId);
const config = await generateMikrotikConfig();
console.log('Generated config:', config);
// Проверяем, что конфигурация не пустая
if (!config || config === '// Сначала выберите сервер' || config === '// Нет фильтров для генерации конфигурации') {
setError('Нет данных для сохранения конфигурации. Убедитесь, что выбран сервер и есть фильтры.');
return;
}
console.log('Sending config to save:', { config });
await axios.post(`${API_URL}/server-configs/${serverId}`, { config });
setSuccess(`Конфигурация для сервера "${servers.find(s => s.id === serverId)?.name}" сохранена!`);
@@ -392,10 +396,15 @@ function FilterManager() {
}
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`, {
filters: serverFilters
});
console.log('Response from generate-config:', response.data);
console.log('Response status:', response.status);
if (response.data && response.data.config) {
return response.data.config;
} else {