167 lines
5.9 KiB
JavaScript
167 lines
5.9 KiB
JavaScript
/**
|
||
* Copyright (c) 2024-2025 Тарабанов Александр Викторович
|
||
* All rights reserved.
|
||
*
|
||
* This software is proprietary and confidential.
|
||
* Unauthorized copying, modification, or distribution is prohibited.
|
||
*
|
||
* For licensing inquiries: info@hb3-accelerator.com
|
||
* Website: https://hb3-accelerator.com
|
||
* GitHub: https://github.com/HB3-ACCELERATOR
|
||
*/
|
||
|
||
const express = require('express');
|
||
const router = express.Router();
|
||
|
||
/**
|
||
* Endpoint для деплоя модулей с данными из базы данных
|
||
* POST /api/module-deployment/deploy-module-from-db
|
||
*/
|
||
router.post('/deploy-module-from-db', async (req, res) => {
|
||
try {
|
||
const { dleAddress, moduleType } = req.body;
|
||
|
||
if (!dleAddress || !moduleType) {
|
||
return res.status(400).json({
|
||
success: false,
|
||
error: 'Адрес DLE и тип модуля обязательны'
|
||
});
|
||
}
|
||
|
||
console.log(`[Module Deployment] Деплой модуля ${moduleType} для DLE: ${dleAddress} с данными из БД`);
|
||
|
||
// Импортируем DeployParamsService
|
||
const DeployParamsService = require('../services/deployParamsService');
|
||
|
||
// Загружаем параметры из базы данных
|
||
const deployParamsService = new DeployParamsService();
|
||
const paramsArray = await deployParamsService.getLatestDeployParams(1);
|
||
|
||
if (!paramsArray || paramsArray.length === 0) {
|
||
return res.status(400).json({
|
||
success: false,
|
||
error: 'Параметры деплоя не найдены в базе данных'
|
||
});
|
||
}
|
||
|
||
const params = paramsArray[0]; // Берем первый (последний) элемент
|
||
|
||
// Проверяем, что модуль поддерживается
|
||
const supportedModules = ['treasury', 'timelock', 'reader', 'hierarchicalVoting'];
|
||
if (!supportedModules.includes(moduleType)) {
|
||
return res.status(400).json({
|
||
success: false,
|
||
error: `Неподдерживаемый тип модуля: ${moduleType}. Поддерживаемые: ${supportedModules.join(', ')}`
|
||
});
|
||
}
|
||
|
||
// Устанавливаем переменные окружения из базы данных
|
||
if (params.privateKey || params.private_key) {
|
||
process.env.PRIVATE_KEY = params.privateKey || params.private_key;
|
||
}
|
||
|
||
const ApiKeyManager = require('../utils/apiKeyManager');
|
||
const etherscanKey = ApiKeyManager.getAndSetEtherscanApiKey(params);
|
||
|
||
if (etherscanKey) {
|
||
}
|
||
|
||
// Запускаем деплой модулей через скрипт
|
||
const { spawn } = require('child_process');
|
||
const path = require('path');
|
||
|
||
const scriptPath = path.join(__dirname, '../scripts/deploy/deploy-modules.js');
|
||
const deploymentId = params.id || 'latest';
|
||
|
||
console.log(`[Module Deployment] Запускаем скрипт деплоя с deploymentId: ${deploymentId}`);
|
||
|
||
const child = spawn('node', [scriptPath, '--deployment-id', deploymentId, '--module-type', moduleType], {
|
||
cwd: path.join(__dirname, '..'),
|
||
stdio: 'pipe'
|
||
});
|
||
|
||
let stdout = '';
|
||
let stderr = '';
|
||
|
||
child.stdout.on('data', (data) => {
|
||
stdout += data.toString();
|
||
console.log(`[Deploy Script] ${data.toString().trim()}`);
|
||
});
|
||
|
||
child.stderr.on('data', (data) => {
|
||
stderr += data.toString();
|
||
console.error(`[Deploy Script Error] ${data.toString().trim()}`);
|
||
});
|
||
|
||
// Отправляем немедленный ответ о запуске деплоя
|
||
res.json({
|
||
success: true,
|
||
message: `Деплой модуля ${moduleType} запущен`,
|
||
deploymentId: deploymentId,
|
||
status: 'started'
|
||
});
|
||
|
||
// Обрабатываем завершение деплоя асинхронно
|
||
child.on('close', (code) => {
|
||
if (code === 0) {
|
||
console.log(`[Module Deployment] Деплой модуля ${moduleType} успешно завершен`);
|
||
// Здесь можно добавить WebSocket уведомление о завершении
|
||
} else {
|
||
console.error(`[Module Deployment] Ошибка при деплое модуля ${moduleType}: код ${code}`);
|
||
// Здесь можно добавить WebSocket уведомление об ошибке
|
||
}
|
||
});
|
||
|
||
child.on('error', (error) => {
|
||
console.error(`[Module Deployment] Ошибка запуска скрипта деплоя:`, error);
|
||
res.status(500).json({
|
||
success: false,
|
||
error: `Ошибка запуска скрипта деплоя: ${error.message}`
|
||
});
|
||
});
|
||
|
||
} catch (error) {
|
||
console.error('[Module Deployment] Ошибка при деплое модуля из БД:', error);
|
||
res.status(500).json({
|
||
success: false,
|
||
error: 'Ошибка при деплое модуля: ' + error.message
|
||
});
|
||
}
|
||
});
|
||
|
||
/**
|
||
* Endpoint для получения статуса деплоя модулей
|
||
* GET /api/module-deployment/deployment-status
|
||
*/
|
||
router.get('/deployment-status', async (req, res) => {
|
||
try {
|
||
const { dleAddress } = req.query;
|
||
|
||
if (!dleAddress) {
|
||
return res.status(400).json({
|
||
success: false,
|
||
error: 'Адрес DLE обязателен'
|
||
});
|
||
}
|
||
|
||
// Здесь можно добавить логику для проверки статуса деплоя
|
||
// Например, проверка файлов результатов деплоя
|
||
|
||
res.json({
|
||
success: true,
|
||
message: 'Статус деплоя получен',
|
||
dleAddress: dleAddress,
|
||
status: 'completed' // или 'in_progress', 'failed'
|
||
});
|
||
|
||
} catch (error) {
|
||
console.error('[Module Deployment] Ошибка получения статуса деплоя:', error);
|
||
res.status(500).json({
|
||
success: false,
|
||
error: 'Ошибка получения статуса деплоя: ' + error.message
|
||
});
|
||
}
|
||
});
|
||
|
||
module.exports = router;
|