Files
router-lists-ui/backend/routes/serverConfigsRoutes.js
T

148 lines
4.7 KiB
JavaScript

/**
* Роуты для управления конфигурациями серверов
*/
const { s3, BUCKET_NAME, writeS3TextObject, deleteS3Object, headMeta } = require('../services/s3Service');
const { sendError, sendOk } = require('../middleware/errorHandler');
const { GetObjectCommand, DeleteObjectCommand } = require('@aws-sdk/client-s3');
const { streamToString } = require('../services/s3Service');
const { createJsonDataRoutes } = require('./jsonDataRoutes');
const { getS3TextWithHeaders, getS3JsonWithHeaders } = require('../utils/s3Helpers');
// GET /api/server-configs (список серверов)
const serverConfigsListRoutes = createJsonDataRoutes('server-configs.json', (server, i) => {
if (!server.id || !server.name) {
return `Server at index ${i} is missing required fields`;
}
if (server.gateways !== undefined) {
if (!Array.isArray(server.gateways)) {
return `Server at index ${i} has invalid gateways (must be array)`;
}
if (server.gateways.length === 0) {
return `Server at index ${i} must have at least one gateway`;
}
const defaults = server.gateways.filter(g => g && g.primary);
if (defaults.length !== 1) {
return `Server at index ${i} must have exactly one primary gateway`;
}
for (let j = 0; j < server.gateways.length; j++) {
const gw = server.gateways[j] || {};
if (!gw.name || String(gw.name).trim().length === 0) {
return `Server at index ${i} gateway at index ${j} is missing name`;
}
}
}
return null;
});
// GET /api/server-configs/:serverId (конкретная конфигурация)
async function getServerConfig(req, res) {
const { serverId } = req.params;
await getS3TextWithHeaders(
`filter-manager/config-${serverId}.txt`,
req,
res,
{
transform: (text) => ({ config: text }),
defaultValue: '// Конфигурация не найдена'
}
);
}
// POST /api/server-configs/:serverId (сохранить конфигурацию)
async function postServerConfig(req, res) {
const { serverId } = req.params;
const { config } = req.body;
if (!config) {
return sendError(res, 400, 'Config is required', 'E_BAD_REQUEST');
}
try {
const meta = await writeS3TextObject(`filter-manager/config-${serverId}.txt`, config);
return sendOk(res, meta);
} catch (error) {
console.error(error);
return sendError(res, 500, 'Error writing server config to S3', 'E_S3');
}
}
// DELETE /api/server-configs/:serverId (удалить только конфигурацию)
async function deleteServerConfig(req, res) {
const { serverId } = req.params;
try {
await deleteS3Object(`filter-manager/config-${serverId}.txt`);
const meta = await headMeta(`filter-manager/config-${serverId}.txt`);
return sendOk(res, meta);
} catch (error) {
console.error(error);
return sendError(res, 500, 'Error deleting server config from S3', 'E_S3');
}
}
// DELETE /api/server-configs/:serverId/complete (удалить конфигурацию и фильтры)
async function deleteServerComplete(req, res) {
const { serverId } = req.params;
try {
await Promise.allSettled([
deleteS3Object(`filter-manager/config-${serverId}.txt`),
deleteS3Object(`filter-manager/server-filters-${serverId}.json`)
]);
return res.json({ ok: true, etag: null, lastModified: null, contentLength: null });
} catch (error) {
console.error(error);
return sendError(res, 500, 'Error deleting server files from S3', 'E_S3');
}
}
// GET /api/server-filters/:serverId
async function getServerFilters(req, res) {
const { serverId } = req.params;
await getS3JsonWithHeaders(
`filter-manager/server-filters-${serverId}.json`,
req,
res,
{ defaultValue: [] }
);
}
// POST /api/server-filters/:serverId
async function postServerFilters(req, res) {
const { serverId } = req.params;
const { filters } = req.body;
if (!Array.isArray(filters)) {
return sendError(res, 400, 'Filters must be an array', 'E_BAD_REQUEST');
}
for (let i = 0; i < filters.length; i++) {
const filter = filters[i];
if (!filter.community || !filter.gateway) {
return sendError(res, 400, `Filter at index ${i} is missing required fields`, 'E_SCHEMA');
}
}
try {
const { writeS3JsonObject } = require('../services/s3Service');
const meta = await writeS3JsonObject(`filter-manager/server-filters-${serverId}.json`, filters);
return sendOk(res, meta);
} catch (error) {
console.error(error);
return sendError(res, 500, 'Error writing server filters to S3', 'E_S3');
}
}
module.exports = {
serverConfigsListRoutes,
getServerConfig,
postServerConfig,
deleteServerConfig,
deleteServerComplete,
getServerFilters,
postServerFilters,
};