ваше сообщение коммита
This commit is contained in:
@@ -2,52 +2,17 @@ const express = require('express');
|
||||
const router = express.Router();
|
||||
const { requireAdmin } = require('../middleware/auth');
|
||||
const logger = require('../utils/logger');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const { ethers } = require('ethers');
|
||||
const rpcProviderService = require('../services/rpcProviderService');
|
||||
const authTokenService = require('../services/authTokenService');
|
||||
|
||||
// Логируем версию ethers для отладки
|
||||
logger.info(`Ethers version: ${ethers.version || 'unknown'}`);
|
||||
|
||||
// Путь к файлу с настройками
|
||||
const RPC_CONFIG_PATH = path.join(__dirname, '../config/rpc-settings.json');
|
||||
const AUTH_TOKENS_PATH = path.join(__dirname, '../config/auth-tokens.json');
|
||||
|
||||
// Вспомогательная функция для чтения настроек из файла
|
||||
const readSettingsFile = (filePath, defaultValue = []) => {
|
||||
try {
|
||||
if (fs.existsSync(filePath)) {
|
||||
const data = fs.readFileSync(filePath, 'utf8');
|
||||
return JSON.parse(data);
|
||||
}
|
||||
return defaultValue;
|
||||
} catch (error) {
|
||||
logger.error(`Ошибка при чтении файла настроек ${filePath}:`, error);
|
||||
return defaultValue;
|
||||
}
|
||||
};
|
||||
|
||||
// Вспомогательная функция для записи настроек в файл
|
||||
const writeSettingsFile = async (filePath, data) => {
|
||||
try {
|
||||
// Создаем директорию, если не существует
|
||||
const dirname = path.dirname(filePath);
|
||||
if (!fs.existsSync(dirname)) {
|
||||
fs.mkdirSync(dirname, { recursive: true });
|
||||
}
|
||||
|
||||
await fs.promises.writeFile(filePath, JSON.stringify(data, null, 2), 'utf8');
|
||||
return true;
|
||||
} catch (error) {
|
||||
logger.error(`Ошибка при записи файла настроек ${filePath}:`, error);
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
// Получение RPC настроек
|
||||
router.get('/rpc', requireAdmin, async (req, res) => {
|
||||
try {
|
||||
const rpcConfigs = readSettingsFile(RPC_CONFIG_PATH);
|
||||
const rpcConfigs = await rpcProviderService.getAllRpcProviders();
|
||||
res.json({ success: true, data: rpcConfigs });
|
||||
} catch (error) {
|
||||
logger.error('Ошибка при получении RPC настроек:', error);
|
||||
@@ -55,32 +20,47 @@ router.get('/rpc', requireAdmin, async (req, res) => {
|
||||
}
|
||||
});
|
||||
|
||||
// Сохранение RPC настроек
|
||||
// Добавление/обновление одного или нескольких RPC
|
||||
router.post('/rpc', requireAdmin, async (req, res) => {
|
||||
try {
|
||||
const { rpcConfigs } = req.body;
|
||||
|
||||
if (!Array.isArray(rpcConfigs)) {
|
||||
return res.status(400).json({ success: false, error: 'Неверный формат данных' });
|
||||
// Если пришёл массив rpcConfigs — bulk-режим
|
||||
if (Array.isArray(req.body.rpcConfigs)) {
|
||||
const rpcConfigs = req.body.rpcConfigs;
|
||||
if (!rpcConfigs.length) {
|
||||
return res.status(400).json({ success: false, error: 'rpcConfigs не может быть пустым массивом' });
|
||||
}
|
||||
await rpcProviderService.saveAllRpcProviders(rpcConfigs);
|
||||
return res.json({ success: true, message: 'RPC провайдеры успешно сохранены (bulk)' });
|
||||
}
|
||||
|
||||
const success = await writeSettingsFile(RPC_CONFIG_PATH, rpcConfigs);
|
||||
|
||||
if (success) {
|
||||
res.json({ success: true, message: 'RPC настройки успешно сохранены' });
|
||||
} else {
|
||||
res.status(500).json({ success: false, error: 'Ошибка при сохранении RPC настроек' });
|
||||
// Иначе — одиночный режим (старый)
|
||||
const { networkId, rpcUrl, chainId } = req.body;
|
||||
if (!networkId || !rpcUrl) {
|
||||
return res.status(400).json({ success: false, error: 'networkId и rpcUrl обязательны' });
|
||||
}
|
||||
await rpcProviderService.upsertRpcProvider({ networkId, rpcUrl, chainId });
|
||||
res.json({ success: true, message: 'RPC провайдер сохранён' });
|
||||
} catch (error) {
|
||||
logger.error('Ошибка при сохранении RPC настроек:', error);
|
||||
res.status(500).json({ success: false, error: 'Ошибка сервера при сохранении настроек RPC' });
|
||||
logger.error('Ошибка при сохранении RPC:', error);
|
||||
res.status(500).json({ success: false, error: 'Ошибка сервера при сохранении RPC' });
|
||||
}
|
||||
});
|
||||
|
||||
// Удаление одного RPC
|
||||
router.delete('/rpc/:networkId', requireAdmin, async (req, res) => {
|
||||
try {
|
||||
const { networkId } = req.params;
|
||||
await rpcProviderService.deleteRpcProvider(networkId);
|
||||
res.json({ success: true, message: 'RPC провайдер удалён' });
|
||||
} catch (error) {
|
||||
logger.error('Ошибка при удалении RPC:', error);
|
||||
res.status(500).json({ success: false, error: 'Ошибка сервера при удалении RPC' });
|
||||
}
|
||||
});
|
||||
|
||||
// Получение токенов для аутентификации
|
||||
router.get('/auth-tokens', requireAdmin, async (req, res) => {
|
||||
try {
|
||||
const authTokens = readSettingsFile(AUTH_TOKENS_PATH);
|
||||
const authTokens = await authTokenService.getAllAuthTokens();
|
||||
res.json({ success: true, data: authTokens });
|
||||
} catch (error) {
|
||||
logger.error('Ошибка при получении токенов аутентификации:', error);
|
||||
@@ -92,24 +72,44 @@ router.get('/auth-tokens', requireAdmin, async (req, res) => {
|
||||
router.post('/auth-tokens', requireAdmin, async (req, res) => {
|
||||
try {
|
||||
const { authTokens } = req.body;
|
||||
|
||||
if (!Array.isArray(authTokens)) {
|
||||
return res.status(400).json({ success: false, error: 'Неверный формат данных' });
|
||||
}
|
||||
|
||||
const success = await writeSettingsFile(AUTH_TOKENS_PATH, authTokens);
|
||||
|
||||
if (success) {
|
||||
res.json({ success: true, message: 'Токены аутентификации успешно сохранены' });
|
||||
} else {
|
||||
res.status(500).json({ success: false, error: 'Ошибка при сохранении токенов аутентификации' });
|
||||
}
|
||||
await authTokenService.saveAllAuthTokens(authTokens);
|
||||
res.json({ success: true, message: 'Токены аутентификации успешно сохранены' });
|
||||
} catch (error) {
|
||||
logger.error('Ошибка при сохранении токенов аутентификации:', error);
|
||||
res.status(500).json({ success: false, error: 'Ошибка сервера при сохранении токенов аутентификации' });
|
||||
}
|
||||
});
|
||||
|
||||
// Добавление/обновление одного токена
|
||||
router.post('/auth-token', requireAdmin, async (req, res) => {
|
||||
try {
|
||||
const { name, address, network, minBalance } = req.body;
|
||||
if (!name || !address || !network) {
|
||||
return res.status(400).json({ success: false, error: 'name, address и network обязательны' });
|
||||
}
|
||||
await authTokenService.upsertAuthToken({ name, address, network, minBalance });
|
||||
res.json({ success: true, message: 'Токен аутентификации сохранён' });
|
||||
} catch (error) {
|
||||
logger.error('Ошибка при сохранении токена аутентификации:', error);
|
||||
res.status(500).json({ success: false, error: 'Ошибка сервера при сохранении токена' });
|
||||
}
|
||||
});
|
||||
|
||||
// Удаление одного токена
|
||||
router.delete('/auth-token/:address/:network', requireAdmin, async (req, res) => {
|
||||
try {
|
||||
const { address, network } = req.params;
|
||||
await authTokenService.deleteAuthToken(address, network);
|
||||
res.json({ success: true, message: 'Токен аутентификации удалён' });
|
||||
} catch (error) {
|
||||
logger.error('Ошибка при удалении токена аутентификации:', error);
|
||||
res.status(500).json({ success: false, error: 'Ошибка сервера при удалении токена' });
|
||||
}
|
||||
});
|
||||
|
||||
// Тестирование RPC соединения
|
||||
router.post('/rpc-test', requireAdmin, async (req, res) => {
|
||||
try {
|
||||
@@ -123,7 +123,12 @@ router.post('/rpc-test', requireAdmin, async (req, res) => {
|
||||
|
||||
try {
|
||||
// Пробуем создать провайдера и получить номер последнего блока (обновлено для ethers v6)
|
||||
const provider = new ethers.JsonRpcProvider(rpcUrl);
|
||||
let provider;
|
||||
if (rpcUrl.startsWith('ws://') || rpcUrl.startsWith('wss://')) {
|
||||
provider = new ethers.WebSocketProvider(rpcUrl);
|
||||
} else {
|
||||
provider = new ethers.JsonRpcProvider(rpcUrl);
|
||||
}
|
||||
|
||||
// Устанавливаем таймаут для соединения
|
||||
const timeoutPromise = new Promise((_, reject) =>
|
||||
|
||||
Reference in New Issue
Block a user