175 lines
6.6 KiB
JavaScript
175 lines
6.6 KiB
JavaScript
const express = require('express');
|
||
const router = express.Router();
|
||
const dleService = require('../services/dleService');
|
||
const logger = require('../utils/logger');
|
||
const auth = require('../middleware/auth');
|
||
const path = require('path');
|
||
const fs = require('fs');
|
||
|
||
/**
|
||
* @route POST /api/dle
|
||
* @desc Создать новое DLE (Digital Legal Entity)
|
||
* @access Private (только для авторизованных пользователей с ролью admin)
|
||
*/
|
||
router.post('/', auth.requireAuth, auth.requireAdmin, async (req, res, next) => {
|
||
try {
|
||
const dleParams = req.body;
|
||
logger.info('Получен запрос на создание DLE:', dleParams);
|
||
|
||
// Если параметр partners не был передан явно, используем адрес авторизованного пользователя
|
||
if (!dleParams.partners || dleParams.partners.length === 0) {
|
||
// Проверяем, есть ли в сессии адрес кошелька пользователя
|
||
if (!req.user || !req.user.walletAddress) {
|
||
return res.status(400).json({
|
||
success: false,
|
||
message: 'Не указан адрес кошелька пользователя или партнеров для распределения токенов'
|
||
});
|
||
}
|
||
|
||
// Используем адрес авторизованного пользователя
|
||
dleParams.partners = [req.user.address || req.user.walletAddress];
|
||
|
||
// Если суммы не указаны, используем значение по умолчанию (100% токенов)
|
||
if (!dleParams.amounts || dleParams.amounts.length === 0) {
|
||
dleParams.amounts = ['1000000'];
|
||
}
|
||
}
|
||
|
||
const result = await dleService.createDLE(dleParams);
|
||
|
||
res.status(201).json({
|
||
success: true,
|
||
message: 'DLE успешно создано',
|
||
data: result
|
||
});
|
||
} catch (error) {
|
||
logger.error('Ошибка при создании DLE:', error);
|
||
next(error);
|
||
}
|
||
});
|
||
|
||
/**
|
||
* @route GET /api/dle
|
||
* @desc Получить список всех DLE
|
||
* @access Public (доступно всем пользователям, включая гостевых)
|
||
*/
|
||
router.get('/', async (req, res, next) => {
|
||
try {
|
||
const dles = await dleService.getAllDLEs();
|
||
res.json({
|
||
success: true,
|
||
data: dles
|
||
});
|
||
} catch (error) {
|
||
logger.error('Ошибка при получении списка DLE:', error);
|
||
next(error);
|
||
}
|
||
});
|
||
|
||
/**
|
||
* @route GET /api/dle/settings
|
||
* @desc Получить настройки для деплоя DLE по умолчанию
|
||
* @access Private (только для авторизованных пользователей)
|
||
*/
|
||
router.get('/settings', auth.requireAuth, (req, res) => {
|
||
// Возвращаем настройки по умолчанию, которые будут использоваться
|
||
// при заполнении формы на фронтенде
|
||
res.json({
|
||
success: true,
|
||
data: {
|
||
votingDelay: 1, // 1 блок задержки перед началом голосования
|
||
votingPeriod: 45818, // ~1 неделя в блоках (при 13 секундах на блок)
|
||
proposalThreshold: '100000', // 100,000 токенов
|
||
quorumPercentage: 4, // 4% от общего количества токенов
|
||
minTimelockDelay: 2 // 2 дня
|
||
}
|
||
});
|
||
});
|
||
|
||
/**
|
||
* @route DELETE /api/dle/:tokenAddress
|
||
* @desc Удалить DLE по адресу токена
|
||
* @access Private (только для авторизованных пользователей с ролью admin)
|
||
*/
|
||
router.delete('/:tokenAddress', auth.requireAuth, auth.requireAdmin, async (req, res, next) => {
|
||
try {
|
||
const { tokenAddress } = req.params;
|
||
logger.info(`Получен запрос на удаление DLE с адресом токена: ${tokenAddress}`);
|
||
|
||
// Проверяем существование DLE в директории contracts-data/dles
|
||
const dlesDir = path.join(__dirname, '../contracts-data/dles');
|
||
const files = fs.readdirSync(dlesDir);
|
||
|
||
let fileToDelete = null;
|
||
|
||
// Находим файл, содержащий указанный адрес токена
|
||
for (const file of files) {
|
||
const filePath = path.join(dlesDir, file);
|
||
if (fs.statSync(filePath).isFile() && file.endsWith('.json')) {
|
||
try {
|
||
const dleData = JSON.parse(fs.readFileSync(filePath, 'utf8'));
|
||
if (dleData.tokenAddress && dleData.tokenAddress.toLowerCase() === tokenAddress.toLowerCase()) {
|
||
fileToDelete = filePath;
|
||
break;
|
||
}
|
||
} catch (err) {
|
||
logger.error(`Ошибка при чтении файла ${file}:`, err);
|
||
}
|
||
}
|
||
}
|
||
|
||
if (!fileToDelete) {
|
||
return res.status(404).json({
|
||
success: false,
|
||
message: `DLE с адресом токена ${tokenAddress} не найдено`
|
||
});
|
||
}
|
||
|
||
// Удаляем файл
|
||
fs.unlinkSync(fileToDelete);
|
||
|
||
res.json({
|
||
success: true,
|
||
message: `DLE с адресом токена ${tokenAddress} успешно удалено`
|
||
});
|
||
} catch (error) {
|
||
logger.error('Ошибка при удалении DLE:', error);
|
||
next(error);
|
||
}
|
||
});
|
||
|
||
/**
|
||
* @route DELETE /api/dle/empty/:fileName
|
||
* @desc Удалить пустое DLE по имени файла
|
||
* @access Private (только для авторизованных пользователей с ролью admin)
|
||
*/
|
||
router.delete('/empty/:fileName', auth.requireAuth, auth.requireAdmin, async (req, res, next) => {
|
||
try {
|
||
const { fileName } = req.params;
|
||
logger.info(`Получен запрос на удаление пустого DLE с именем файла: ${fileName}`);
|
||
|
||
// Проверяем существование файла в директории contracts-data/dles
|
||
const dlesDir = path.join(__dirname, '../contracts-data/dles');
|
||
const filePath = path.join(dlesDir, fileName);
|
||
|
||
if (!fs.existsSync(filePath)) {
|
||
return res.status(404).json({
|
||
success: false,
|
||
message: `Файл ${fileName} не найден`
|
||
});
|
||
}
|
||
|
||
// Удаляем файл
|
||
fs.unlinkSync(filePath);
|
||
|
||
res.json({
|
||
success: true,
|
||
message: `Пустое DLE с именем файла ${fileName} успешно удалено`
|
||
});
|
||
} catch (error) {
|
||
logger.error('Ошибка при удалении пустого DLE:', error);
|
||
next(error);
|
||
}
|
||
});
|
||
|
||
module.exports = router;
|