Publish Fast Tabler Docker image / build-and-push-fast (push) Successful in 1m34s
130 lines
4.0 KiB
JavaScript
130 lines
4.0 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`;
|
|
}
|
|
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,
|
|
};
|
|
|