/** * Роуты для управления конфигурациями серверов */ 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`; } 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, };