Files
DLE/backend/utils/apiKeyManager.js
2026-03-01 22:03:48 +03:00

108 lines
3.9 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* Централизованный менеджер API ключей
* Унифицирует работу с API ключами Etherscan
* Copyright (c) 2024-2026 Тарабанов Александр Викторович
*/
const logger = require('./logger');
class ApiKeyManager {
/**
* Получает API ключ Etherscan из различных источников
* @param {Object} params - Параметры деплоя
* @param {Object} reqBody - Тело запроса (опционально)
* @returns {string|null} - API ключ или null
*/
static getEtherscanApiKey(params = {}, reqBody = {}) {
// Приоритет источников:
// 1. Из параметров деплоя (БД)
// 2. Из тела запроса (фронтенд)
// 3. Из переменных окружения
// 4. Из секретов
let apiKey = null;
// 1. Из параметров деплоя (БД) - приоритет 1
if (params.etherscan_api_key) {
apiKey = params.etherscan_api_key;
logger.info('[API_KEY] ✅ Ключ получен из параметров деплоя (БД)');
}
// 2. Из тела запроса (фронтенд) - приоритет 2
else if (reqBody.etherscanApiKey) {
apiKey = reqBody.etherscanApiKey;
logger.info('[API_KEY] ✅ Ключ получен из тела запроса (фронтенд)');
}
// 3. Из переменных окружения - приоритет 3
else if (process.env.ETHERSCAN_API_KEY) {
apiKey = process.env.ETHERSCAN_API_KEY;
logger.info('[API_KEY] ✅ Ключ получен из переменных окружения');
}
// 4. Из секретов - приоритет 4
else if (process.env.ETHERSCAN_V2_API_KEY) {
apiKey = process.env.ETHERSCAN_V2_API_KEY;
logger.info('[API_KEY] ✅ Ключ получен из секретов');
}
if (apiKey) {
logger.info(`[API_KEY] 🔑 API ключ найден: ${apiKey.substring(0, 8)}...`);
return apiKey;
} else {
logger.warn('[API_KEY] ⚠️ API ключ Etherscan не найден');
return null;
}
}
/**
* Устанавливает API ключ в переменные окружения
* @param {string} apiKey - API ключ
*/
static setEtherscanApiKey(apiKey) {
if (apiKey) {
process.env.ETHERSCAN_API_KEY = apiKey;
logger.info(`[API_KEY] 🔧 API ключ установлен в переменные окружения: ${apiKey.substring(0, 8)}...`);
}
}
/**
* Проверяет наличие API ключа
* @param {string} apiKey - API ключ для проверки
* @returns {boolean} - true если ключ валидный
*/
static validateApiKey(apiKey) {
if (!apiKey || typeof apiKey !== 'string') {
logger.warn('[API_KEY] ❌ API ключ не валидный: пустой или не строка');
return false;
}
if (apiKey.length < 10) {
logger.warn('[API_KEY] ❌ API ключ слишком короткий');
return false;
}
logger.info('[API_KEY] ✅ API ключ валидный');
return true;
}
/**
* Получает и устанавливает API ключ (универсальный метод)
* @param {Object} params - Параметры деплоя
* @param {Object} reqBody - Тело запроса (опционально)
* @returns {string|null} - API ключ или null
*/
static getAndSetEtherscanApiKey(params = {}, reqBody = {}) {
const apiKey = this.getEtherscanApiKey(params, reqBody);
if (apiKey && this.validateApiKey(apiKey)) {
this.setEtherscanApiKey(apiKey);
return apiKey;
}
return null;
}
}
module.exports = ApiKeyManager;