ваше сообщение коммита

This commit is contained in:
2025-08-01 16:33:10 +03:00
parent 3ee29f16bd
commit e30d672c52
69 changed files with 690 additions and 2130 deletions

View File

@@ -114,13 +114,13 @@ app.use((req, res, next) => sessionConfig.sessionMiddleware(req, res, next));
// Добавим middleware для проверки сессии
app.use(async (req, res, next) => {
console.log('Request cookies:', req.headers.cookie);
console.log('Session ID:', req.sessionID);
// console.log('Request cookies:', req.headers.cookie);
// console.log('Session ID:', req.sessionID);
// Проверяем сессию в базе данных
if (req.sessionID) {
const result = await db.getQuery()('SELECT sess FROM session WHERE sid = $1', [req.sessionID]);
console.log('Session from DB:', result.rows[0]?.sess);
// console.log('Session from DB:', result.rows[0]?.sess);
}
// Если сессия уже есть, используем её
@@ -156,7 +156,7 @@ app.use(async (req, res, next) => {
await new Promise((resolve) => req.session.save(resolve));
}
} catch (error) {
console.error('Error checking auth header:', error);
// console.error('Error checking auth header:', error);
}
}
@@ -188,7 +188,7 @@ app.use(
// Логирование запросов
app.use((req, res, next) => {
console.log('[APP] Глобальный лог:', req.method, req.originalUrl);
// console.log('[APP] Глобальный лог:', req.method, req.originalUrl);
logger.info(`${req.method} ${req.url}`);
next();
});
@@ -224,21 +224,21 @@ const nonceStore = new Map(); // или любая другая реализац
const redactedValue = '***********';
// Логируем переменные окружения для отладки
console.log('NODE_ENV:', process.env.NODE_ENV);
console.log('PORT:', process.env.PORT);
console.log('POSTGRES_HOST:', process.env.POSTGRES_HOST);
console.log('POSTGRES_PORT:', process.env.POSTGRES_PORT);
console.log('POSTGRES_DB:', process.env.POSTGRES_DB);
console.log('POSTGRES_USER:', redactedValue);
console.log('POSTGRES_PASSWORD:', redactedValue);
console.log('TELEGRAM_BOT_TOKEN:', redactedValue);
console.log('TELEGRAM_BOT_USERNAME:', process.env.TELEGRAM_BOT_USERNAME);
console.log('OPENAI_API_KEY:', redactedValue);
// console.log('NODE_ENV:', process.env.NODE_ENV);
// console.log('PORT:', process.env.PORT);
// console.log('POSTGRES_HOST:', process.env.POSTGRES_HOST);
// console.log('POSTGRES_PORT:', process.env.POSTGRES_PORT);
// console.log('POSTGRES_DB:', process.env.POSTGRES_DB);
// console.log('POSTGRES_USER:', redactedValue);
// console.log('POSTGRES_PASSWORD:', redactedValue);
// console.log('TELEGRAM_BOT_TOKEN:', redactedValue);
// console.log('TELEGRAM_BOT_USERNAME:', process.env.TELEGRAM_BOT_USERNAME);
// console.log('OPENAI_API_KEY:', redactedValue);
// console.log('SESSION_SECRET:', process.env.SESSION_SECRET); // Убираем вывод секретного ключа
console.log('EMAIL_USER:', process.env.EMAIL_USER);
console.log('EMAIL_PASSWORD:', redactedValue);
// console.log('EMAIL_USER:', process.env.EMAIL_USER);
// console.log('EMAIL_PASSWORD:', redactedValue);
console.log('typeof errorHandler:', typeof errorHandler, errorHandler.name);
// console.log('typeof errorHandler:', typeof errorHandler, errorHandler.name);
// Добавляем обработчик ошибок последним
app.use(errorHandler);
@@ -303,7 +303,7 @@ setInterval(
try {
await db.getQuery('DELETE FROM session WHERE expire < NOW()');
} catch (error) {
console.error('Error cleaning old sessions:', error);
// console.error('Error cleaning old sessions:', error);
}
},
15 * 60 * 1000

View File

@@ -44,7 +44,7 @@ async function initRoles() {
(4, 'admin', 'Администратор с полным доступом');
`);
console.log('Таблица roles создана и заполнена');
// console.log('Таблица roles создана и заполнена');
} else {
// Проверяем наличие ролей
const rolesExist = await pool.query(`
@@ -74,11 +74,11 @@ async function initRoles() {
`);
}
console.log('Таблица roles обновлена');
// console.log('Таблица roles обновлена');
}
}
} catch (error) {
console.error('Ошибка при инициализации таблицы roles:', error);
// console.error('Ошибка при инициализации таблицы roles:', error);
throw error;
}
}

View File

@@ -10,7 +10,7 @@
* GitHub: https://github.com/HB3-ACCELERATOR
*/
console.log('[DIAG][auth.js] Файл загружен:', __filename);
// console.log('[DIAG][auth.js] Файл загружен:', __filename);
const { createError } = require('../utils/error');
const authService = require('../services/auth-service');
@@ -30,14 +30,14 @@ try {
encryptionKey = fs.readFileSync(keyPath, 'utf8').trim();
}
} catch (keyError) {
console.error('Error reading encryption key:', keyError);
// console.error('Error reading encryption key:', keyError);
}
/**
* Middleware для проверки аутентификации
*/
const requireAuth = async (req, res, next) => {
console.log('[DIAG][requireAuth] session:', req.session);
// console.log('[DIAG][requireAuth] session:', req.session);
if (!req.session || !req.session.authenticated) {
return res.status(401).json({ error: 'Требуется аутентификация' });
}
@@ -148,7 +148,7 @@ async function checkRole(req, res, next) {
next();
} catch (error) {
console.error('Error in checkRole middleware:', error);
// console.error('Error in checkRole middleware:', error);
res.status(500).json({ error: 'Internal server error' });
}
}

View File

@@ -18,11 +18,11 @@ const { ERROR_CODES } = require('../utils/constants');
* Middleware для обработки ошибок
*/
const errorHandler = (err, req, res, next) => {
console.log('errorHandler called, arguments:', arguments);
console.log('typeof res:', typeof res, 'isFunction:', typeof res === 'function');
console.error('errorHandler: err =', err);
console.error('errorHandler: typeof err =', typeof err);
console.error('errorHandler: stack =', err && err.stack);
// console.log('errorHandler called, arguments:', arguments);
// console.log('typeof res:', typeof res, 'isFunction:', typeof res === 'function');
// console.error('errorHandler: err =', err);
// console.error('errorHandler: typeof err =', typeof err);
// console.error('errorHandler: stack =', err && err.stack);
// Логируем ошибку
logger.error(`Error: ${err.message}`, {
stack: err.stack,

View File

@@ -146,28 +146,28 @@ router.post('/', async (req, res) => {
// 4. Если это исходящее сообщение для Telegram — отправляем через бота
if (channel === 'telegram' && direction === 'out') {
try {
console.log(`[messages.js] Попытка отправки сообщения в Telegram для user_id=${user_id}`);
// console.log(`[messages.js] Попытка отправки сообщения в Telegram для user_id=${user_id}`);
// Получаем Telegram ID пользователя
const tgIdentity = await db.getQuery()(
'SELECT decrypt_text(provider_id_encrypted, $3) as provider_id FROM user_identities WHERE user_id = $1 AND provider_encrypted = encrypt_text($2, $3) LIMIT 1',
[user_id, 'telegram', encryptionKey]
);
console.log(`[messages.js] Результат поиска Telegram ID:`, tgIdentity.rows);
// console.log(`[messages.js] Результат поиска Telegram ID:`, tgIdentity.rows);
if (tgIdentity.rows.length > 0) {
const telegramId = tgIdentity.rows[0].provider_id;
console.log(`[messages.js] Отправка сообщения в Telegram ID: ${telegramId}, текст: ${content}`);
// console.log(`[messages.js] Отправка сообщения в Telegram ID: ${telegramId}, текст: ${content}`);
const bot = await telegramBot.getBot();
try {
const sendResult = await bot.telegram.sendMessage(telegramId, content);
console.log(`[messages.js] Результат отправки в Telegram:`, sendResult);
// console.log(`[messages.js] Результат отправки в Telegram:`, sendResult);
} catch (sendErr) {
console.error(`[messages.js] Ошибка при отправке в Telegram:`, sendErr);
// console.error(`[messages.js] Ошибка при отправке в Telegram:`, sendErr);
}
} else {
console.warn(`[messages.js] Не найден Telegram ID для user_id=${user_id}`);
// console.warn(`[messages.js] Не найден Telegram ID для user_id=${user_id}`);
}
} catch (err) {
console.error('[messages.js] Ошибка отправки сообщения в Telegram:', err);
// console.error('[messages.js] Ошибка отправки сообщения в Telegram:', err);
}
}
// 5. Если это исходящее сообщение для Email — отправляем email
@@ -183,7 +183,7 @@ router.post('/', async (req, res) => {
await emailBot.sendEmail(email, 'Новое сообщение', content);
}
} catch (err) {
console.error('[messages.js] Ошибка отправки email:', err);
// console.error('[messages.js] Ошибка отправки email:', err);
}
}
broadcastMessagesUpdate();
@@ -196,16 +196,16 @@ router.post('/', async (req, res) => {
// POST /api/messages/mark-read
router.post('/mark-read', async (req, res) => {
try {
console.log('[DEBUG] /mark-read req.user:', req.user);
console.log('[DEBUG] /mark-read req.body:', req.body);
// console.log('[DEBUG] /mark-read req.user:', req.user);
// console.log('[DEBUG] /mark-read req.body:', req.body);
const adminId = req.user && req.user.id;
const { userId, lastReadAt } = req.body;
if (!adminId) {
console.error('[ERROR] /mark-read: adminId (req.user.id) is missing');
// console.error('[ERROR] /mark-read: adminId (req.user.id) is missing');
return res.status(401).json({ error: 'Unauthorized: adminId missing' });
}
if (!userId || !lastReadAt) {
console.error('[ERROR] /mark-read: userId or lastReadAt missing');
// console.error('[ERROR] /mark-read: userId or lastReadAt missing');
return res.status(400).json({ error: 'userId and lastReadAt required' });
}
await db.query(`
@@ -215,7 +215,7 @@ router.post('/mark-read', async (req, res) => {
`, [adminId, userId, lastReadAt]);
res.json({ success: true });
} catch (e) {
console.error('[ERROR] /mark-read:', e);
// console.error('[ERROR] /mark-read:', e);
res.status(500).json({ error: e.message });
}
});
@@ -223,23 +223,23 @@ router.post('/mark-read', async (req, res) => {
// GET /api/messages/read-status
router.get('/read-status', async (req, res) => {
try {
console.log('[DEBUG] /read-status req.user:', req.user);
console.log('[DEBUG] /read-status req.session:', req.session);
console.log('[DEBUG] /read-status req.session.userId:', req.session && req.session.userId);
// console.log('[DEBUG] /read-status req.user:', req.user);
// console.log('[DEBUG] /read-status req.session:', req.session);
// console.log('[DEBUG] /read-status req.session.userId:', req.session && req.session.userId);
const adminId = req.user && req.user.id;
if (!adminId) {
console.error('[ERROR] /read-status: adminId (req.user.id) is missing');
// console.error('[ERROR] /read-status: adminId (req.user.id) is missing');
return res.status(401).json({ error: 'Unauthorized: adminId missing' });
}
const result = await db.query('SELECT user_id, last_read_at FROM admin_read_messages WHERE admin_id = $1', [adminId]);
console.log('[DEBUG] /read-status SQL result:', result.rows);
// console.log('[DEBUG] /read-status SQL result:', result.rows);
const map = {};
for (const row of result.rows) {
map[row.user_id] = row.last_read_at;
}
res.json(map);
} catch (e) {
console.error('[ERROR] /read-status:', e);
// console.error('[ERROR] /read-status:', e);
res.status(500).json({ error: e.message });
}
});

View File

@@ -10,7 +10,7 @@
* GitHub: https://github.com/HB3-ACCELERATOR
*/
console.log('[DIAG][tables.js] Файл загружен:', __filename);
// console.log('[DIAG][tables.js] Файл загружен:', __filename);
const express = require('express');
const router = express.Router();
@@ -32,7 +32,7 @@ function getEncryptionKey() {
}
router.use((req, res, next) => {
console.log('Tables router received:', req.method, req.originalUrl);
// console.log('Tables router received:', req.method, req.originalUrl);
next();
});
@@ -44,7 +44,7 @@ router.get('/', async (req, res, next) => {
try {
encryptionKey = getEncryptionKey();
} catch (keyError) {
console.error('Error reading encryption key:', keyError);
// console.error('Error reading encryption key:', keyError);
return res.status(500).json({ error: 'Database encryption error' });
}
@@ -65,7 +65,7 @@ router.post('/', async (req, res, next) => {
try {
encryptionKey = getEncryptionKey();
} catch (keyError) {
console.error('Error reading encryption key:', keyError);
// console.error('Error reading encryption key:', keyError);
return res.status(500).json({ error: 'Database encryption error' });
}
@@ -98,7 +98,7 @@ router.get('/rag-sources', async (req, res, next) => {
res.json(result.rows);
} catch (err) {
console.error('[RAG Sources] Error:', err);
// console.error('[RAG Sources] Error:', err);
next(err);
}
});
@@ -236,7 +236,7 @@ router.post('/:id/rows', async (req, res, next) => {
'INSERT INTO user_rows (table_id) VALUES ($1) RETURNING *',
[tableId]
);
console.log('[DEBUG][addRow] result.rows[0]:', result.rows[0]);
// console.log('[DEBUG][addRow] result.rows[0]:', result.rows[0]);
// Получаем ключ шифрования
const fs = require('fs');
const path = require('path');
@@ -260,11 +260,11 @@ router.post('/:id/rows', async (req, res, next) => {
// Получаем все строки и значения для upsert
const rows = (await db.getQuery()('SELECT r.id as row_id, decrypt_text(c.value_encrypted, $2) as text, decrypt_text(c2.value_encrypted, $2) as answer FROM user_rows r LEFT JOIN user_cell_values c ON c.row_id = r.id AND c.column_id = 1 LEFT JOIN user_cell_values c2 ON c2.row_id = r.id AND c2.column_id = 2 WHERE r.table_id = $1', [tableId, encryptionKey])).rows;
const upsertRows = rows.filter(r => r.row_id && r.text).map(r => ({ row_id: r.row_id, text: r.text, metadata: { answer: r.answer } }));
console.log('[DEBUG][upsertRows]', upsertRows);
// console.log('[DEBUG][upsertRows]', upsertRows);
if (upsertRows.length > 0) {
await vectorSearchClient.upsert(tableId, upsertRows);
}
console.log('[DEBUG][addRow] res.json:', result.rows[0]);
// console.log('[DEBUG][addRow] res.json:', result.rows[0]);
res.json(result.rows[0]);
broadcastTableUpdate(tableId);
} catch (err) {

View File

@@ -16,10 +16,10 @@ const db = require('../db');
const { requireAuth } = require('../middleware/auth');
const { broadcastTagsUpdate } = require('../wsHub');
console.log('[tags.js] ROUTER LOADED');
// console.log('[tags.js] ROUTER LOADED');
router.use((req, res, next) => {
console.log('[tags.js] ROUTER REQUEST:', req.method, req.originalUrl);
// console.log('[tags.js] ROUTER REQUEST:', req.method, req.originalUrl);
next();
});
@@ -100,15 +100,15 @@ router.post('/user/:rowId/multirelations', async (req, res) => {
encryptionKey = fs.readFileSync(keyPath, 'utf8').trim();
}
} catch (keyError) {
console.error('Error reading encryption key:', keyError);
// console.error('Error reading encryption key:', keyError);
}
// Проверяем, является ли это обновлением тегов (проверяем связанную таблицу)
const relatedTableName = (await db.getQuery()('SELECT decrypt_text(name_encrypted, $2) as name FROM user_tables WHERE id = $1', [to_table_id, encryptionKey])).rows[0];
console.log('🔄 [Tags] Multirelations: проверяем связанную таблицу:', { to_table_id, tableName: relatedTableName?.name });
// console.log('🔄 [Tags] Multirelations: проверяем связанную таблицу:', { to_table_id, tableName: relatedTableName?.name });
if (relatedTableName && relatedTableName.name === 'Теги клиентов') {
console.log('🔄 [Tags] Multirelations: обновление тегов для строки:', rowId);
// console.log('🔄 [Tags] Multirelations: обновление тегов для строки:', rowId);
// Удаляем старые связи для этой строки/столбца
await db.getQuery()('DELETE FROM user_table_relations WHERE from_row_id = $1 AND column_id = $2', [rowId, column_id]);

View File

@@ -19,10 +19,10 @@ const { deleteUserById } = require('../services/userDeleteService');
const { broadcastContactsUpdate } = require('../wsHub');
// const userService = require('../services/userService');
console.log('[users.js] ROUTER LOADED');
// console.log('[users.js] ROUTER LOADED');
router.use((req, res, next) => {
console.log('[users.js] ROUTER REQUEST:', req.method, req.originalUrl);
// console.log('[users.js] ROUTER REQUEST:', req.method, req.originalUrl);
next();
});
@@ -42,7 +42,7 @@ router.get('/profile', requireAuth, async (req, res) => {
}
res.json({ success: true, user });
} catch (error) {
console.error('Error getting user profile:', error);
// console.error('Error getting user profile:', error);
res.status(500).json({ success: false, message: 'Internal server error' });
}
});
@@ -57,7 +57,7 @@ router.put('/profile', requireAuth, async (req, res) => {
const updatedUser = await userService.updateUserProfile(userId, profileData);
res.json({ success: true, user: updatedUser, message: 'Profile updated successfully' });
} catch (error) {
console.error('Error updating user profile:', error);
// console.error('Error updating user profile:', error);
// Можно добавить более специфичную обработку ошибок, например, если данные невалидны
res.status(500).json({ success: false, message: 'Internal server error' });
}
@@ -382,19 +382,19 @@ router.patch('/:id', requireAuth, async (req, res) => {
// DELETE /api/users/:id — удалить контакт и все связанные данные
router.delete('/:id', requireAuth, async (req, res) => {
console.log('[users.js] DELETE HANDLER', req.params.id);
// console.log('[users.js] DELETE HANDLER', req.params.id);
const userId = Number(req.params.id);
console.log('[ROUTER] Перед вызовом deleteUserById для userId:', userId);
// console.log('[ROUTER] Перед вызовом deleteUserById для userId:', userId);
try {
const deletedCount = await deleteUserById(userId);
console.log('[ROUTER] deleteUserById вернул:', deletedCount);
// console.log('[ROUTER] deleteUserById вернул:', deletedCount);
if (deletedCount === 0) {
return res.status(404).json({ success: false, deleted: 0, error: 'User not found' });
}
broadcastContactsUpdate();
res.json({ success: true, deleted: deletedCount });
} catch (e) {
console.error('[DELETE] Ошибка при удалении пользователя:', e);
// console.error('[DELETE] Ошибка при удалении пользователя:', e);
res.status(500).json({ error: 'DB error', details: e.message });
}
});

View File

@@ -21,9 +21,9 @@ const requiredDependencies = ['express-rate-limit', 'winston', 'helmet', 'csurf'
const missingDependencies = requiredDependencies.filter((dep) => !dependencies[dep]);
if (missingDependencies.length > 0) {
console.error('Missing dependencies:', missingDependencies);
console.error('Please install them with: yarn add ' + missingDependencies.join(' '));
// console.error('Missing dependencies:', missingDependencies);
// console.error('Please install them with: yarn add ' + missingDependencies.join(' '));
process.exit(1);
}
console.log('All required dependencies are installed.');
// console.log('All required dependencies are installed.');

View File

@@ -15,19 +15,19 @@ const db = require('../db');
async function cleanupSessions() {
try {
console.log('Starting session cleanup...');
// console.log('Starting session cleanup...');
const result = await sessionService.cleanupProcessedGuestIds();
if (result) {
console.log('Session cleanup completed successfully');
// console.log('Session cleanup completed successfully');
} else {
console.log('Session cleanup failed');
// console.log('Session cleanup failed');
}
process.exit(0);
} catch (error) {
console.error('Error during cleanup:', error);
// console.error('Error during cleanup:', error);
process.exit(1);
}
}

View File

@@ -17,14 +17,14 @@ process.env.OLLAMA_MODEL = 'qwen2.5:7b';
const aiQueueService = require('../services/ai-queue');
async function testQueueInDocker() {
console.log('🐳 Тестирование AI очереди в Docker...\n');
// console.log('🐳 Тестирование AI очереди в Docker...\n');
try {
// Проверяем инициализацию
console.log('1. Проверка инициализации очереди...');
// console.log('1. Проверка инициализации очереди...');
const stats = aiQueueService.getStats();
console.log('✅ Очередь инициализирована:', stats.isInitialized);
console.log('📊 Статистика:', {
// console.log('✅ Очередь инициализирована:', stats.isInitialized);
// console.log('📊 Статистика:', {
totalProcessed: stats.totalProcessed,
totalFailed: stats.totalFailed,
currentQueueSize: stats.currentQueueSize,

View File

@@ -11,7 +11,7 @@ const OLLAMA_URL = process.env.OLLAMA_URL || 'http://ollama:11434';
const MODEL_NAME = process.env.OLLAMA_MODEL || 'qwen2.5:7b';
async function warmupModel() {
console.log('🔥 Разогрев модели Ollama...');
// console.log('🔥 Разогрев модели Ollama...');
try {
// Проверяем доступность Ollama
@@ -20,7 +20,7 @@ async function warmupModel() {
throw new Error(`Ollama недоступен: ${healthResponse.status}`);
}
console.log('✅ Ollama доступен');
// console.log('✅ Ollama доступен');
// Отправляем простой запрос для разогрева
const warmupResponse = await fetch(`${OLLAMA_URL}/v1/chat/completions`, {
@@ -54,11 +54,11 @@ async function warmupModel() {
}
const data = await warmupResponse.json();
console.log('✅ Модель разогрета успешно');
console.log(`📝 Ответ модели: ${data.choices?.[0]?.message?.content?.substring(0, 100)}...`);
// console.log('✅ Модель разогрета успешно');
// console.log(`📝 Ответ модели: ${data.choices?.[0]?.message?.content?.substring(0, 100)}...`);
} catch (error) {
console.error('❌ Ошибка разогрева модели:', error.message);
// console.error('❌ Ошибка разогрева модели:', error.message);
// Не прерываем запуск приложения
}
}

View File

@@ -22,41 +22,41 @@ const { warmupModel } = require('./scripts/warmup-model'); // Добавляем
const PORT = process.env.PORT || 8000;
console.log('Начало выполнения server.js');
console.log('Переменная окружения PORT:', process.env.PORT);
console.log('Используемый порт:', process.env.PORT || 8000);
// console.log('Начало выполнения server.js');
// console.log('Переменная окружения PORT:', process.env.PORT);
// console.log('Используемый порт:', process.env.PORT || 8000);
// Инициализация сервисов
async function initServices() {
try {
console.log('Инициализация сервисов...');
console.log('[initServices] Запуск Email-бота...');
console.log('[initServices] Создаю экземпляр EmailBotService...');
// console.log('Инициализация сервисов...');
// console.log('[initServices] Запуск Email-бота...');
// console.log('[initServices] Создаю экземпляр EmailBotService...');
let emailBot;
try {
emailBot = new EmailBotService();
console.log('[initServices] Экземпляр EmailBotService создан');
// console.log('[initServices] Экземпляр EmailBotService создан');
} catch (err) {
console.error('[initServices] Ошибка при создании экземпляра EmailBotService:', err);
// console.error('[initServices] Ошибка при создании экземпляра EmailBotService:', err);
throw err;
}
console.log('[initServices] Перед вызовом emailBot.start()');
// console.log('[initServices] Перед вызовом emailBot.start()');
try {
await emailBot.start();
console.log('[initServices] Email-бот успешно запущен');
// console.log('[initServices] Email-бот успешно запущен');
} catch (err) {
console.error('[initServices] Ошибка при запуске emailBot:', err);
// console.error('[initServices] Ошибка при запуске emailBot:', err);
}
console.log('[initServices] Запуск Telegram-бота...');
// console.log('[initServices] Запуск Telegram-бота...');
try {
await getBot();
console.log('[initServices] Telegram-бот успешно запущен');
// console.log('[initServices] Telegram-бот успешно запущен');
} catch (err) {
console.error('[initServices] Ошибка при запуске Telegram-бота:', err);
// console.error('[initServices] Ошибка при запуске Telegram-бота:', err);
}
} catch (error) {
// console.error('Ошибка при инициализации сервисов:', error);
}
} catch (error) {
console.error('Ошибка при инициализации сервисов:', error);
}
}
const server = http.createServer(app);
@@ -67,22 +67,22 @@ async function startServer() {
await seedAIAssistantSettings(); // Инициализация ассистента после загрузки модели Ollama
// Разогрев модели Ollama
console.log('🔥 Запуск разогрева модели...');
// console.log('🔥 Запуск разогрева модели...');
setTimeout(() => {
warmupModel().catch(err => {
console.error('❌ Ошибка разогрева модели:', err.message);
// console.error('❌ Ошибка разогрева модели:', err.message);
});
}, 10000); // Задержка 10 секунд для полной инициализации
await initServices(); // Только теперь запускать сервисы
console.log(`Server is running on port ${PORT}`);
// console.log(`Server is running on port ${PORT}`);
}
server.listen(PORT, async () => {
try {
await startServer();
} catch (error) {
console.error('Error starting server:', error);
// console.error('Error starting server:', error);
process.exit(1);
}
});

View File

@@ -44,9 +44,9 @@ async function checkAdminRole(address) {
if (fs.existsSync(keyPath)) {
encryptionKey = fs.readFileSync(keyPath, 'utf8').trim();
}
} catch (keyError) {
console.error('Error reading encryption key:', keyError);
}
} catch (keyError) {
// console.error('Error reading encryption key:', keyError);
}
// Получаем токены и RPC из базы с расшифровкой
const tokensResult = await db.getQuery()(

View File

@@ -10,7 +10,7 @@
* GitHub: https://github.com/HB3-ACCELERATOR
*/
console.log('[ai-assistant] loaded');
// console.log('[ai-assistant] loaded');
const { ChatOllama } = require('@langchain/ollama');
const { HNSWLib } = require('@langchain/community/vectorstores/hnswlib');
@@ -51,7 +51,7 @@ class AIAssistant {
this.isModelLoaded = false;
}
} catch (error) {
console.error('Model health check failed:', error);
// console.error('Model health check failed:', error);
this.isModelLoaded = false;
}
@@ -142,7 +142,7 @@ class AIAssistant {
// Основной метод для получения ответа
async getResponse(message, language = 'auto', history = null, systemPrompt = '', rules = null) {
try {
console.log('getResponse called with:', { message, language, history, systemPrompt, rules });
// console.log('getResponse called with:', { message, language, history, systemPrompt, rules });
// Очищаем старый кэш
this.cleanupCache();
@@ -150,7 +150,7 @@ class AIAssistant {
// Проверяем здоровье модели
const isHealthy = await this.checkModelHealth();
if (!isHealthy) {
console.warn('Model is not healthy, returning fallback response');
// console.warn('Model is not healthy, returning fallback response');
return 'Извините, модель временно недоступна. Пожалуйста, попробуйте позже.';
}
@@ -161,7 +161,7 @@ class AIAssistant {
});
const cachedResponse = aiCache.get(cacheKey);
if (cachedResponse) {
console.log('Returning cached response');
// console.log('Returning cached response');
return cachedResponse;
}
@@ -207,7 +207,7 @@ class AIAssistant {
// Определяем язык, если не указан явно
const detectedLanguage = language === 'auto' ? this.detectLanguage(message) : language;
console.log('Detected language:', detectedLanguage);
// console.log('Detected language:', detectedLanguage);
// Формируем system prompt с учётом правил
let fullSystemPrompt = systemPrompt || '';
@@ -234,22 +234,22 @@ class AIAssistant {
// Пробуем прямой API запрос (OpenAI-совместимый endpoint)
try {
console.log('Trying direct API request...');
// console.log('Trying direct API request...');
response = await this.fallbackRequestOpenAI(messages, detectedLanguage, fullSystemPrompt);
console.log('Direct API response received:', response);
// console.log('Direct API response received:', response);
} catch (error) {
console.error('Error in direct API request:', error);
// console.error('Error in direct API request:', error);
// Если прямой запрос не удался, пробуем через ChatOllama (склеиваем сообщения в текст)
const chat = this.createChat(detectedLanguage, fullSystemPrompt);
try {
const prompt = messages.map(m => `${m.role === 'user' ? 'Пользователь' : m.role === 'assistant' ? 'Ассистент' : 'Система'}: ${m.content}`).join('\n');
console.log('Sending request to ChatOllama...');
// console.log('Sending request to ChatOllama...');
const chatResponse = await chat.invoke(prompt);
console.log('ChatOllama response:', chatResponse);
// console.log('ChatOllama response:', chatResponse);
response = chatResponse.content;
} catch (chatError) {
console.error('Error using ChatOllama:', chatError);
// console.error('Error using ChatOllama:', chatError);
throw chatError;
}
}
@@ -261,7 +261,7 @@ class AIAssistant {
return response;
} catch (error) {
console.error('Error in getResponse:', error);
// console.error('Error in getResponse:', error);
return 'Извините, я не смог обработать ваш запрос. Пожалуйста, попробуйте позже.';
}
}
@@ -269,7 +269,7 @@ class AIAssistant {
// Новый метод для OpenAI/Qwen2.5 совместимого endpoint
async fallbackRequestOpenAI(messages, language, systemPrompt = '') {
try {
console.log('Using fallbackRequestOpenAI with:', { messages, language, systemPrompt });
// console.log('Using fallbackRequestOpenAI with:', { messages, language, systemPrompt });
const model = this.defaultModel;
// Создаем AbortController для таймаута
@@ -315,7 +315,7 @@ class AIAssistant {
}
return data.response || '';
} catch (error) {
console.error('Error in fallbackRequestOpenAI:', error);
// console.error('Error in fallbackRequestOpenAI:', error);
if (error.name === 'AbortError') {
throw new Error('Request timeout - модель не ответила в течение 120 секунд');
}

View File

@@ -30,7 +30,7 @@ async function getSettings() {
encryptionKey = fs.readFileSync(keyPath, 'utf8').trim();
}
} catch (keyError) {
console.error('Error reading encryption key:', keyError);
// console.error('Error reading encryption key:', keyError);
}
// Получаем связанные данные из telegram_settings и email_settings

View File

@@ -148,7 +148,7 @@ async function getAllLLMModels() {
}
}
} catch (ollamaError) {
console.error('Error checking Ollama models:', ollamaError);
// console.error('Error checking Ollama models:', ollamaError);
// Если не удалось проверить Ollama, добавляем базовые модели
allModels.push({ id: 'qwen2.5:7b', provider: 'ollama' });
}
@@ -167,7 +167,7 @@ async function getAllLLMModels() {
return uniqueModels;
} catch (error) {
console.error('Error getting LLM models:', error);
// console.error('Error getting LLM models:', error);
return [];
}
}
@@ -213,7 +213,7 @@ async function getAllEmbeddingModels() {
}
}
} catch (ollamaError) {
console.error('Error checking Ollama embedding models:', ollamaError);
// console.error('Error checking Ollama embedding models:', ollamaError);
// Если не удалось проверить Ollama, добавляем базовые embedding модели
allModels.push({ id: 'mxbai-embed-large:latest', provider: 'ollama' });
}
@@ -232,7 +232,7 @@ async function getAllEmbeddingModels() {
return uniqueModels;
} catch (error) {
console.error('Error getting embedding models:', error);
// console.error('Error getting embedding models:', error);
return [];
}
}

View File

@@ -10,7 +10,7 @@
* GitHub: https://github.com/HB3-ACCELERATOR
*/
console.log('[EmailBot] emailBot.js loaded');
// console.log('[EmailBot] emailBot.js loaded');
const encryptedDb = require('./encryptedDatabaseService');
const db = require('../db');
const nodemailer = require('nodemailer');
@@ -28,7 +28,7 @@ const { isUserBlocked } = require('../utils/userUtils');
class EmailBotService {
constructor() {
console.log('[EmailBot] constructor called');
// console.log('[EmailBot] constructor called');
}
async getSettingsFromDb() {
@@ -43,7 +43,7 @@ class EmailBotService {
encryptionKey = fs.readFileSync(keyPath, 'utf8').trim();
}
} catch (keyError) {
console.error('Error reading encryption key:', keyError);
// console.error('Error reading encryption key:', keyError);
}
const { rows } = await db.getQuery()(
@@ -530,7 +530,7 @@ class EmailBotService {
async start() {
try {
console.log('[EmailBot] start() called');
// console.log('[EmailBot] start() called');
logger.info('[EmailBot] start() called');
const imapConfig = await this.getImapConfig();
// Логируем IMAP-конфиг (без пароля)
@@ -580,7 +580,7 @@ class EmailBotService {
};
tryConnect();
} catch (err) {
console.error('[EmailBot] Ошибка при старте:', err);
// console.error('[EmailBot] Ошибка при старте:', err);
logger.error('[EmailBot] Ошибка при старте:', err);
throw err;
}
@@ -592,5 +592,5 @@ class EmailBotService {
}
}
console.log('[EmailBot] module.exports = EmailBotService');
// console.log('[EmailBot] module.exports = EmailBotService');
module.exports = EmailBotService;

View File

@@ -20,34 +20,34 @@ class EncryptedDataService {
this.isEncryptionEnabled = !!this.encryptionKey;
if (this.isEncryptionEnabled) {
console.log('🔐 Шифрование базы данных активировано');
console.log('📋 Автоматическое определение зашифрованных колонок');
// console.log('🔐 Шифрование базы данных активировано');
// console.log('📋 Автоматическое определение зашифрованных колонок');
} else {
console.log('⚠️ Шифрование базы данных отключено - ключ не найден');
// console.log('⚠️ Шифрование базы данных отключено - ключ не найден');
}
}
loadEncryptionKey() {
try {
const keyPath = path.join(__dirname, '../../ssl/keys/full_db_encryption.key');
console.log(`[EncryptedDB] Trying key path: ${keyPath}`);
// console.log(`[EncryptedDB] Trying key path: ${keyPath}`);
if (fs.existsSync(keyPath)) {
const key = fs.readFileSync(keyPath, 'utf8').trim();
console.log(`[EncryptedDB] Key loaded from: ${keyPath}, length: ${key.length}`);
// console.log(`[EncryptedDB] Key loaded from: ${keyPath}, length: ${key.length}`);
return key;
}
// Попробуем альтернативный путь относительно корня приложения
const altKeyPath = '/app/ssl/keys/full_db_encryption.key';
console.log(`[EncryptedDB] Trying alternative key path: ${altKeyPath}`);
// console.log(`[EncryptedDB] Trying alternative key path: ${altKeyPath}`);
if (fs.existsSync(altKeyPath)) {
const key = fs.readFileSync(altKeyPath, 'utf8').trim();
console.log(`[EncryptedDB] Key loaded from: ${altKeyPath}, length: ${key.length}`);
// console.log(`[EncryptedDB] Key loaded from: ${altKeyPath}, length: ${key.length}`);
return key;
}
console.log(`[EncryptedDB] No key file found, using default key`);
// console.log(`[EncryptedDB] No key file found, using default key`);
return 'default-key';
} catch (error) {
console.error('❌ Ошибка загрузки ключа шифрования:', error);
// console.error('❌ Ошибка загрузки ключа шифрования:', error);
return 'default-key';
}
}
@@ -75,7 +75,7 @@ class EncryptedDataService {
const selectFields = columns.map(col => {
if (col.column_name.endsWith('_encrypted')) {
const originalName = col.column_name.replace('_encrypted', '');
console.log(`🔓 Расшифровываем поле ${col.column_name} -> ${originalName}`);
// console.log(`🔓 Расшифровываем поле ${col.column_name} -> ${originalName}`);
if (col.data_type === 'jsonb') {
return `decrypt_json(${col.column_name}, $1) as "${originalName}"`;
} else {
@@ -89,7 +89,7 @@ class EncryptedDataService {
// Если есть зашифрованная версия, пропускаем незашифрованную
if (hasEncryptedVersion) {
console.log(`⚠️ Пропускаем незашифрованное поле ${col.column_name} (есть зашифрованная версия)`);
// console.log(`⚠️ Пропускаем незашифрованное поле ${col.column_name} (есть зашифрованная версия)`);
return null;
}
@@ -171,16 +171,16 @@ class EncryptedDataService {
query += ` LIMIT ${limit}`;
}
console.log(`🔍 [getData] Выполняем запрос:`, query);
console.log(`🔍 [getData] Параметры:`, params);
// console.log(`🔍 [getData] Выполняем запрос:`, query);
// console.log(`🔍 [getData] Параметры:`, params);
const { rows } = await db.getQuery()(query, params);
console.log(`📊 Результат запроса из ${tableName}:`, rows);
// console.log(`📊 Результат запроса из ${tableName}:`, rows);
return rows;
} catch (error) {
console.error(`❌ Ошибка получения данных из ${tableName}:`, error);
// console.error(`❌ Ошибка получения данных из ${tableName}:`, error);
throw error;
}
}
@@ -223,19 +223,19 @@ class EncryptedDataService {
const encryptedColumn = columns.find(col => col.column_name === `${key}_encrypted`);
const unencryptedColumn = columns.find(col => col.column_name === key);
console.log(`🔍 Обрабатываем поле ${key} = "${value}" (тип: ${typeof value})`);
// console.log(`🔍 Обрабатываем поле ${key} = "${value}" (тип: ${typeof value})`);
if (encryptedColumn) {
// Если есть зашифрованная колонка, шифруем данные
// Проверяем, что значение не пустое перед шифрованием
if (value === null || value === undefined || (typeof value === 'string' && value.trim() === '')) {
// Пропускаем пустые значения
console.log(`⚠️ Пропускаем пустое зашифрованное поле ${key}`);
// console.log(`⚠️ Пропускаем пустое зашифрованное поле ${key}`);
continue;
}
const currentParamIndex = paramIndex++;
filteredData[key] = value; // Добавляем в отфильтрованные данные
console.log(`✅ Добавили зашифрованное поле ${key} в filteredData`);
// console.log(`✅ Добавили зашифрованное поле ${key} в filteredData`);
if (encryptedColumn.data_type === 'jsonb') {
encryptedData[`${key}_encrypted`] = `encrypt_json($${currentParamIndex}, ${hasEncryptedFields ? '$1::text' : 'NULL'})`;
} else {
@@ -247,15 +247,15 @@ class EncryptedDataService {
if ((value === null || value === undefined || (typeof value === 'string' && value.trim() === '')) &&
key !== 'role' && key !== 'sender_type') {
// Пропускаем пустые значения, кроме role и sender_type
console.log(`⚠️ Пропускаем пустое незашифрованное поле ${key}`);
// console.log(`⚠️ Пропускаем пустое незашифрованное поле ${key}`);
continue;
}
filteredData[key] = value; // Добавляем в отфильтрованные данные
unencryptedData[key] = `$${paramIndex++}`;
console.log(`✅ Добавили незашифрованное поле ${key} в filteredData и unencryptedData`);
// console.log(`✅ Добавили незашифрованное поле ${key} в filteredData и unencryptedData`);
} else {
// Если колонка не найдена, пропускаем
console.warn(`⚠️ Колонка ${key} не найдена в таблице ${tableName}`);
// console.warn(`⚠️ Колонка ${key} не найдена в таблице ${tableName}`);
}
}
@@ -263,9 +263,9 @@ class EncryptedDataService {
// Проверяем, есть ли данные для сохранения
if (Object.keys(allData).length === 0) {
console.warn(`⚠️ Нет данных для сохранения в таблице ${tableName} - все значения пустые`);
console.warn(`⚠️ Исходные данные:`, data);
console.warn(`⚠️ Отфильтрованные данные:`, filteredData);
// console.warn(`⚠️ Нет данных для сохранения в таблице ${tableName} - все значения пустые`);
// console.warn(`⚠️ Исходные данные:`, data);
// console.warn(`⚠️ Отфильтрованные данные:`, filteredData);
return null;
}
@@ -301,7 +301,7 @@ class EncryptedDataService {
return rows[0];
}
} catch (error) {
console.error(`❌ Ошибка сохранения данных в ${tableName}:`, error);
// console.error(`❌ Ошибка сохранения данных в ${tableName}:`, error);
throw error;
}
}
@@ -352,7 +352,7 @@ class EncryptedDataService {
const result = await db.getQuery()(query, params);
return result.rows;
} catch (error) {
console.error(`❌ Ошибка удаления данных из ${tableName}:`, error);
// console.error(`❌ Ошибка удаления данных из ${tableName}:`, error);
throw error;
}
}

View File

@@ -10,7 +10,7 @@
* GitHub: https://github.com/HB3-ACCELERATOR
*/
console.log('[identity-service] loaded');
// console.log('[identity-service] loaded');
const encryptedDb = require('./encryptedDatabaseService');
const db = require('../db');

View File

@@ -14,23 +14,23 @@ const encryptedDb = require('./encryptedDatabaseService');
const vectorSearch = require('./vectorSearchClient');
const { getProviderSettings } = require('./aiProviderSettingsService');
console.log('[RAG] ragService.js loaded');
// console.log('[RAG] ragService.js loaded');
// Простой кэш для RAG результатов
const ragCache = new Map();
const RAG_CACHE_TTL = 5 * 60 * 1000; // 5 минут
async function getTableData(tableId) {
console.log(`[RAG] getTableData called for tableId: ${tableId}`);
// console.log(`[RAG] getTableData called for tableId: ${tableId}`);
const columns = await encryptedDb.getData('user_columns', { table_id: tableId });
console.log(`[RAG] Found ${columns.length} columns:`, columns.map(col => ({ id: col.id, name: col.name, purpose: col.options?.purpose })));
// console.log(`[RAG] Found ${columns.length} columns:`, columns.map(col => ({ id: col.id, name: col.name, purpose: col.options?.purpose })));
const rows = await encryptedDb.getData('user_rows', { table_id: tableId });
console.log(`[RAG] Found ${rows.length} rows:`, rows.map(row => ({ id: row.id, name: row.name })));
// console.log(`[RAG] Found ${rows.length} rows:`, rows.map(row => ({ id: row.id, name: row.name })));
const cellValues = await encryptedDb.getData('user_cell_values', { row_id: { $in: rows.map(row => row.id) } });
console.log(`[RAG] Found ${cellValues.length} cell values`);
// console.log(`[RAG] Found ${cellValues.length} cell values`);
const getColId = purpose => columns.find(col => col.options?.purpose === purpose)?.id;
const questionColId = getColId('question');
@@ -40,14 +40,14 @@ async function getTableData(tableId) {
const priorityColId = getColId('priority');
const dateColId = getColId('date');
console.log(`[RAG] Column IDs:`, {
question: questionColId,
answer: answerColId,
context: contextColId,
product: productColId,
priority: priorityColId,
date: dateColId
});
// console.log(`[RAG] Column IDs:`, {
// question: questionColId,
// answer: answerColId,
// context: contextColId,
// product: productColId,
// priority: priorityColId,
// date: dateColId
// });
const data = rows.map(row => {
const cells = cellValues.filter(cell => cell.row_id === row.id);
@@ -61,34 +61,34 @@ async function getTableData(tableId) {
priority: cells.find(c => c.column_id === priorityColId)?.value,
date: cells.find(c => c.column_id === dateColId)?.value,
};
console.log(`[RAG] Processed row ${row.id}:`, result);
// console.log(`[RAG] Processed row ${row.id}:`, result);
return result;
});
return data;
}
async function ragAnswer({ tableId, userQuestion, product = null, threshold = 10 }) {
console.log(`[RAG] ragAnswer called: tableId=${tableId}, userQuestion="${userQuestion}"`);
// console.log(`[RAG] ragAnswer called: tableId=${tableId}, userQuestion="${userQuestion}"`);
// Проверяем кэш
const cacheKey = `${tableId}:${userQuestion}:${product}`;
const cached = ragCache.get(cacheKey);
if (cached && (Date.now() - cached.timestamp) < RAG_CACHE_TTL) {
console.log(`[RAG] Returning cached result for: ${cacheKey}`);
// console.log(`[RAG] Returning cached result for: ${cacheKey}`);
return cached.result;
}
const data = await getTableData(tableId);
console.log(`[RAG] Got ${data.length} rows from database`);
// console.log(`[RAG] Got ${data.length} rows from database`);
// Подробное логирование данных
data.forEach((row, index) => {
console.log(`[RAG] Row ${index}:`, {
id: row.id,
question: row.question,
answer: row.answer,
product: row.product
});
// console.log(`[RAG] Row ${index}:`, {
// id: row.id,
// question: row.question,
// answer: row.answer,
// product: row.product
// });
});
const questions = data.map(row => row.question && typeof row.question === 'string' ? row.question.trim() : row.question);
@@ -108,61 +108,61 @@ async function ragAnswer({ tableId, userQuestion, product = null, threshold = 10
}
}));
console.log(`[RAG] Prepared ${rowsForUpsert.length} rows for upsert`);
console.log(`[RAG] First row:`, rowsForUpsert[0]);
// console.log(`[RAG] Prepared ${rowsForUpsert.length} rows for upsert`);
// console.log(`[RAG] First row:`, rowsForUpsert[0]);
// Upsert все вопросы в индекс (можно оптимизировать по изменению)
if (rowsForUpsert.length > 0) {
await vectorSearch.upsert(tableId, rowsForUpsert);
console.log(`[RAG] Upsert completed`);
// console.log(`[RAG] Upsert completed`);
} else {
console.log(`[RAG] No rows to upsert, skipping`);
// console.log(`[RAG] No rows to upsert, skipping`);
}
// Поиск
let results = [];
if (rowsForUpsert.length > 0) {
results = await vectorSearch.search(tableId, userQuestion, 2); // Уменьшаем до 2 результатов
console.log(`[RAG] Search completed, got ${results.length} results`);
// console.log(`[RAG] Search completed, got ${results.length} results`);
// Подробное логирование результатов поиска
results.forEach((result, index) => {
console.log(`[RAG] Search result ${index}:`, {
row_id: result.row_id,
score: result.score,
metadata: result.metadata
});
// console.log(`[RAG] Search result ${index}:`, {
// row_id: result.row_id,
// score: result.score,
// metadata: result.metadata
// });
});
} else {
console.log(`[RAG] No data in table, skipping search`);
// console.log(`[RAG] No data in table, skipping search`);
}
// Фильтрация по тегам/продукту
let filtered = results;
console.log(`[RAG] Before filtering: ${filtered.length} results`);
// console.log(`[RAG] Before filtering: ${filtered.length} results`);
if (product) {
console.log(`[RAG] Filtering by product:`, product);
// console.log(`[RAG] Filtering by product:`, product);
filtered = filtered.filter(row => Array.isArray(row.metadata.product) ? row.metadata.product.includes(product) : row.metadata.product === product);
console.log(`[RAG] After product filtering: ${filtered.length} results`);
// console.log(`[RAG] After product filtering: ${filtered.length} results`);
}
// Берём ближайший результат с учётом порога (по модулю)
console.log(`[RAG] Looking for best result with abs(threshold): ${threshold}`);
// console.log(`[RAG] Looking for best result with abs(threshold): ${threshold}`);
const best = filtered.reduce((acc, row) => {
if (Math.abs(row.score) <= threshold && (acc === null || Math.abs(row.score) < Math.abs(acc.score))) {
return row;
}
return acc;
}, null);
console.log(`[RAG] Best result:`, best);
// console.log(`[RAG] Best result:`, best);
// Логируем все результаты с их score для диагностики
if (filtered.length > 0) {
console.log(`[RAG] All filtered results with scores:`);
filtered.forEach((result, index) => {
console.log(`[RAG] ${index}: score=${result.score}, meets_threshold=${Math.abs(result.score) <= threshold}`);
});
// console.log(`[RAG] All filtered results with scores:`);
// filtered.forEach((result, index) => {
// console.log(`[RAG] ${index}: score=${result.score}, meets_threshold=${Math.abs(result.score) <= threshold}`);
// });
}
const result = {
@@ -238,18 +238,18 @@ async function generateLLMResponse({
model,
language
}) {
console.log(`[RAG] generateLLMResponse called with:`, {
userQuestion,
context,
answer,
systemPrompt,
userTags,
product,
priority,
date,
model,
language
});
// console.log(`[RAG] generateLLMResponse called with:`, {
// userQuestion,
// context,
// answer,
// systemPrompt,
// userTags,
// product,
// priority,
// date,
// model,
// language
// });
try {
const aiAssistant = require('./ai-assistant');
@@ -286,10 +286,10 @@ async function generateLLMResponse({
rules
);
console.log(`[RAG] LLM response generated:`, llmResponse);
// console.log(`[RAG] LLM response generated:`, llmResponse);
return llmResponse;
} catch (error) {
console.error(`[RAG] Error generating LLM response:`, error);
// console.error(`[RAG] Error generating LLM response:`, error);
return 'Извините, произошла ошибка при генерации ответа.';
}
}

View File

@@ -40,13 +40,13 @@ async function getTelegramSettings() {
// Создание и настройка бота
async function getBot() {
console.log('[TelegramBot] getBot() called');
// console.log('[TelegramBot] getBot() called');
if (!botInstance) {
console.log('[TelegramBot] Creating new bot instance...');
// console.log('[TelegramBot] Creating new bot instance...');
const settings = await getTelegramSettings();
console.log('[TelegramBot] Got settings, creating Telegraf instance...');
// console.log('[TelegramBot] Got settings, creating Telegraf instance...');
botInstance = new Telegraf(settings.bot_token);
console.log('[TelegramBot] Telegraf instance created');
// console.log('[TelegramBot] Telegraf instance created');
// Обработка команды /start
botInstance.command('start', (ctx) => {
@@ -489,7 +489,7 @@ async function getBot() {
});
// Запуск бота с таймаутом
console.log('[TelegramBot] Before botInstance.launch()');
// console.log('[TelegramBot] Before botInstance.launch()');
try {
// Запускаем бота с таймаутом
const launchPromise = botInstance.launch();
@@ -498,12 +498,12 @@ async function getBot() {
});
await Promise.race([launchPromise, timeoutPromise]);
console.log('[TelegramBot] After botInstance.launch()');
// console.log('[TelegramBot] After botInstance.launch()');
logger.info('[TelegramBot] Бот запущен');
} catch (error) {
console.error('[TelegramBot] Error launching bot:', error);
// console.error('[TelegramBot] Error launching bot:', error);
// Не выбрасываем ошибку, чтобы не блокировать запуск сервера
console.log('[TelegramBot] Bot launch failed, but continuing...');
// console.log('[TelegramBot] Bot launch failed, but continuing...');
}
}

View File

@@ -13,23 +13,23 @@
const encryptedDb = require('./encryptedDatabaseService');
async function deleteUserById(userId) {
console.log('[DELETE] Вызван deleteUserById для userId:', userId);
// console.log('[DELETE] Вызван deleteUserById для userId:', userId);
try {
console.log('[DELETE] Начинаем удаление user_identities для userId:', userId);
// console.log('[DELETE] Начинаем удаление user_identities для userId:', userId);
const resIdentities = await encryptedDb.deleteData('user_identities', { user_id: userId });
console.log('[DELETE] Удалено user_identities:', resIdentities.length);
// console.log('[DELETE] Удалено user_identities:', resIdentities.length);
console.log('[DELETE] Начинаем удаление messages для userId:', userId);
// console.log('[DELETE] Начинаем удаление messages для userId:', userId);
const resMessages = await encryptedDb.deleteData('messages', { user_id: userId });
console.log('[DELETE] Удалено messages:', resMessages.length);
// console.log('[DELETE] Удалено messages:', resMessages.length);
console.log('[DELETE] Начинаем удаление пользователя из users:', userId);
// console.log('[DELETE] Начинаем удаление пользователя из users:', userId);
const result = await encryptedDb.deleteData('users', { id: userId });
console.log('[DELETE] Результат удаления пользователя:', result.length, result);
// console.log('[DELETE] Результат удаления пользователя:', result.length, result);
return result.length;
} catch (e) {
console.error('[DELETE] Ошибка при удалении пользователя:', e);
// console.error('[DELETE] Ошибка при удалении пользователя:', e);
throw e;
}
}

View File

@@ -28,10 +28,10 @@ function initWSS(server) {
wss = new WebSocket.Server({ server, path: '/ws' });
wss.on('connection', (ws, req) => {
console.log('🔌 [WebSocket] Новое подключение');
console.log('🔌 [WebSocket] IP клиента:', req.socket.remoteAddress);
console.log('🔌 [WebSocket] User-Agent:', req.headers['user-agent']);
console.log('🔌 [WebSocket] Origin:', req.headers.origin);
// console.log('🔌 [WebSocket] Новое подключение');
// console.log('🔌 [WebSocket] IP клиента:', req.socket.remoteAddress);
// console.log('🔌 [WebSocket] User-Agent:', req.headers['user-agent']);
// console.log('🔌 [WebSocket] Origin:', req.headers.origin);
// Добавляем клиента в общий список
if (!wsClients.has('anonymous')) {
@@ -43,7 +43,7 @@ function initWSS(server) {
ws.on('message', (message) => {
try {
const data = JSON.parse(message);
console.log('📨 [WebSocket] Получено сообщение:', data);
// console.log('📨 [WebSocket] Получено сообщение:', data);
if (data.type === 'auth' && data.userId) {
// Аутентификация пользователя
@@ -58,12 +58,12 @@ function initWSS(server) {
}));
}
} catch (error) {
console.error('❌ [WebSocket] Ошибка парсинга сообщения:', error);
// console.error('❌ [WebSocket] Ошибка парсинга сообщения:', error);
}
});
ws.on('close', (code, reason) => {
console.log('🔌 [WebSocket] Соединение закрыто', { code, reason: reason.toString() });
// console.log('🔌 [WebSocket] Соединение закрыто', { code, reason: reason.toString() });
// Удаляем клиента из всех списков
for (const [userId, clients] of wsClients.entries()) {
clients.delete(ws);
@@ -74,15 +74,15 @@ function initWSS(server) {
});
ws.on('error', (error) => {
console.error('❌ [WebSocket] Ошибка соединения:', error.message);
// console.error('❌ [WebSocket] Ошибка соединения:', error.message);
});
});
console.log('🚀 [WebSocket] Сервер запущен на /ws');
// console.log('🚀 [WebSocket] Сервер запущен на /ws');
}
function authenticateUser(ws, userId) {
console.log(`🔐 [WebSocket] Аутентификация пользователя ${userId}`);
// console.log(`🔐 [WebSocket] Аутентификация пользователя ${userId}`);
// Удаляем из анонимных
if (wsClients.has('anonymous')) {
@@ -103,7 +103,7 @@ function authenticateUser(ws, userId) {
}
function broadcastContactsUpdate() {
console.log('📢 [WebSocket] Отправка обновления контактов всем клиентам');
// console.log('📢 [WebSocket] Отправка обновления контактов всем клиентам');
for (const [userId, clients] of wsClients.entries()) {
for (const ws of clients) {
if (ws.readyState === WebSocket.OPEN) {
@@ -114,7 +114,7 @@ function broadcastContactsUpdate() {
}
function broadcastMessagesUpdate() {
console.log('📢 [WebSocket] Отправка обновления сообщений всем клиентам');
// console.log('📢 [WebSocket] Отправка обновления сообщений всем клиентам');
for (const [userId, clients] of wsClients.entries()) {
for (const ws of clients) {
if (ws.readyState === WebSocket.OPEN) {
@@ -125,10 +125,10 @@ function broadcastMessagesUpdate() {
}
function broadcastChatMessage(message, targetUserId = null) {
console.log(`📢 [WebSocket] Отправка сообщения чата`, {
messageId: message.id,
targetUserId
});
// console.log(`📢 [WebSocket] Отправка сообщения чата`, {
// messageId: message.id,
// targetUserId
// });
if (targetUserId) {
// Отправляем конкретному пользователю
@@ -159,10 +159,10 @@ function broadcastChatMessage(message, targetUserId = null) {
}
function broadcastConversationUpdate(conversationId, targetUserId = null) {
console.log(`📢 [WebSocket] Отправка обновления диалога`, {
conversationId,
targetUserId
});
// console.log(`📢 [WebSocket] Отправка обновления диалога`, {
// conversationId,
// targetUserId
// });
const payload = {
type: 'conversation-updated',
@@ -192,7 +192,7 @@ function broadcastConversationUpdate(conversationId, targetUserId = null) {
}
function broadcastTableUpdate(tableId) {
console.log('📢 [WebSocket] Отправка обновления таблицы', tableId);
// console.log('📢 [WebSocket] Отправка обновления таблицы', tableId);
const payload = { type: 'table-updated', tableId };
for (const [userId, clients] of wsClients.entries()) {
for (const ws of clients) {
@@ -204,11 +204,11 @@ function broadcastTableUpdate(tableId) {
}
function broadcastTableRelationsUpdate(tableId, rowId, targetUserId = null) {
console.log(`📢 [WebSocket] Отправка обновления связей таблицы`, {
tableId,
rowId,
targetUserId
});
// console.log(`📢 [WebSocket] Отправка обновления связей таблицы`, {
// tableId,
// rowId,
// targetUserId
// });
const payload = {
type: 'table-relations-updated',
@@ -246,7 +246,7 @@ function broadcastTagsUpdate(targetUserId = null, rowId = null) {
// Устанавливаем новый таймаут
tagsUpdateTimeout = setTimeout(() => {
console.log('🔔 [WebSocket] Отправляем уведомление об обновлении тегов', rowId ? `для строки ${rowId}` : '');
// console.log('🔔 [WebSocket] Отправляем уведомление об обновлении тегов', rowId ? `для строки ${rowId}` : '');
const message = JSON.stringify({
type: 'tags-updated',
timestamp: Date.now(),
@@ -262,7 +262,7 @@ function broadcastTagsUpdate(targetUserId = null, rowId = null) {
}
});
console.log(`🔔 [WebSocket] Отправлено tags-updated ${sentCount} клиентам`);
// console.log(`🔔 [WebSocket] Отправлено tags-updated ${sentCount} клиентам`);
}, TAGS_UPDATE_DEBOUNCE);
}
@@ -300,7 +300,7 @@ function getStats() {
// Функция для отправки уведомлений о статусе AI
function broadcastAIStatus(status) {
console.log('📢 [WebSocket] Отправка статуса AI всем клиентам');
// console.log('📢 [WebSocket] Отправка статуса AI всем клиентам');
for (const [userId, clients] of wsClients.entries()) {
for (const ws of clients) {
if (ws.readyState === WebSocket.OPEN) {

View File

@@ -74,14 +74,14 @@
isLoadingTokens.value = true;
try {
const walletAddress = getIdentityValue('wallet');
console.log('[App] Обновление балансов для адреса:', walletAddress);
// console.log('[App] Обновление балансов для адреса:', walletAddress);
const balances = await fetchTokenBalances(walletAddress);
console.log('[App] Полученные балансы:', balances);
// console.log('[App] Полученные балансы:', balances);
tokenBalances.value = balances || {};
} catch (error) {
console.error('[App] Ошибка при получении балансов:', error);
// console.error('[App] Ошибка при получении балансов:', error);
tokenBalances.value = {};
} finally {
isLoadingTokens.value = false;
@@ -96,11 +96,11 @@
const oldWalletId = oldWalletIdentity ? oldWalletIdentity.provider_id : null;
if (newWalletId !== oldWalletId) {
console.log('[App] Обнаружено изменение идентификатора кошелька, обновляем балансы');
// console.log('[App] Обнаружено изменение идентификатора кошелька, обновляем балансы');
refreshTokenBalances();
} else if (hasIdentityType('wallet') && Object.keys(tokenBalances.value).length === 0 && !isLoadingTokens.value) {
// Если кошелек есть, но баланс пустой и не грузится - пробуем загрузить
console.log('[App] Кошелек есть, но баланс пуст, пытаемся загрузить.');
// console.log('[App] Кошелек есть, но баланс пуст, пытаемся загрузить.');
refreshTokenBalances();
}
}
@@ -108,7 +108,7 @@
// Мониторинг изменений состояния аутентификации
watch(auth.isAuthenticated, (isAuth) => {
console.log('[App] Состояние аутентификации изменилось:', isAuth);
// console.log('[App] Состояние аутентификации изменилось:', isAuth);
if (isAuth) {
// Убираем задержку, полагаемся на watch(identities) или прямо вызываем
// setTimeout(refreshTokenBalances, 500);
@@ -121,16 +121,16 @@
// --- Возвращаем и улучшаем функцию-обработчик ---
const handleAuthActionCompleted = async () => {
console.log('[App] Auth action completed, triggering updates...');
// console.log('[App] Auth action completed, triggering updates...');
isLoading.value = true; // Показываем индикатор загрузки
try {
// 1. Проверяем аутентификацию (обновит identities и isAuthenticated)
await auth.checkAuth();
console.log('[App] auth.checkAuth() completed. isAuthenticated:', auth.isAuthenticated.value);
// console.log('[App] auth.checkAuth() completed. isAuthenticated:', auth.isAuthenticated.value);
// 2. Обновляем баланс (использует обновленные identities)
await refreshTokenBalances();
console.log('[App] refreshTokenBalances() completed.');
// console.log('[App] refreshTokenBalances() completed.');
// 3. Явно оповещаем компоненты об изменении состояния авторизации
// Передаем актуальное состояние из useAuth
@@ -140,10 +140,10 @@
userId: auth.userId.value, // Предполагаем, что userId есть в useAuth
fromApp: true // Флаг, что событие от App.vue
});
console.log('[App] auth-state-changed event emitted.');
// console.log('[App] auth-state-changed event emitted.');
} catch (error) {
console.error("[App] Error during auth action handling:", error);
// console.error("[App] Error during auth action handling:", error);
} finally {
isLoading.value = false; // Скрываем индикатор загрузки
}
@@ -157,7 +157,7 @@
// Подписываемся на событие изменения настроек аутентификации
const unsubscribe = eventBus.on('auth-settings-saved', () => {
console.log('[App] Получено событие сохранения настроек аутентификации, обновляем балансы');
// console.log('[App] Получено событие сохранения настроек аутентификации, обновляем балансы');
if (auth.isAuthenticated.value) {
refreshTokenBalances();
}

View File

@@ -37,7 +37,7 @@ api.interceptors.response.use(
// Проверяем, что ответ действительно JSON
if (response.headers['content-type'] &&
!response.headers['content-type'].includes('application/json')) {
console.warn('Server returned non-JSON response:', response.headers['content-type']);
// console.warn('Server returned non-JSON response:', response.headers['content-type']);
// Если это HTML, значит, запрос ушёл не туда
if (response.headers['content-type'].includes('text/html')) {
throw new Error('Server returned HTML instead of JSON. Check API endpoint.');
@@ -50,7 +50,7 @@ api.interceptors.response.use(
if (error.response && error.response.data &&
typeof error.response.data === 'string' &&
error.response.data.includes('<!DOCTYPE')) {
console.error('API Error: Server returned HTML instead of JSON');
// console.error('API Error: Server returned HTML instead of JSON');
error.message = 'Ошибка: сервер вернул HTML вместо JSON. Проверьте подключение к API.';
}
return Promise.reject(error);
@@ -65,7 +65,7 @@ const sendGuestMessageToServer = async (messageText) => {
// language: userLanguage.value, // TODO: Реализовать получение языка пользователя
}, { withCredentials: true });
} catch (error) {
console.error('Ошибка при отправке гостевого сообщения на сервер:', error);
// console.error('Ошибка при отправке гостевого сообщения на сервер:', error);
}
};

View File

@@ -193,7 +193,7 @@ export default {
stats.value = response.data.data
}
} catch (error) {
console.error('Error fetching queue stats:', error)
// console.error('Error fetching queue stats:', error)
} finally {
loading.value = false
}
@@ -210,7 +210,7 @@ export default {
await fetchStats()
}
} catch (error) {
console.error(`Error controlling queue (${action}):`, error)
// console.error(`Error controlling queue (${action}):`, error)
}
}

View File

@@ -81,7 +81,7 @@ const emit = defineEmits(['auth-action-completed']);
// Callback после успешной аутентификации/привязки через Email/Telegram
const handleAuthFlowSuccess = (authType) => {
console.log(`[BaseLayout] Auth flow success: ${authType}`);
// console.log(`[BaseLayout] Auth flow success: ${authType}`);
// Отправляем событие для обновления данных на страницах
eventBus.emit('auth-success', { authType });
};
@@ -116,7 +116,7 @@ const handleWalletAuth = async () => {
isConnectingWallet.value = true;
try {
const result = await connectWithWallet();
console.log('[BaseLayout] Результат подключения кошелька:', result);
// console.log('[BaseLayout] Результат подключения кошелька:', result);
if (result.success) {
if (auth.isAuthenticated.value) {
@@ -132,7 +132,7 @@ const handleWalletAuth = async () => {
// Новая аутентификация через кошелек
const authResponse = await auth.checkAuth();
if (authResponse.authenticated && authResponse.authType === 'wallet') {
console.log('[BaseLayout] Кошелёк успешно подключен и аутентифицирован');
// console.log('[BaseLayout] Кошелёк успешно подключен и аутентифицирован');
showSuccessMessage('Кошелёк успешно подключен!');
emit('auth-action-completed');
} else {
@@ -140,11 +140,11 @@ const handleWalletAuth = async () => {
}
}
} else {
console.error('[BaseLayout] Не удалось подключить кошелёк:', result.error);
// console.error('[BaseLayout] Не удалось подключить кошелёк:', result.error);
showErrorMessage(result.error || 'Не удалось подключить кошелёк');
}
} catch (error) {
console.error('[BaseLayout] Ошибка при подключении кошелька:', error);
// console.error('[BaseLayout] Ошибка при подключении кошелька:', error);
showErrorMessage('Произошла ошибка при подключении кошелька');
} finally {
isConnectingWallet.value = false;
@@ -155,7 +155,7 @@ const handleWalletAuth = async () => {
* Выполняет выход из аккаунта
*/
const disconnectWallet = async () => {
console.log('[BaseLayout] Выполняется выход из системы...');
// console.log('[BaseLayout] Выполняется выход из системы...');
try {
await api.post('/auth/logout');
showSuccessMessage('Вы успешно вышли из системы');
@@ -163,7 +163,7 @@ const disconnectWallet = async () => {
removeFromStorage('hasUserSentMessage');
emit('auth-action-completed');
} catch (error) {
console.error('[BaseLayout] Ошибка при выходе из системы:', error);
// console.error('[BaseLayout] Ошибка при выходе из системы:', error);
showErrorMessage('Произошла ошибка при выходе из системы');
}
};
@@ -181,7 +181,7 @@ const toggleWalletSidebar = () => {
// =====================================================================
onMounted(() => {
console.log('[BaseLayout] Компонент загружен');
// console.log('[BaseLayout] Компонент загружен');
// Загружаем сохраненное состояние боковой панели
const savedSidebarState = getFromStorage('showWalletSidebar');

View File

@@ -166,26 +166,26 @@ const videoStream = ref(null);
const recordedAudioChunks = ref([]);
const recordedVideoChunks = ref([]);
const startAudioRecording = async () => {
console.log('[ChatInterface] startAudioRecording called');
const startAudioRecording = async () => {
// console.log('[ChatInterface] startAudioRecording called');
try {
if (isAudioRecording.value) return;
audioStream.value = await navigator.mediaDevices.getUserMedia({ audio: true });
console.log('[ChatInterface] Got audio stream:', audioStream.value);
// console.log('[ChatInterface] Got audio stream:', audioStream.value);
recordedAudioChunks.value = [];
audioRecorder.value = new MediaRecorder(audioStream.value);
audioRecorder.value.ondataavailable = (event) => {
console.log('[ChatInterface] audioRecorder.ondataavailable fired');
// console.log('[ChatInterface] audioRecorder.ondataavailable fired');
if (event.data.size > 0) recordedAudioChunks.value.push(event.data);
};
audioRecorder.value.onstop = () => {
console.log('[ChatInterface] audioRecorder.onstop fired');
// console.log('[ChatInterface] audioRecorder.onstop fired');
setTimeout(() => {
if (recordedAudioChunks.value.length === 0) {
console.warn('[ChatInterface] No audio chunks recorded.');
// console.warn('[ChatInterface] No audio chunks recorded.');
return;
}
console.log(`[ChatInterface] Creating audio Blob from ${recordedAudioChunks.value.length} chunks.`);
// console.log(`[ChatInterface] Creating audio Blob from ${recordedAudioChunks.value.length} chunks.`);
const audioBlob = new Blob(recordedAudioChunks.value, { type: 'audio/webm' });
const audioFile = new File([audioBlob], `audio-${Date.now()}.webm`, { type: 'audio/webm' });
addAttachment(audioFile);
@@ -194,64 +194,64 @@ const startAudioRecording = async () => {
};
audioRecorder.value.start();
isAudioRecording.value = true;
console.log('[ChatInterface] Audio recording started, recorder state:', audioRecorder.value.state);
// console.log('[ChatInterface] Audio recording started, recorder state:', audioRecorder.value.state);
} catch (error) {
console.error('[ChatInterface] Error starting audio recording:', error);
// console.error('[ChatInterface] Error starting audio recording:', error);
}
};
const stopAudioRecording = async () => {
console.log('[ChatInterface] stopAudioRecording called');
// console.log('[ChatInterface] stopAudioRecording called');
if (!isAudioRecording.value || !audioRecorder.value || audioRecorder.value.state === 'inactive') {
console.log('[ChatInterface] stopAudioRecording: Not recording or recorder inactive, state:', audioRecorder.value?.state);
// console.log('[ChatInterface] stopAudioRecording: Not recording or recorder inactive, state:', audioRecorder.value?.state);
return;
}
try {
audioRecorder.value.stop();
console.log('[ChatInterface] audioRecorder.stop() called');
// console.log('[ChatInterface] audioRecorder.stop() called');
isAudioRecording.value = false;
if (audioStream.value) {
audioStream.value.getTracks().forEach(track => track.stop());
console.log('[ChatInterface] Audio stream tracks stopped.');
// console.log('[ChatInterface] Audio stream tracks stopped.');
}
} catch (error) {
console.error('[ChatInterface] Error stopping audio recording:', error);
// console.error('[ChatInterface] Error stopping audio recording:', error);
isAudioRecording.value = false;
if (audioStream.value) audioStream.value.getTracks().forEach(track => track.stop());
}
};
const startVideoRecording = async () => {
console.log('[ChatInterface] startVideoRecording called');
// console.log('[ChatInterface] startVideoRecording called');
try {
if (isVideoRecording.value) return;
videoStream.value = await navigator.mediaDevices.getUserMedia({ video: true, audio: true });
console.log('[ChatInterface] Got video stream:', videoStream.value);
// console.log('[ChatInterface] Got video stream:', videoStream.value);
recordedVideoChunks.value = [];
let options = { mimeType: 'video/webm;codecs=vp9,opus' };
if (!MediaRecorder.isTypeSupported(options.mimeType)) {
console.warn(`MIME type ${options.mimeType} not supported, trying video/webm...`);
// console.warn(`MIME type ${options.mimeType} not supported, trying video/webm...`);
options = { mimeType: 'video/webm' };
if (!MediaRecorder.isTypeSupported(options.mimeType)) {
console.warn(`MIME type ${options.mimeType} not supported, using default.`);
// console.warn(`MIME type ${options.mimeType} not supported, using default.`);
options = {};
}
}
console.log('[ChatInterface] Using MediaRecorder options:', options);
// console.log('[ChatInterface] Using MediaRecorder options:', options);
videoRecorder.value = new MediaRecorder(videoStream.value, options);
videoRecorder.value.ondataavailable = (event) => {
console.log('[ChatInterface] videoRecorder.ondataavailable fired');
// console.log('[ChatInterface] videoRecorder.ondataavailable fired');
if (event.data.size > 0) recordedVideoChunks.value.push(event.data);
};
videoRecorder.value.onstop = () => {
console.log('[ChatInterface] videoRecorder.onstop fired');
// console.log('[ChatInterface] videoRecorder.onstop fired');
setTimeout(() => {
if (recordedVideoChunks.value.length === 0) {
console.warn('[ChatInterface] No video chunks recorded.');
// console.warn('[ChatInterface] No video chunks recorded.');
return;
}
console.log(`[ChatInterface] Creating video Blob from ${recordedVideoChunks.value.length} chunks.`);
// console.log(`[ChatInterface] Creating video Blob from ${recordedVideoChunks.value.length} chunks.`);
const videoBlob = new Blob(recordedVideoChunks.value, { type: videoRecorder.value.mimeType || 'video/webm' });
const videoFile = new File([videoBlob], `video-${Date.now()}.webm`, { type: videoRecorder.value.mimeType || 'video/webm' });
addAttachment(videoFile);
@@ -260,28 +260,28 @@ const startVideoRecording = async () => {
};
videoRecorder.value.start();
isVideoRecording.value = true;
console.log('[ChatInterface] Video recording started, recorder state:', videoRecorder.value.state);
// console.log('[ChatInterface] Video recording started, recorder state:', videoRecorder.value.state);
} catch (error) {
console.error('[ChatInterface] Error starting video recording:', error);
// console.error('[ChatInterface] Error starting video recording:', error);
}
};
const stopVideoRecording = async () => {
console.log('[ChatInterface] stopVideoRecording called');
// console.log('[ChatInterface] stopVideoRecording called');
if (!isVideoRecording.value || !videoRecorder.value || videoRecorder.value.state === 'inactive') {
console.log('[ChatInterface] stopVideoRecording: Not recording or recorder inactive, state:', videoRecorder.value?.state);
// console.log('[ChatInterface] stopVideoRecording: Not recording or recorder inactive, state:', videoRecorder.value?.state);
return;
}
try {
videoRecorder.value.stop();
console.log('[ChatInterface] videoRecorder.stop() called');
// console.log('[ChatInterface] videoRecorder.stop() called');
isVideoRecording.value = false;
if (videoStream.value) {
videoStream.value.getTracks().forEach(track => track.stop());
console.log('[ChatInterface] Video stream tracks stopped.');
// console.log('[ChatInterface] Video stream tracks stopped.');
}
} catch (error) {
console.error('[ChatInterface] Error stopping video recording:', error);
// console.error('[ChatInterface] Error stopping video recording:', error);
isVideoRecording.value = false;
if (videoStream.value) videoStream.value.getTracks().forEach(track => track.stop());
}

View File

@@ -336,7 +336,7 @@ async function deleteMessagesSelected() {
deletedConversations += result.deletedConversations || 0;
}
} catch (error) {
console.error(`Ошибка при удалении сообщений для контакта ${id}:`, error);
// console.error(`Ошибка при удалении сообщений для контакта ${id}:`, error);
}
}

View File

@@ -242,7 +242,7 @@ const connectToDLE = async () => {
connectionStatus.value = 'connecting';
// Здесь будет подключение к DLE через Web3
console.log('Подключение к DLE:', props.dleAddress);
// console.log('Подключение к DLE:', props.dleAddress);
// Имитация подключения
await new Promise(resolve => setTimeout(resolve, 1000));
@@ -252,7 +252,7 @@ const connectToDLE = async () => {
connectionStatus.value = 'connected';
} catch (error) {
console.error('Ошибка подключения к DLE:', error);
// console.error('Ошибка подключения к DLE:', error);
connectionStatus.value = 'error';
}
};
@@ -312,7 +312,7 @@ const loadDLEData = async () => {
];
} catch (error) {
console.error('Ошибка загрузки данных DLE:', error);
// console.error('Ошибка загрузки данных DLE:', error);
}
};
@@ -351,7 +351,7 @@ const signProposal = async (proposalId) => {
isSigning.value = true;
// Здесь будет подписание предложения
console.log('Подписание предложения:', proposalId);
// console.log('Подписание предложения:', proposalId);
const proposal = proposals.value.find(p => p.id === proposalId);
if (proposal) {
@@ -362,7 +362,7 @@ const signProposal = async (proposalId) => {
emit('proposal-signed', { proposalId, dleAddress: props.dleAddress });
} catch (error) {
console.error('Ошибка подписания предложения:', error);
// console.error('Ошибка подписания предложения:', error);
} finally {
isSigning.value = false;
}
@@ -375,7 +375,7 @@ const executeProposal = async (proposalId) => {
isExecuting.value = true;
// Здесь будет выполнение предложения
console.log('Выполнение предложения:', proposalId);
// console.log('Выполнение предложения:', proposalId);
const proposal = proposals.value.find(p => p.id === proposalId);
if (proposal) {
@@ -385,7 +385,7 @@ const executeProposal = async (proposalId) => {
emit('proposal-executed', { proposalId, dleAddress: props.dleAddress });
} catch (error) {
console.error('Ошибка выполнения предложения:', error);
// console.error('Ошибка выполнения предложения:', error);
} finally {
isExecuting.value = false;
}

View File

@@ -56,7 +56,7 @@ onMounted(() => {
// Следим за изменениями авторизации и сообщаем о них через eventBus
unwatch = watch(isAuthenticated, (newValue, oldValue) => {
if (newValue !== oldValue) {
console.log('[Header] Состояние аутентификации изменилось:', newValue);
// console.log('[Header] Состояние аутентификации изменилось:', newValue);
// Оповещаем остальные компоненты через шину событий
eventBus.emit('auth-state-changed', {
isAuthenticated: newValue,

View File

@@ -106,7 +106,7 @@ const base64ToBlob = (base64, mimetype) => {
const byteArray = new Uint8Array(byteNumbers);
return new Blob([byteArray], { type: mimetype });
} catch (e) {
console.error("Error decoding base64 string:", e);
// console.error("Error decoding base64 string:", e);
return null;
}
};
@@ -161,7 +161,7 @@ const formattedTime = computed(() => {
try {
const date = new Date(timestamp);
if (isNaN(date.getTime())) {
console.warn('Invalid timestamp in Message.vue:', timestamp);
// console.warn('Invalid timestamp in Message.vue:', timestamp);
return '';
}
return date.toLocaleString([], {
@@ -172,7 +172,7 @@ const formattedTime = computed(() => {
minute: '2-digit',
});
} catch (error) {
console.error('Error formatting time in Message.vue:', error, timestamp);
// console.error('Error formatting time in Message.vue:', error, timestamp);
return '';
}
});

View File

@@ -135,7 +135,7 @@ async function checkConnection() {
await loadInstalledModels();
}
} catch (error) {
console.error('Ошибка проверки подключения:', error);
// console.error('Ошибка проверки подключения:', error);
isConnected.value = false;
} finally {
checking.value = false;
@@ -148,7 +148,7 @@ async function loadInstalledModels() {
const response = await axios.get('/ollama/models');
installedModels.value = response.data.models || [];
} catch (error) {
console.error('Ошибка загрузки моделей:', error);
// console.error('Ошибка загрузки моделей:', error);
}
}
@@ -162,7 +162,7 @@ async function searchModels() {
// Пока просто устанавливаем модель напрямую
await installModel(searchQuery.value.trim());
} catch (error) {
console.error('Ошибка поиска моделей:', error);
// console.error('Ошибка поиска моделей:', error);
} finally {
searching.value = false;
}
@@ -176,7 +176,7 @@ async function installModel(modelName) {
await loadInstalledModels();
searchQuery.value = '';
} catch (error) {
console.error('Ошибка установки модели:', error);
// console.error('Ошибка установки модели:', error);
} finally {
installing.value = '';
}
@@ -189,7 +189,7 @@ async function removeModel(modelName) {
await axios.delete(`/ollama/models/${encodeURIComponent(modelName)}`);
await loadInstalledModels();
} catch (error) {
console.error('Ошибка удаления модели:', error);
// console.error('Ошибка удаления модели:', error);
} finally {
removing.value = '';
}

View File

@@ -197,7 +197,7 @@ const closeSidebar = () => {
// Обработка события изменения авторизации
const handleAuthEvent = (event) => {
console.log('[Sidebar] Получено событие изменения авторизации:', event);
// console.log('[Sidebar] Получено событие изменения авторизации:', event);
// Здесь можно обновить данные, если нужно дополнительное обновление
};
@@ -239,11 +239,11 @@ const handleDeleteIdentity = async (provider, providerId) => {
// Добавляем watch для отслеживания props
watch(() => props.tokenBalances, (newVal, oldVal) => {
console.log('[Sidebar] tokenBalances prop changed:', JSON.stringify(newVal));
// console.log('[Sidebar] tokenBalances prop changed:', JSON.stringify(newVal));
}, { deep: true });
watch(() => props.isLoadingTokens, (newVal, oldVal) => {
console.log(`[Sidebar] isLoadingTokens prop changed: ${newVal}`);
// console.log(`[Sidebar] isLoadingTokens prop changed: ${newVal}`);
});
</script>

View File

@@ -66,7 +66,7 @@
error.value = result.error || 'Не удалось подключить кошелек';
}
} catch (err) {
console.error('Error connecting wallet:', err);
// console.error('Error connecting wallet:', err);
error.value = err.message || 'Произошла ошибка при подключении кошелька';
} finally {
isLoading.value = false;

View File

@@ -180,7 +180,7 @@ watch(editing, (val) => {
// Добавляем watch для отслеживания изменений в мультисвязях с дебаунсингом
let debounceTimer = null;
watch(editMultiRelationValues, (newValues, oldValues) => {
console.log('[editMultiRelationValues] changed from:', oldValues, 'to:', newValues);
// console.log('[editMultiRelationValues] changed from:', oldValues, 'to:', newValues);
// Очищаем предыдущий таймер
if (debounceTimer) {
@@ -204,7 +204,7 @@ let unsubscribeFromWebSocket = null;
// Функция для очистки кэша
function clearCache() {
cacheService.clearAll();
console.log('[TableCell] Кэш очищен');
// console.log('[TableCell] Кэш очищен');
}
// WebSocket для тегов
@@ -223,7 +223,7 @@ let isMultiRelationValuesLoaded = false;
onMounted(async () => {
const startTime = Date.now();
console.log(`[TableCell] 🚀 Начало монтирования ячейки row:${props.rowId} col:${props.column.id} в ${startTime}`);
// console.log(`[TableCell] 🚀 Начало монтирования ячейки row:${props.rowId} col:${props.column.id} в ${startTime}`);
if (props.column.type === 'multiselect') {
multiOptions.value = (props.column.options && props.column.options.options) || [];
@@ -250,14 +250,14 @@ onMounted(async () => {
} else if (props.column.type === 'multiselect-relation') {
// Загружаем опции только один раз
if (!isInitialized) {
console.log(`[TableCell] 📥 Загружаем опции для row:${props.rowId} col:${props.column.id}`);
// console.log(`[TableCell] 📥 Загружаем опции для row:${props.rowId} col:${props.column.id}`);
await loadMultiRelationOptions();
isInitialized = true;
}
// Загружаем relations только один раз для каждой комбинации rowId + columnId
if (!isMultiRelationValuesLoaded) {
console.log(`[TableCell] 📥 Загружаем relations для row:${props.rowId} col:${props.column.id}`);
// console.log(`[TableCell] 📥 Загружаем relations для row:${props.rowId} col:${props.column.id}`);
await loadMultiRelationValues();
isMultiRelationValuesLoaded = true;
}
@@ -265,7 +265,7 @@ onMounted(async () => {
// Подписываемся на обновления таблицы
if (props.column.type === 'multiselect-relation') {
unsubscribeFromWebSocket = subscribeToTableRelationsUpdates(props.column.table_id, async () => {
console.log('[TableCell] Получено обновление таблицы, перезагружаем relations');
// console.log('[TableCell] Получено обновление таблицы, перезагружаем relations');
// Сбрасываем флаг загрузки
isMultiRelationValuesLoaded = false;
// Очищаем кэш relations для текущей строки
@@ -277,7 +277,7 @@ onMounted(async () => {
// Подписываемся на обновления тегов, если это связанная таблица тегов
if (props.column.options && props.column.options.relatedTableId) {
unsubscribeFromTags = onTagsUpdate(async () => {
console.log('[TableCell] Получено обновление тегов, перезагружаем опции');
// console.log('[TableCell] Получено обновление тегов, перезагружаем опции');
// Сбрасываем флаги загрузки
isInitialized = false;
isMultiRelationValuesLoaded = false;
@@ -300,7 +300,7 @@ onMounted(async () => {
localValue.value = cell ? cell.value : '';
}
const endTime = Date.now();
console.log(`[TableCell] ✅ Завершено монтирование ячейки row:${props.rowId} col:${props.column.id} за ${endTime - startTime}ms`);
// console.log(`[TableCell] ✅ Завершено монтирование ячейки row:${props.rowId} col:${props.column.id} за ${endTime - startTime}ms`);
});
onUnmounted(() => {
@@ -487,7 +487,7 @@ async function loadLookupValues() {
async function loadMultiRelationOptions() {
// Проверяем, не загружены ли уже опции
if (multiRelationOptions.value.length > 0) {
console.log('[loadMultiRelationOptions] Опции уже загружены, пропускаем');
// console.log('[loadMultiRelationOptions] Опции уже загружены, пропускаем');
return;
}
@@ -499,10 +499,10 @@ async function loadMultiRelationOptions() {
let tableData;
if (cachedTableData) {
console.log(`[loadMultiRelationOptions] ✅ Используем предварительно загруженные данные таблицы ${rel.relatedTableId}`);
// console.log(`[loadMultiRelationOptions] ✅ Используем предварительно загруженные данные таблицы ${rel.relatedTableId}`);
tableData = cachedTableData;
} else {
console.log(`[loadMultiRelationOptions] ⚠️ Данные таблицы ${rel.relatedTableId} не найдены в кэше, загружаем заново`);
// console.log(`[loadMultiRelationOptions] ⚠️ Данные таблицы ${rel.relatedTableId} не найдены в кэше, загружаем заново`);
const response = await fetch(`/api/tables/${rel.relatedTableId}`);
tableData = await response.json();
// Сохраняем в кэш
@@ -517,9 +517,9 @@ async function loadMultiRelationOptions() {
opts.push({ id: row.id, display: cell ? cell.value : `ID ${row.id}` });
}
multiRelationOptions.value = opts;
console.log(`[loadMultiRelationOptions] Загружено ${opts.length} опций для таблицы ${rel.relatedTableId}`);
// console.log(`[loadMultiRelationOptions] Загружено ${opts.length} опций для таблицы ${rel.relatedTableId}`);
} catch (e) {
console.error('[loadMultiRelationOptions] Error:', e);
// console.error('[loadMultiRelationOptions] Error:', e);
}
}
}
@@ -531,7 +531,7 @@ const LOAD_DEBOUNCE_DELAY = 50; // 50ms (уменьшено для ускоре
async function loadMultiRelationValues() {
// Проверяем, не загружены ли уже данные
if (isMultiRelationValuesLoaded) {
console.log('[loadMultiRelationValues] Данные уже загружены, пропускаем');
// console.log('[loadMultiRelationValues] Данные уже загружены, пропускаем');
return;
}
@@ -543,7 +543,7 @@ async function loadMultiRelationValues() {
// Устанавливаем новый таймер
loadMultiRelationValuesTimer = setTimeout(async () => {
// Получаем связи для текущей строки
console.log('[loadMultiRelationValues] called for row:', props.rowId, 'column:', props.column.id);
// console.log('[loadMultiRelationValues] called for row:', props.rowId, 'column:', props.column.id);
try {
const rel = props.column.options || {};
@@ -554,10 +554,10 @@ async function loadMultiRelationValues() {
const cachedRelations = cacheService.getRelationsData(props.rowId, props.column.id);
if (cachedRelations) {
console.log('[loadMultiRelationValues] ✅ Используем предварительно загруженные relations для строки', props.rowId);
// console.log('[loadMultiRelationValues] ✅ Используем предварительно загруженные relations для строки', props.rowId);
relations = cachedRelations;
} else {
console.log('[loadMultiRelationValues] ⚠️ Relations не найдены в кэше, загружаем заново для строки', props.rowId);
// console.log('[loadMultiRelationValues] ⚠️ Relations не найдены в кэше, загружаем заново для строки', props.rowId);
// Выполняем запросы параллельно
const [relationsRes, tableRes] = await Promise.all([
fetch(`/api/tables/${props.column.table_id}/row/${props.rowId}/relations`),
@@ -573,13 +573,13 @@ async function loadMultiRelationValues() {
cacheService.setRelationsData(props.rowId, props.column.id, relations);
}
console.log('[loadMultiRelationValues] API response status: 200 relations:', relations);
// console.log('[loadMultiRelationValues] API response status: 200 relations:', relations);
// Приводим все id к строке для корректного сравнения
const relatedRowIds = relations
.filter(r => String(r.column_id) === String(props.column.id) && String(r.to_table_id) === String(rel.relatedTableId))
.map(r => String(r.to_row_id));
console.log('[loadMultiRelationValues] filtered related row ids:', relatedRowIds);
// console.log('[loadMultiRelationValues] filtered related row ids:', relatedRowIds);
// Обновляем значения
editMultiRelationValues.value = relatedRowIds;
@@ -603,48 +603,48 @@ async function loadMultiRelationValues() {
selectedMultiRelationNames.value = multiRelationOptions.value
.filter(opt => relatedRowIds.includes(String(opt.id)))
.map(opt => opt.display);
console.log('[loadMultiRelationValues] selectedMultiRelationNames:', selectedMultiRelationNames.value);
// console.log('[loadMultiRelationValues] selectedMultiRelationNames:', selectedMultiRelationNames.value);
// Отмечаем, что данные загружены
isMultiRelationValuesLoaded = true;
}
} catch (e) {
console.error('[loadMultiRelationValues] Error:', e);
// console.error('[loadMultiRelationValues] Error:', e);
}
}, LOAD_DEBOUNCE_DELAY);
}
async function saveMultiRelation() {
console.log('[saveMultiRelation] called');
// console.log('[saveMultiRelation] called');
const rel = props.column.options || {};
console.log('[saveMultiRelation] editMultiRelationValues:', editMultiRelationValues.value);
// console.log('[saveMultiRelation] editMultiRelationValues:', editMultiRelationValues.value);
try {
const payload = {
column_id: props.column.id,
to_table_id: rel.relatedTableId,
to_row_ids: editMultiRelationValues.value
};
console.log('[saveMultiRelation] POST payload:', payload);
console.log('[TableCell] Отправляем запрос на обновление relations для строки:', props.rowId);
console.log('[TableCell] Данные запроса:', payload);
// console.log('[saveMultiRelation] POST payload:', payload);
// console.log('[TableCell] Отправляем запрос на обновление relations для строки:', props.rowId);
// console.log('[TableCell] Данные запроса:', payload);
const response = await fetch(`/api/tables/${props.column.table_id}/row/${props.rowId}/relations`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload)
});
const result = await response.json().catch(() => ({}));
console.log('[TableCell] Ответ сервера для строки:', props.rowId, 'статус:', response.status, 'результат:', result);
// console.log('[TableCell] Ответ сервера для строки:', props.rowId, 'статус:', response.status, 'результат:', result);
if (response.ok) {
console.log('[TableCell] Успешно сохранены теги для строки:', props.rowId);
// console.log('[TableCell] Успешно сохранены теги для строки:', props.rowId);
} else {
console.error('[TableCell] Ошибка сохранения тегов для строки:', props.rowId, 'статус:', response.status);
// console.error('[TableCell] Ошибка сохранения тегов для строки:', props.rowId, 'статус:', response.status);
}
editing.value = false;
await loadMultiRelationValues();
console.log('[saveMultiRelation] emitting update with:', editMultiRelationValues.value);
// console.log('[saveMultiRelation] emitting update with:', editMultiRelationValues.value);
emit('update', editMultiRelationValues.value);
} catch (e) {
console.error('[saveMultiRelation] Ошибка при сохранении мультисвязи:', e);
// console.error('[saveMultiRelation] Ошибка при сохранении мультисвязи:', e);
}
}
@@ -653,7 +653,7 @@ async function addTag() {
const rel = props.column.options || {};
try {
console.log('[addTag] Добавляем новый тег:', newTagName.value);
// console.log('[addTag] Добавляем новый тег:', newTagName.value);
// 1. Создаем новую пустую строку в связанной таблице
const rowResponse = await fetch(`/api/tables/${rel.relatedTableId}/rows`, {
@@ -662,7 +662,7 @@ async function addTag() {
});
const newRow = await rowResponse.json();
console.log('[addTag] Новая строка создана:', newRow);
// console.log('[addTag] Новая строка создана:', newRow);
// 2. Добавляем значение в ячейку через POST /cell
const cellResponse = await fetch(`/api/tables/cell`, {
@@ -676,7 +676,7 @@ async function addTag() {
});
const cellResult = await cellResponse.json();
console.log('[addTag] Значение ячейки сохранено:', cellResult);
// console.log('[addTag] Значение ячейки сохранено:', cellResult);
// Очищаем форму
newTagName.value = '';
@@ -688,12 +688,12 @@ async function addTag() {
Promise.resolve(editMultiRelationValues.value.push(String(newRow.id)))
]);
console.log('[addTag] Тег добавлен в выбранные:', editMultiRelationValues.value);
// console.log('[addTag] Тег добавлен в выбранные:', editMultiRelationValues.value);
// Сохраняем изменения, чтобы отправить WebSocket уведомление
await saveMultiRelation();
} catch (e) {
console.error('[addTag] Ошибка при добавлении тега:', e);
// console.error('[addTag] Ошибка при добавлении тега:', e);
}
}
@@ -702,13 +702,13 @@ async function deleteTag(tagId) {
if (!confirm('Удалить этот тег?')) return;
try {
console.log('[deleteTag] Удаляем тег с ID:', tagId);
// console.log('[deleteTag] Удаляем тег с ID:', tagId);
// Удаляем тег из связанной таблицы
const response = await fetch(`/api/tables/row/${tagId}`, { method: 'DELETE' });
const result = await response.json();
console.log('[deleteTag] Ответ сервера:', response.status, result);
// console.log('[deleteTag] Ответ сервера:', response.status, result);
// Убираем тег из выбранных значений, если он был выбран
editMultiRelationValues.value = editMultiRelationValues.value.filter(id => String(id) !== String(tagId));
@@ -716,12 +716,12 @@ async function deleteTag(tagId) {
// Обновляем список опций
await loadMultiRelationOptions();
console.log('[deleteTag] Тег удален:', tagId);
// console.log('[deleteTag] Тег удален:', tagId);
// Сохраняем изменения, чтобы отправить WebSocket уведомление
await saveMultiRelation();
} catch (e) {
console.error('[deleteTag] Ошибка при удалении тега:', e);
// console.error('[deleteTag] Ошибка при удалении тега:', e);
}
}

View File

@@ -361,7 +361,7 @@ async function fetchFilteredRows() {
params.append(def.filterKey, Array.isArray(val) ? val.join(',') : val);
}
}
console.log('fetchFilteredRows params:', params.toString()); // Для отладки
// console.log('fetchFilteredRows params:', params.toString()); // Для отладки
const data = await tablesService.getFilteredRows(props.tableId, params);
// Локальная фильтрация по multiselect-relation (если backend не фильтрует)
filteredRows.value = data.filter(row => {
@@ -387,7 +387,7 @@ async function fetchFilteredRows() {
// Основная загрузка таблицы
async function fetchTable() {
const startTime = Date.now();
console.log(`[UserTableView] 🚀 Начало загрузки таблицы ${props.tableId} в ${startTime}`);
// console.log(`[UserTableView] 🚀 Начало загрузки таблицы ${props.tableId} в ${startTime}`);
const data = await tablesService.getTable(props.tableId);
columns.value = data.columns;
@@ -395,12 +395,12 @@ async function fetchTable() {
cellValues.value = data.cellValues;
tableMeta.value = { name: data.name, description: data.description };
console.log(`[UserTableView] 📊 Загружено ${rows.value.length} строк, ${columns.value.length} столбцов`);
// console.log(`[UserTableView] 📊 Загружено ${rows.value.length} строк, ${columns.value.length} столбцов`);
// Предварительно загружаем все relations для всех строк параллельно
const relationColumns = columns.value.filter(col => col.type === 'multiselect-relation');
if (relationColumns.length > 0) {
console.log(`[UserTableView] 🔄 Предварительно загружаем relations для ${relationColumns.length} столбцов`);
// console.log(`[UserTableView] 🔄 Предварительно загружаем relations для ${relationColumns.length} столбцов`);
const relationPromises = [];
for (const row of rows.value) {
@@ -413,7 +413,7 @@ async function fetchTable() {
return { rowId: row.id, colId: col.id, relations };
})
.catch(error => {
console.error(`[UserTableView] Ошибка загрузки relations для row:${row.id} col:${col.id}:`, error);
// console.error(`[UserTableView] Ошибка загрузки relations для row:${row.id} col:${col.id}:`, error);
return { rowId: row.id, colId: col.id, relations: [] };
});
relationPromises.push(promise);
@@ -422,7 +422,7 @@ async function fetchTable() {
// Ждем загрузки всех relations
const results = await Promise.all(relationPromises);
console.log(`[UserTableView] ✅ Предварительно загружено ${results.length} relations`);
// console.log(`[UserTableView] ✅ Предварительно загружено ${results.length} relations`);
}
// Предварительно загружаем данные связанных таблиц для опций
@@ -434,7 +434,7 @@ async function fetchTable() {
}
if (relatedTableIds.size > 0) {
console.log(`[UserTableView] 🔄 Предварительно загружаем данные ${relatedTableIds.size} связанных таблиц для опций`);
// console.log(`[UserTableView] 🔄 Предварительно загружаем данные ${relatedTableIds.size} связанных таблиц для опций`);
const tablePromises = Array.from(relatedTableIds).map(tableId =>
fetch(`/api/tables/${tableId}`)
@@ -445,13 +445,13 @@ async function fetchTable() {
return { tableId, tableData };
})
.catch(error => {
console.error(`[UserTableView] Ошибка загрузки таблицы ${tableId}:`, error);
// console.error(`[UserTableView] Ошибка загрузки таблицы ${tableId}:`, error);
return { tableId, tableData: null };
})
);
const tableResults = await Promise.all(tablePromises);
console.log(`[UserTableView] ✅ Предварительно загружено ${tableResults.length} связанных таблиц`);
// console.log(`[UserTableView] ✅ Предварительно загружено ${tableResults.length} связанных таблиц`);
}
// Выполняем обновление фильтров и фильтрацию строк параллельно
@@ -462,15 +462,15 @@ async function fetchTable() {
// Выводим статистику кэша для отладки
const cacheStats = cacheService.getStats();
console.log('[UserTableView] Статистика кэша после загрузки таблицы:', {
tableCacheSize: cacheStats.tableCacheSize,
relationsCacheSize: cacheStats.relationsCacheSize,
tableCacheKeys: cacheStats.tableCacheKeys,
relationsCacheKeys: cacheStats.relationsCacheKeys.slice(0, 5) // Показываем только первые 5 ключей
});
// console.log('[UserTableView] Статистика кэша после загрузки таблицы:', {
// tableCacheSize: cacheStats.tableCacheSize,
// relationsCacheSize: cacheStats.relationsCacheSize,
// tableCacheKeys: cacheStats.tableCacheKeys,
// relationsCacheKeys: cacheStats.relationsCacheKeys.slice(0, 5) // Показываем только первые 5 ключей
// });
const endTime = Date.now();
console.log(`[UserTableView] ✅ Завершена загрузка таблицы ${props.tableId} за ${endTime - startTime}ms`);
// console.log(`[UserTableView] ✅ Завершена загрузка таблицы ${props.tableId} за ${endTime - startTime}ms`);
}
async function updateRelationFilterDefs() {
@@ -485,7 +485,7 @@ async function updateRelationFilterDefs() {
// Проверяем кэш
const cached = cacheService.getTableData(tableId);
if (cached) {
console.log(`[updateRelationFilterDefs] Используем кэшированные данные таблицы ${tableId}`);
// console.log(`[updateRelationFilterDefs] Используем кэшированные данные таблицы ${tableId}`);
relatedTableMap.set(tableId, Promise.resolve(cached));
} else {
relatedTableMap.set(tableId, tablesService.getTable(tableId));
@@ -536,7 +536,7 @@ async function updateRelationFilterDefs() {
});
}
}
console.log('relationFilterDefs:', defs); // Для отладки
// console.log('relationFilterDefs:', defs); // Для отладки
relationFilterDefs.value = defs;
}
@@ -553,7 +553,7 @@ onMounted(() => {
fetchTable();
// Подписка на WebSocket обновления таблицы
unsubscribeFromTableUpdate = websocketService.onTableUpdate(props.tableId, () => {
console.log('[UserTableView] Получено событие table-updated, перезагружаем данные');
// console.log('[UserTableView] Получено событие table-updated, перезагружаем данные');
// Очищаем кэш текущей таблицы
cacheService.clearTableCache(props.tableId);
fetchTable();
@@ -561,15 +561,15 @@ onMounted(() => {
// Подписка на WebSocket обновления тегов
const { onTagsUpdate } = useTagsWebSocket();
console.log('[UserTableView] Подписываемся на обновления тегов для таблицы:', props.tableId);
console.log('[UserTableView] onTagsUpdate функция:', typeof onTagsUpdate);
// console.log('[UserTableView] Подписываемся на обновления тегов для таблицы:', props.tableId);
// console.log('[UserTableView] onTagsUpdate функция:', typeof onTagsUpdate);
unsubscribeFromTagsUpdate = onTagsUpdate(async (data) => {
console.log('[UserTableView] 🔔 ПОЛУЧЕНО СОБЫТИЕ TAGS-UPDATED!');
console.log('[UserTableView] Получено событие tags-updated, обновляем данные для таблицы:', props.tableId, data);
// console.log('[UserTableView] 🔔 ПОЛУЧЕНО СОБЫТИЕ TAGS-UPDATED!');
// console.log('[UserTableView] Получено событие tags-updated, обновляем данные для таблицы:', props.tableId, data);
// Если есть информация о конкретной строке, обновляем только её
if (data && data.rowId) {
console.log('[UserTableView] Точечное обновление для строки:', data.rowId);
// console.log('[UserTableView] Точечное обновление для строки:', data.rowId);
try {
// Очищаем кэш relations только для конкретной строки
const tagColumns = columns.value.filter(col =>
@@ -581,19 +581,19 @@ onMounted(() => {
cacheService.clearRelationsData(data.rowId, col.id);
}
console.log('[UserTableView] Кэш relations очищен для строки, обновляем данные строки:', data.rowId);
// console.log('[UserTableView] Кэш relations очищен для строки, обновляем данные строки:', data.rowId);
// Обновляем только данные конкретной строки
await updateRowData(data.rowId);
console.log('[UserTableView] Данные строки обновлены:', data.rowId);
// console.log('[UserTableView] Данные строки обновлены:', data.rowId);
} catch (error) {
console.error('[UserTableView] Ошибка при точечном обновлении:', error);
// console.error('[UserTableView] Ошибка при точечном обновлении:', error);
// Fallback: полная перезагрузка при ошибке
await fetchTable();
}
} else {
// Если нет информации о строке, используем старую логику
console.log('[UserTableView] Общее обновление тегов');
// console.log('[UserTableView] Общее обновление тегов');
try {
// Очищаем кэш relations для всех строк этой таблицы
const tableRows = rows.value || [];
@@ -609,11 +609,11 @@ onMounted(() => {
}
}
console.log('[UserTableView] Кэш relations очищен, перезагружаем данные таблицы:', props.tableId);
// console.log('[UserTableView] Кэш relations очищен, перезагружаем данные таблицы:', props.tableId);
await fetchTable();
console.log('[UserTableView] Данные таблицы перезагружены:', props.tableId);
// console.log('[UserTableView] Данные таблицы перезагружены:', props.tableId);
} catch (error) {
console.error('[UserTableView] Ошибка при обновлении после tags-updated:', error);
// console.error('[UserTableView] Ошибка при обновлении после tags-updated:', error);
// Fallback: полная перезагрузка при ошибке
cacheService.clearTableCache(props.tableId);
await fetchTable();
@@ -764,13 +764,13 @@ async function rebuildIndex() {
// Функция для точечного обновления данных конкретной строки
async function updateRowData(rowId) {
const startTime = Date.now();
console.log(`[UserTableView] 🔄 Начало обновления данных строки ${rowId}`);
// console.log(`[UserTableView] 🔄 Начало обновления данных строки ${rowId}`);
try {
// Находим строку в текущих данных
const rowIndex = rows.value.findIndex(row => row.id === rowId);
if (rowIndex === -1) {
console.log(`[UserTableView] Строка ${rowId} не найдена в текущих данных`);
// console.log(`[UserTableView] Строка ${rowId} не найдена в текущих данных`);
return;
}
@@ -781,7 +781,7 @@ async function updateRowData(rowId) {
);
if (tagColumns.length > 0) {
console.log(`[UserTableView] 🔄 Загружаем relations для строки ${rowId} (${tagColumns.length} столбцов)`);
// console.log(`[UserTableView] 🔄 Загружаем relations для строки ${rowId} (${tagColumns.length} столбцов)`);
const relationPromises = tagColumns.map(col =>
fetch(`/api/tables/${col.table_id}/row/${rowId}/relations`)
@@ -792,19 +792,19 @@ async function updateRowData(rowId) {
return { rowId, colId: col.id, relations };
})
.catch(error => {
console.error(`[UserTableView] Ошибка загрузки relations для row:${rowId} col:${col.id}:`, error);
// console.error(`[UserTableView] Ошибка загрузки relations для row:${rowId} col:${col.id}:`, error);
return { rowId, colId: col.id, relations: [] };
})
);
await Promise.all(relationPromises);
console.log(`[UserTableView] ✅ Relations для строки ${rowId} обновлены`);
// console.log(`[UserTableView] ✅ Relations для строки ${rowId} обновлены`);
}
const endTime = Date.now();
console.log(`[UserTableView] ✅ Завершено обновление строки ${rowId} за ${endTime - startTime}ms`);
// console.log(`[UserTableView] ✅ Завершено обновление строки ${rowId} за ${endTime - startTime}ms`);
} catch (error) {
console.error(`[UserTableView] ❌ Ошибка при обновлении строки ${rowId}:`, error);
// console.error(`[UserTableView] ❌ Ошибка при обновлении строки ${rowId}:`, error);
throw error;
}
}

View File

@@ -50,7 +50,7 @@ export function useAuthFlow(options = {}) {
if (telegramAuth.value.checkInterval) {
clearInterval(telegramAuth.value.checkInterval);
telegramAuth.value.checkInterval = null;
console.log('[useAuthFlow] Интервал проверки Telegram авторизации очищен');
// console.log('[useAuthFlow] Интервал проверки Telegram авторизации очищен');
}
};
@@ -69,13 +69,13 @@ export function useAuthFlow(options = {}) {
clearTelegramInterval(); // На всякий случай
telegramAuth.value.checkInterval = setInterval(async () => {
try {
console.log('[useAuthFlow] Проверка статуса Telegram...');
// console.log('[useAuthFlow] Проверка статуса Telegram...');
// Используем checkAuth из useAuth для обновления состояния
const checkResponse = await auth.checkAuth();
const telegramId = auth.telegramId.value;
if (auth.isAuthenticated.value && telegramId) {
console.log('[useAuthFlow] Telegram успешно связан/подтвержден.');
// console.log('[useAuthFlow] Telegram успешно связан/подтвержден.');
clearTelegramInterval();
telegramAuth.value.showVerification = false;
telegramAuth.value.verificationCode = '';
@@ -87,7 +87,7 @@ export function useAuthFlow(options = {}) {
return;
}
} catch (intervalError) {
console.error('[useAuthFlow] Ошибка при проверке статуса Telegram в интервале:', intervalError);
// console.error('[useAuthFlow] Ошибка при проверке статуса Telegram в интервале:', intervalError);
// Решаем, останавливать ли интервал при ошибке
// telegramAuth.value.error = 'Ошибка проверки статуса Telegram.';
// clearTelegramInterval();
@@ -99,7 +99,7 @@ export function useAuthFlow(options = {}) {
showErrorMessage(telegramAuth.value.error);
}
} catch (error) {
console.error('[useAuthFlow] Ошибка инициализации Telegram аутентификации:', error);
// console.error('[useAuthFlow] Ошибка инициализации Telegram аутентификации:', error);
const message = error?.response?.data?.error || 'Ошибка при инициализации аутентификации через Telegram';
telegramAuth.value.error = message;
showErrorMessage(message);
@@ -114,7 +114,7 @@ export function useAuthFlow(options = {}) {
telegramAuth.value.verificationCode = '';
telegramAuth.value.error = '';
telegramAuth.value.isLoading = false;
console.log('[useAuthFlow] Аутентификация Telegram отменена');
// console.log('[useAuthFlow] Аутентификация Telegram отменена');
};
// --- Email ---
@@ -148,13 +148,13 @@ export function useAuthFlow(options = {}) {
emailAuth.value.showForm = false;
emailAuth.value.showVerification = true;
emailAuth.value.verificationCode = ''; // Очищаем поле кода
console.log('[useAuthFlow] Код верификации Email отправлен на:', emailAuth.value.verificationEmail);
// console.log('[useAuthFlow] Код верификации Email отправлен на:', emailAuth.value.verificationEmail);
} else {
emailAuth.value.error = response.data.error || 'Ошибка инициализации аутентификации по email';
showErrorMessage(emailAuth.value.error);
}
} catch (error) {
console.error('[useAuthFlow] Ошибка при запросе инициализации Email:', error);
// console.error('[useAuthFlow] Ошибка при запросе инициализации Email:', error);
const message = error?.response?.data?.error || 'Ошибка при запросе кода подтверждения';
emailAuth.value.error = message;
showErrorMessage(message);

View File

@@ -64,14 +64,14 @@ export function useChat(auth) {
const { silent = false, initial = false, authType = null } = options;
if (messageLoading.value.isHistoryLoadingInProgress) {
console.warn('[useChat] Загрузка истории уже идет, пропуск.');
// console.warn('[useChat] Загрузка истории уже идет, пропуск.');
return;
}
messageLoading.value.isHistoryLoadingInProgress = true;
// Если initial=true, сбрасываем offset и hasMoreMessages
if (initial) {
console.log('[useChat] Начальная загрузка истории...');
// console.log('[useChat] Начальная загрузка истории...');
messageLoading.value.offset = 0;
messageLoading.value.hasMoreMessages = false;
messages.value = []; // Очищаем текущие сообщения перед начальной загрузкой
@@ -86,17 +86,17 @@ export function useChat(auth) {
messageLoading.value.isLoadingHistory = true;
if (!silent && initial) isLoading.value = true; // Показываем общий лоадер только при начальной загрузке
console.log(
`[useChat] Загрузка истории сообщений (initial: ${initial}, authType: ${authType}, offset: ${messageLoading.value.offset})...`
);
// console.log(
// `[useChat] Загрузка истории сообщений (initial: ${initial}, authType: ${authType}, offset: ${messageLoading.value.offset})...`
// );
try {
// --- Логика ожидания привязки гостя (упрощенная) ---
// TODO: Рассмотреть более надежный механизм, если это необходимо
if (authType) {
console.log(`[useChat] Ожидание после ${authType} аутентификации...`);
// console.log(`[useChat] Ожидание после ${authType} аутентификации...`);
await new Promise((resolve) => setTimeout(resolve, 1500)); // Увеличена задержка
console.log('[useChat] Ожидание завершено, продолжаем загрузку истории.');
// console.log('[useChat] Ожидание завершено, продолжаем загрузку истории.');
}
// --- Конец логики ожидания ---
@@ -107,9 +107,9 @@ export function useChat(auth) {
const countResponse = await api.get('/chat/history', { params: { count_only: true } });
if (!countResponse.data.success) throw new Error('Не удалось получить количество сообщений');
totalMessages = countResponse.data.total || countResponse.data.count || 0;
console.log(`[useChat] Всего сообщений в истории: ${totalMessages}`);
// console.log(`[useChat] Всего сообщений в истории: ${totalMessages}`);
} catch(countError) {
console.error('[useChat] Ошибка получения количества сообщений:', countError);
// console.error('[useChat] Ошибка получения количества сообщений:', countError);
// Не прерываем выполнение, попробуем загрузить без total
}
}
@@ -118,7 +118,7 @@ export function useChat(auth) {
// Если это первая загрузка и мы знаем total, рассчитаем смещение для последних сообщений
if (initial && totalMessages > 0 && totalMessages > messageLoading.value.limit) {
effectiveOffset = Math.max(0, totalMessages - messageLoading.value.limit);
console.log(`[useChat] Рассчитано начальное смещение: ${effectiveOffset}`);
// console.log(`[useChat] Рассчитано начальное смещение: ${effectiveOffset}`);
}
const response = await api.get('/chat/history', {
@@ -130,7 +130,7 @@ export function useChat(auth) {
if (response.data.success) {
const loadedMessages = response.data.messages || [];
console.log(`[useChat] Загружено ${loadedMessages.length} сообщений.`);
// console.log(`[useChat] Загружено ${loadedMessages.length} сообщений.`);
if (loadedMessages.length > 0) {
// Добавляем к существующим (в начало для истории, в конец для начальной загрузки)
@@ -147,7 +147,7 @@ export function useChat(auth) {
} else {
messageLoading.value.offset += loadedMessages.length;
}
console.log(`[useChat] Новое смещение: ${messageLoading.value.offset}`);
// console.log(`[useChat] Новое смещение: ${messageLoading.value.offset}`);
// Проверяем, есть ли еще сообщения для загрузки
// Используем totalMessages, если он был успешно получен
@@ -157,7 +157,7 @@ export function useChat(auth) {
// Если total не известен, считаем, что есть еще, если загрузили полный лимит
messageLoading.value.hasMoreMessages = loadedMessages.length === messageLoading.value.limit;
}
console.log(`[useChat] Есть еще сообщения: ${messageLoading.value.hasMoreMessages}`);
// console.log(`[useChat] Есть еще сообщения: ${messageLoading.value.hasMoreMessages}`);
} else {
// Если сообщений не пришло, значит, больше нет
messageLoading.value.hasMoreMessages = false;
@@ -177,11 +177,11 @@ export function useChat(auth) {
}
} else {
console.error('[useChat] API вернул ошибку при загрузке истории:', response.data.error);
// console.error('[useChat] API вернул ошибку при загрузке истории:', response.data.error);
messageLoading.value.hasMoreMessages = false; // Считаем, что больше нет при ошибке
}
} catch (error) {
console.error('[useChat] Ошибка загрузки истории сообщений:', error);
// console.error('[useChat] Ошибка загрузки истории сообщений:', error);
messageLoading.value.hasMoreMessages = false; // Считаем, что больше нет при ошибке
} finally {
messageLoading.value.isLoadingHistory = false;
@@ -193,12 +193,12 @@ export function useChat(auth) {
// --- Отправка сообщения ---
const handleSendMessage = async (payload) => {
// --- НАЧАЛО ДОБАВЛЕННЫХ ЛОГОВ ---
console.log('[useChat] handleSendMessage called. Payload:', payload);
console.log('[useChat] Current auth state:', {
isAuthenticated: auth.isAuthenticated.value,
userId: auth.userId.value,
authType: auth.authType.value,
});
// console.log('[useChat] handleSendMessage called. Payload:', payload);
// console.log('[useChat] Current auth state:', {
// isAuthenticated: auth.isAuthenticated.value,
// userId: auth.userId.value,
// authType: auth.authType.value,
// });
// --- КОНЕЦ ДОБАВЛЕННЫХ ЛОГОВ ---
const { message: text, attachments: files } = payload; // files - массив File объектов
@@ -206,7 +206,7 @@ export function useChat(auth) {
// Проверка на пустое сообщение (если нет ни текста, ни файлов)
if (!userMessageContent && (!files || files.length === 0)) {
console.warn('[useChat] Попытка отправить пустое сообщение.');
// console.warn('[useChat] Попытка отправить пустое сообщение.');
return;
}
@@ -268,7 +268,7 @@ export function useChat(auth) {
const userMsgIndex = messages.value.findIndex((m) => m.id === tempId);
if (response.data.success) {
console.log('[useChat] Сообщение успешно отправлено:', response.data);
// console.log('[useChat] Сообщение успешно отправлено:', response.data);
// Обновляем локальное сообщение данными с сервера
if (userMsgIndex !== -1) {
const serverUserMessage = response.data.userMessage || { id: response.data.messageId };
@@ -317,7 +317,7 @@ export function useChat(auth) {
});
setToStorage('guestMessages', storedMessages);
} catch (storageError) {
console.error('[useChat] Ошибка сохранения гостевого сообщения в localStorage:', storageError);
// console.error('[useChat] Ошибка сохранения гостевого сообщения в localStorage:', storageError);
}
}
@@ -329,7 +329,7 @@ export function useChat(auth) {
}
} catch (error) {
console.error('[useChat] Ошибка отправки сообщения:', error);
// console.error('[useChat] Ошибка отправки сообщения:', error);
const userMsgIndex = messages.value.findIndex((m) => m.id === tempId);
if (userMsgIndex !== -1) {
messages.value[userMsgIndex].hasError = true;
@@ -354,7 +354,7 @@ export function useChat(auth) {
try {
const storedMessages = getFromStorage('guestMessages');
if (storedMessages && Array.isArray(storedMessages) && storedMessages.length > 0) {
console.log(`[useChat] Найдено ${storedMessages.length} сохраненных гостевых сообщений`);
// console.log(`[useChat] Найдено ${storedMessages.length} сохраненных гостевых сообщений`);
// Добавляем только если текущий список пуст (чтобы не дублировать при HMR)
if(messages.value.length === 0) {
messages.value = storedMessages.map(m => ({ ...m, isGuest: true })); // Помечаем как гостевые
@@ -362,7 +362,7 @@ export function useChat(auth) {
}
}
} catch (e) {
console.error('[useChat] Ошибка загрузки гостевых сообщений из localStorage:', e);
// console.error('[useChat] Ошибка загрузки гостевых сообщений из localStorage:', e);
removeFromStorage('guestMessages'); // Очистить при ошибке парсинга
}
}
@@ -381,7 +381,7 @@ export function useChat(auth) {
guestId.value = '';
}
} catch (error) {
console.error('[useChat] Ошибка связывания гостевых сообщений:', error);
// console.error('[useChat] Ошибка связывания гостевых сообщений:', error);
}
};
@@ -401,7 +401,7 @@ export function useChat(auth) {
// Сброс чата при выходе пользователя
watch(() => auth.isAuthenticated.value, (isAuth, wasAuth) => {
if (!isAuth && wasAuth) { // Если пользователь разлогинился
console.log('[useChat] Пользователь вышел, сброс состояния чата.');
// console.log('[useChat] Пользователь вышел, сброс состояния чата.');
messages.value = [];
messageLoading.value.offset = 0;
messageLoading.value.hasMoreMessages = false;
@@ -413,7 +413,7 @@ export function useChat(auth) {
// Гостевые данные очищаются при успешной аутентификации в loadMessages
// или если пользователь сам очистит localStorage
} else if (isAuth && !wasAuth) { // Если пользователь вошел
console.log('[useChat] Пользователь вошел, подключаем WebSocket.');
// console.log('[useChat] Пользователь вошел, подключаем WebSocket.');
// Отложенное подключение, чтобы дождаться загрузки данных пользователя
setTimeout(() => setupChatWebSocket(), 100);
}
@@ -422,7 +422,7 @@ export function useChat(auth) {
// Отслеживаем загрузку данных пользователя для подключения WebSocket
watch(() => auth.user?.value, (newUser, oldUser) => {
if (newUser && newUser.id && auth.isAuthenticated.value) {
console.log('[useChat] Данные пользователя загружены, подключаем WebSocket:', newUser.id);
// console.log('[useChat] Данные пользователя загружены, подключаем WebSocket:', newUser.id);
setupChatWebSocket();
}
}, { immediate: false });
@@ -431,12 +431,12 @@ export function useChat(auth) {
function setupChatWebSocket() {
// Подключаемся к WebSocket только если пользователь аутентифицирован
if (auth.isAuthenticated.value && auth.user && auth.user.value && auth.user.value.id) {
console.log('[useChat] Подключение к WebSocket для пользователя:', auth.user.value.id);
// console.log('[useChat] Подключение к WebSocket для пользователя:', auth.user.value.id);
websocketService.connect(auth.user.value.id);
// Создаем и сохраняем callback функции
wsCallbacks.chatMessage = (message) => {
console.log('[useChat] Получено новое сообщение через WebSocket:', message);
// console.log('[useChat] Получено новое сообщение через WebSocket:', message);
// Проверяем, что сообщение не дублируется
const existingMessage = messages.value.find(m => m.id === message.id);
if (!existingMessage) {
@@ -445,20 +445,20 @@ export function useChat(auth) {
};
wsCallbacks.conversationUpdated = (conversationId) => {
console.log('[useChat] Обновление диалога через WebSocket:', conversationId);
// console.log('[useChat] Обновление диалога через WebSocket:', conversationId);
// Можно добавить логику обновления списка диалогов
};
wsCallbacks.connected = () => {
console.log('[useChat] WebSocket подключен');
// console.log('[useChat] WebSocket подключен');
};
wsCallbacks.disconnected = () => {
console.log('[useChat] WebSocket отключен');
// console.log('[useChat] WebSocket отключен');
};
wsCallbacks.error = (error) => {
console.error('[useChat] WebSocket ошибка:', error);
// console.error('[useChat] WebSocket ошибка:', error);
};
// Подписываемся на события
@@ -468,7 +468,7 @@ export function useChat(auth) {
websocketService.on('disconnected', wsCallbacks.disconnected);
websocketService.on('error', wsCallbacks.error);
} else {
console.log('[useChat] WebSocket не подключен: пользователь не аутентифицирован или данные не загружены');
// console.log('[useChat] WebSocket не подключен: пользователь не аутентифицирован или данные не загружены');
}
}

View File

@@ -33,30 +33,30 @@ export function useTokenBalances() {
if (walletAddress) {
try {
isLoadingTokens.value = true;
console.log('[useTokenBalances] Запрос балансов для адреса:', walletAddress);
// console.log('[useTokenBalances] Запрос балансов для адреса:', walletAddress);
const response = await fetchTokenBalances(walletAddress);
// Ожидаем, что response — это массив объектов
tokenBalances.value = Array.isArray(response) ? response : (response?.data || []);
console.log('[useTokenBalances] Обновленные балансы:', tokenBalances.value);
} catch (error) {
console.error('[useTokenBalances] Ошибка при обновлении балансов:', error);
// console.log('[useTokenBalances] Обновленные балансы:', tokenBalances.value);
} catch (error) {
// console.error('[useTokenBalances] Ошибка при обновлении балансов:', error);
tokenBalances.value = [];
} finally {
isLoadingTokens.value = false;
}
} else {
console.log('[useTokenBalances] Не найден адрес кошелька для запроса балансов.');
// console.log('[useTokenBalances] Не найден адрес кошелька для запроса балансов.');
tokenBalances.value = [];
}
} else {
console.log('[useTokenBalances] Пользователь не аутентифицирован, сброс балансов.');
// console.log('[useTokenBalances] Пользователь не аутентифицирован, сброс балансов.');
tokenBalances.value = [];
}
};
const startBalanceUpdates = (intervalMs = 300000) => {
stopBalanceUpdates(); // Остановить предыдущий интервал, если он был
console.log('[useTokenBalances] Запуск обновления балансов...');
// console.log('[useTokenBalances] Запуск обновления балансов...');
updateBalances(); // Обновить сразу
balanceUpdateInterval = setInterval(updateBalances, intervalMs);
};

View File

@@ -40,8 +40,8 @@ app.use(ElementPlus);
// ]).catch(err => console.error('Failed to load API mocks:', err));
// }
console.log('API URL:', axios.defaults.baseURL);
console.log('main.js: Starting application with router');
// console.log('API URL:', axios.defaults.baseURL);
// console.log('main.js: Starting application with router');
app.mount('#app');
console.log('main.js: Application with router mounted');
// console.log('main.js: Application with router mounted');

View File

@@ -14,14 +14,13 @@ import { createRouter, createWebHistory } from 'vue-router';
import HomeView from '../views/HomeView.vue';
// Импортируем (пока не созданные) компоненты для подстраниц настроек
const SettingsAiView = () => import('../views/settings/AiSettingsView.vue');
const SettingsBlockchainView = () => import('../views/settings/BlockchainSettingsView.vue');
const SettingsSecurityView = () => import('../views/settings/SecuritySettingsView.vue');
const SettingsInterfaceView = () => import('../views/settings/Interface/InterfaceSettingsView.vue');
import axios from 'axios';
import { setToStorage } from '../utils/storage.js';
console.log('router/index.js: Script loaded');
// console.log('router/index.js: Script loaded');
const routes = [
{
@@ -50,16 +49,7 @@ const routes = [
name: 'settings-ai',
component: SettingsAiView,
},
{
path: 'blockchain',
name: 'settings-blockchain',
component: SettingsBlockchainView,
},
{
path: 'blockchain/dle-deploy',
name: 'settings-blockchain-dle-deploy',
component: () => import('../views/settings/BlockchainSettingsView.vue'),
},
{
path: 'dle-v2-deploy',
name: 'settings-dle-v2-deploy',
@@ -286,7 +276,7 @@ const router = createRouter({
routes,
});
console.log('router/index.js: Router created');
// console.log('router/index.js: Router created');
// Защита маршрутов
router.beforeEach(async (to, from, next) => {

View File

@@ -16,14 +16,14 @@ class CacheService {
const cached = this.tableCache.get(cacheKey);
if (cached && Date.now() - cached.timestamp < this.tableCacheTimeout) {
console.log(`[CacheService] ✅ КЭШ ПОПАДАНИЕ для таблицы ${tableId} (${cacheKey})`);
// console.log(`[CacheService] ✅ КЭШ ПОПАДАНИЕ для таблицы ${tableId} (${cacheKey})`);
return cached.data;
}
if (cached) {
console.log(`[CacheService] ⏰ Кэш истек для таблицы ${tableId} (${cacheKey})`);
// console.log(`[CacheService] ⏰ Кэш истек для таблицы ${tableId} (${cacheKey})`);
} else {
console.log(`[CacheService] ❌ Кэш отсутствует для таблицы ${tableId} (${cacheKey})`);
// console.log(`[CacheService] ❌ Кэш отсутствует для таблицы ${tableId} (${cacheKey})`);
}
return null;
@@ -35,7 +35,7 @@ class CacheService {
data,
timestamp: Date.now()
});
console.log(`[CacheService] Сохранены данные таблицы ${tableId} в кэш`);
// console.log(`[CacheService] Сохранены данные таблицы ${tableId} в кэш`);
}
// Кэширование relations
@@ -44,7 +44,7 @@ class CacheService {
const cached = this.relationsCache.get(cacheKey);
if (cached && Date.now() - cached.timestamp < this.relationsCacheTimeout) {
console.log(`[CacheService] Используем кэшированные relations для строки ${rowId}`);
// console.log(`[CacheService] Используем кэшированные relations для строки ${rowId}`);
return cached.data;
}
@@ -57,7 +57,7 @@ class CacheService {
data,
timestamp: Date.now()
});
console.log(`[CacheService] Сохранены relations строки ${rowId} в кэш`);
// console.log(`[CacheService] Сохранены relations строки ${rowId} в кэш`);
}
// Очистка кэша
@@ -69,11 +69,11 @@ class CacheService {
this.tableCache.delete(key);
}
}
console.log(`[CacheService] Очищен кэш таблицы ${tableId}`);
// console.log(`[CacheService] Очищен кэш таблицы ${tableId}`);
} else {
// Очищаем весь кэш таблиц
this.tableCache.clear();
console.log('[CacheService] Очищен весь кэш таблиц');
// console.log('[CacheService] Очищен весь кэш таблиц');
}
}
@@ -85,11 +85,11 @@ class CacheService {
this.relationsCache.delete(key);
}
}
console.log(`[CacheService] Очищен кэш relations строки ${rowId}`);
// console.log(`[CacheService] Очищен кэш relations строки ${rowId}`);
} else {
// Очищаем весь кэш relations
this.relationsCache.clear();
console.log('[CacheService] Очищен весь кэш relations');
// console.log('[CacheService] Очищен весь кэш relations');
}
}
@@ -97,7 +97,7 @@ class CacheService {
clearAll() {
this.tableCache.clear();
this.relationsCache.clear();
console.log('[CacheService] Очищены все кэши');
// console.log('[CacheService] Очищены все кэши');
}
// Получение статистики кэша

View File

@@ -27,10 +27,10 @@ export default {
async deleteContact(id) {
try {
const res = await api.delete(`/users/${id}`);
console.log('Ответ на удаление контакта:', res.status, res.data);
// console.log('Ответ на удаление контакта:', res.status, res.data);
return res.data;
} catch (err) {
console.error('Ошибка при удалении контакта:', err.response?.status, err.response?.data, err);
// console.error('Ошибка при удалении контакта:', err.response?.status, err.response?.data, err);
// Если пользователь уже удален (404), считаем это успехом
if (err.response?.status === 404) {

View File

@@ -27,7 +27,7 @@ class DLEV2Service {
const response = await api.post('/dle-v2', dleParams);
return response.data;
} catch (error) {
console.error('Ошибка при создании DLE v2:', error);
// console.error('Ошибка при создании DLE v2:', error);
throw error;
}
}
@@ -41,7 +41,7 @@ class DLEV2Service {
const response = await api.get('/dle-v2');
return response.data.data || [];
} catch (error) {
console.error('Ошибка при получении списка DLE v2:', error);
// console.error('Ошибка при получении списка DLE v2:', error);
return [];
}
}
@@ -55,7 +55,7 @@ class DLEV2Service {
const response = await api.get('/dle-v2/defaults');
return response.data.data;
} catch (error) {
console.error('Ошибка при получении настроек по умолчанию DLE v2:', error);
// console.error('Ошибка при получении настроек по умолчанию DLE v2:', error);
return {
votingDelay: 1,
votingPeriod: 45818,
@@ -76,7 +76,7 @@ class DLEV2Service {
const response = await api.delete(`/dle-v2/${dleAddress}`);
return response.data;
} catch (error) {
console.error('Ошибка при удалении DLE v2:', error);
// console.error('Ошибка при удалении DLE v2:', error);
throw error;
}
}

View File

@@ -56,13 +56,13 @@ export default {
return res.data;
},
async deleteTable(id) {
console.log('tablesService.deleteTable called with id:', id);
// console.log('tablesService.deleteTable called with id:', id);
try {
const res = await api.delete(`${tablesApi}/${id}`);
console.log('Delete response:', res.data);
// console.log('Delete response:', res.data);
return res.data;
} catch (error) {
console.error('Error in deleteTable service:', error);
// console.error('Error in deleteTable service:', error);
throw error;
}
},

View File

@@ -18,14 +18,14 @@ export const fetchTokenBalances = async (address = null) => {
let url = '/tokens/balances';
if (address) {
url += `?address=${encodeURIComponent(address)}`;
console.log(`Fetching token balances for specific address: ${address}`);
// console.log(`Fetching token balances for specific address: ${address}`);
} else {
console.log('Fetching token balances for session user');
// console.log('Fetching token balances for session user');
}
const response = await api.get(url);
return response.data;
} catch (error) {
console.error('Error fetching token balances:', error);
// console.error('Error fetching token balances:', error);
return {
eth: '0',
bsc: '0',

View File

@@ -15,7 +15,7 @@ import axios from '../api/axios';
import { SiweMessage } from 'siwe';
export async function connectWithWallet() {
console.log('Starting wallet connection...');
// console.log('Starting wallet connection...');
try {
// Проверяем наличие MetaMask
@@ -23,12 +23,12 @@ export async function connectWithWallet() {
throw new Error('MetaMask not detected. Please install MetaMask.');
}
console.log('MetaMask detected, requesting accounts...');
// console.log('MetaMask detected, requesting accounts...');
// Запрашиваем доступ к аккаунтам
const accounts = await window.ethereum.request({ method: 'eth_requestAccounts' });
console.log('Got accounts:', accounts);
// console.log('Got accounts:', accounts);
if (!accounts || accounts.length === 0) {
throw new Error('No accounts found. Please unlock MetaMask.');
@@ -36,13 +36,13 @@ export async function connectWithWallet() {
// Берем первый аккаунт
const address = ethers.getAddress(accounts[0]);
console.log('Normalized address:', address);
// console.log('Normalized address:', address);
// Запрашиваем nonce с сервера
console.log('Requesting nonce...');
// console.log('Requesting nonce...');
const nonceResponse = await axios.get(`/auth/nonce?address=${address}`);
const nonce = nonceResponse.data.nonce;
console.log('Got nonce:', nonce);
// console.log('Got nonce:', nonce);
// Создаем сообщение для подписи
const domain = window.location.host;
@@ -63,30 +63,30 @@ export async function connectWithWallet() {
});
const message = siweMessage.prepareMessage();
console.log('SIWE message:', message);
console.log('SIWE message details:', {
domain,
address,
statement,
uri: origin,
version: '1',
chainId: 1,
nonce,
issuedAt,
resources: [`${origin}/api/auth/verify`],
});
// console.log('SIWE message:', message);
// console.log('SIWE message details:', {
// domain,
// address,
// statement,
// uri: origin,
// version: '1',
// chainId: 1,
// nonce,
// issuedAt,
// resources: [`${origin}/api/auth/verify`],
// });
// Запрашиваем подпись
console.log('Requesting signature...');
// console.log('Requesting signature...');
const signature = await window.ethereum.request({
method: 'personal_sign',
params: [message, address.toLowerCase()],
});
console.log('Got signature:', signature);
// console.log('Got signature:', signature);
// Отправляем подпись на сервер для верификации
console.log('Sending verification request...');
// console.log('Sending verification request...');
const verificationResponse = await axios.post('/auth/verify', {
signature,
address,
@@ -94,7 +94,7 @@ export async function connectWithWallet() {
issuedAt,
});
console.log('Verification response:', verificationResponse.data);
// console.log('Verification response:', verificationResponse.data);
// Обновляем состояние аутентификации
if (verificationResponse.data.success) {
@@ -107,7 +107,7 @@ export async function connectWithWallet() {
return verificationResponse.data;
} catch (error) {
console.error('Error connecting wallet:', error);
// console.error('Error connecting wallet:', error);
throw error;
}
}

View File

@@ -47,7 +47,7 @@ class WebSshService {
this.isAgentRunning = false;
return { running: false };
} catch (error) {
console.error('Агент не доступен:', error);
// console.error('Агент не доступен:', error);
this.isAgentRunning = false;
return { running: false, error: error.message };
}
@@ -84,7 +84,7 @@ class WebSshService {
return await this.downloadAndInstallAgent();
}
} catch (error) {
console.error('Ошибка при установке агента:', error);
// console.error('Ошибка при установке агента:', error);
return await this.downloadAndInstallAgent();
}
}
@@ -154,7 +154,7 @@ EOF
requiresManualInstall: true
};
} catch (error) {
console.error('Ошибка при создании установочного скрипта:', error);
// console.error('Ошибка при создании установочного скрипта:', error);
return {
success: false,
message: 'Ошибка при подготовке установки агента',
@@ -216,7 +216,7 @@ EOF
};
}
} catch (error) {
console.error('Ошибка при создании туннеля:', error);
// console.error('Ошибка при создании туннеля:', error);
return {
success: false,
message: `Ошибка подключения к агенту: ${error.message}`
@@ -259,7 +259,7 @@ EOF
};
}
} catch (error) {
console.error('Ошибка при отключении туннеля:', error);
// console.error('Ошибка при отключении туннеля:', error);
return {
success: false,
message: `Ошибка подключения к агенту: ${error.message}`
@@ -291,7 +291,7 @@ EOF
};
}
} catch (error) {
console.error('Ошибка при получении статуса:', error);
// console.error('Ошибка при получении статуса:', error);
return {
connected: false,
domain: null,
@@ -337,7 +337,7 @@ app.post('/tunnel/create', async (req, res) => {
try {
const { domain, email, sshHost, sshUser, sshKey, localPort, serverPort, sshPort } = req.body;
console.log('Создание туннеля для домена:', domain);
// console.log('Создание туннеля для домена:', domain);
// Сохраняем SSH ключ во временный файл
const keyPath = path.join(__dirname, 'temp_ssh_key');
@@ -395,11 +395,11 @@ server {
const sshProcess = spawn('ssh', sshArgs);
sshProcess.on('error', (error) => {
console.error('SSH процесс ошибка:', error);
// console.error('SSH процесс ошибка:', error);
});
sshProcess.on('close', (code) => {
console.log('SSH процесс завершен с кодом:', code);
// console.log('SSH процесс завершен с кодом:', code);
tunnelState.connected = false;
});
@@ -419,7 +419,7 @@ server {
});
} catch (error) {
console.error('Ошибка создания туннеля:', error);
// console.error('Ошибка создания туннеля:', error);
res.status(500).json({
success: false,
message: error.message
@@ -446,7 +446,7 @@ app.post('/tunnel/disconnect', (req, res) => {
message: 'Туннель отключен'
});
} catch (error) {
console.error('Ошибка отключения туннеля:', error);
// console.error('Ошибка отключения туннеля:', error);
res.status(500).json({
success: false,
message: error.message
@@ -465,7 +465,7 @@ app.get('/tunnel/status', (req, res) => {
// Запуск сервера
app.listen(PORT, 'localhost', () => {
console.log(\`WebSSH Agent запущен на порту \${PORT}\`);
// console.log(\`WebSSH Agent запущен на порту \${PORT}\`);
});
`;
}

View File

@@ -16,7 +16,7 @@
class WebSocketService {
constructor() {
console.log('🔌 [WebSocket] Конструктор вызван');
// console.log('🔌 [WebSocket] Конструктор вызван');
this.ws = null;
this.isConnected = false;
this.reconnectAttempts = 0;
@@ -24,14 +24,14 @@ class WebSocketService {
this.reconnectDelay = 1000; // 1 секунда
this.listeners = new Map();
this.userId = null;
console.log('🔌 [WebSocket] Конструктор завершен');
// console.log('🔌 [WebSocket] Конструктор завершен');
}
// Подключение к WebSocket серверу
connect(userId = null) {
console.log('🔌 [WebSocket] Попытка подключения, userId:', userId);
// console.log('🔌 [WebSocket] Попытка подключения, userId:', userId);
if (this.ws && this.ws.readyState === WebSocket.OPEN) {
console.log('🔌 [WebSocket] Уже подключен');
// console.log('🔌 [WebSocket] Уже подключен');
return;
}
@@ -43,13 +43,13 @@ class WebSocketService {
// В Docker окружении используем тот же хост, что и для HTTP
const wsUrl = `${protocol}//${window.location.host}/ws`;
console.log('🔌 [WebSocket] Подключение к:', wsUrl);
console.log('🔌 [WebSocket] Текущий хост:', window.location.host);
// console.log('🔌 [WebSocket] Подключение к:', wsUrl);
// console.log('🔌 [WebSocket] Текущий хост:', window.location.host);
this.ws = new WebSocket(wsUrl);
this.ws.onopen = () => {
console.log('✅ [WebSocket] Подключение установлено');
// console.log('✅ [WebSocket] Подключение установлено');
this.isConnected = true;
this.reconnectAttempts = 0;
@@ -65,66 +65,42 @@ class WebSocketService {
};
this.ws.onclose = (event) => {
console.log('🔌 [WebSocket] Соединение закрыто:', event.code, event.reason);
// console.log('🔌 [WebSocket] Соединение закрыто:', event.code, event.reason);
this.isConnected = false;
this.emit('disconnected', event);
// Попытка переподключения
if (this.reconnectAttempts < this.maxReconnectAttempts) {
this.reconnectAttempts++;
console.log(`🔄 [WebSocket] Попытка переподключения ${this.reconnectAttempts}/${this.maxReconnectAttempts}`);
// console.log(`🔄 [WebSocket] Попытка переподключения ${this.reconnectAttempts}/${this.maxReconnectAttempts}`);
setTimeout(() => {
this.connect(this.userId);
}, this.reconnectDelay * this.reconnectAttempts);
} else {
console.error('❌ [WebSocket] Превышено максимальное количество попыток переподключения');
// console.error('❌ [WebSocket] Превышено максимальное количество попыток переподключения');
this.emit('reconnect-failed');
}
};
this.ws.onerror = (error) => {
console.error('❌ [WebSocket] Ошибка соединения:', error);
// console.error('❌ [WebSocket] Ошибка соединения:', error);
this.emit('error', error);
};
this.ws.onmessage = (event) => {
try {
const data = JSON.parse(event.data);
console.log('📨 [WebSocket] Получено сообщение:', data);
console.log('📨 [WebSocket] Тип сообщения:', data.type);
// console.log('📨 [WebSocket] Получено сообщение:', data);
// console.log('📨 [WebSocket] Тип сообщения:', data.type);
this.handleMessage(data);
} catch (error) {
console.error('❌ [WebSocket] Ошибка парсинга сообщения:', error);
// console.error('❌ [WebSocket] Ошибка парсинга сообщения:', error);
}
};
this.ws.onclose = (event) => {
console.log('🔌 [WebSocket] Соединение закрыто:', event.code, event.reason);
this.isConnected = false;
this.emit('disconnected', event);
// Попытка переподключения
if (this.reconnectAttempts < this.maxReconnectAttempts) {
this.reconnectAttempts++;
console.log(`🔄 [WebSocket] Попытка переподключения ${this.reconnectAttempts}/${this.maxReconnectAttempts}`);
setTimeout(() => {
this.connect(this.userId);
}, this.reconnectDelay * this.reconnectAttempts);
} else {
console.error('❌ [WebSocket] Превышено максимальное количество попыток переподключения');
this.emit('reconnect-failed');
}
};
this.ws.onerror = (error) => {
console.error('❌ [WebSocket] Ошибка соединения:', error);
this.emit('error', error);
};
} catch (error) {
console.error('❌ [WebSocket] Ошибка создания соединения:', error);
// console.error('❌ [WebSocket] Ошибка создания соединения:', error);
this.emit('error', error);
}
}
@@ -134,7 +110,7 @@ class WebSocketService {
if (this.ws && this.ws.readyState === WebSocket.OPEN) {
this.ws.send(JSON.stringify(data));
} else {
console.warn('⚠️ [WebSocket] Соединение не установлено, сообщение не отправлено:', data);
// console.warn('⚠️ [WebSocket] Соединение не установлено, сообщение не отправлено:', data);
}
}
@@ -142,57 +118,57 @@ class WebSocketService {
handleMessage(data) {
switch (data.type) {
case 'auth-success':
console.log('✅ [WebSocket] Аутентификация успешна для пользователя:', data.userId);
// console.log('✅ [WebSocket] Аутентификация успешна для пользователя:', data.userId);
this.emit('auth-success', data);
break;
case 'chat-message':
console.log('💬 [WebSocket] Новое сообщение чата:', data.message);
// console.log('💬 [WebSocket] Новое сообщение чата:', data.message);
this.emit('chat-message', data.message);
break;
case 'conversation-updated':
console.log('📝 [WebSocket] Обновление диалога:', data.conversationId);
// console.log('📝 [WebSocket] Обновление диалога:', data.conversationId);
this.emit('conversation-updated', data.conversationId);
break;
case 'messages-updated':
console.log('📨 [WebSocket] Обновление сообщений');
// console.log('📨 [WebSocket] Обновление сообщений');
this.emit('messages-updated');
break;
case 'contacts-updated':
console.log('👥 [WebSocket] Обновление контактов');
// console.log('👥 [WebSocket] Обновление контактов');
this.emit('contacts-updated');
break;
case 'tags-updated':
console.log('🔔 [websocketService] Получено сообщение tags-updated:', data);
console.log('🔔 [websocketService] Количество слушателей tags-updated:', this.listeners.get('tags-updated')?.length || 0);
// console.log('🔔 [websocketService] Получено сообщение tags-updated:', data);
// console.log('🔔 [websocketService] Количество слушателей tags-updated:', this.listeners.get('tags-updated')?.length || 0);
this.emit('tags-updated', data);
break;
case 'table-updated':
console.log('[WebSocket] table-updated:', data.tableId);
// console.log('[WebSocket] table-updated:', data.tableId);
if (tableUpdateSubscribers[data.tableId]) {
tableUpdateSubscribers[data.tableId].forEach(cb => cb(data));
}
break;
default:
console.log('❓ [WebSocket] Неизвестный тип сообщения:', data.type);
// console.log('❓ [WebSocket] Неизвестный тип сообщения:', data.type);
this.emit('unknown-message', data);
}
}
// Подписка на события
on(event, callback) {
console.log('🔌 [WebSocket] Подписка на событие:', event);
// console.log('🔌 [WebSocket] Подписка на событие:', event);
if (!this.listeners.has(event)) {
this.listeners.set(event, []);
}
this.listeners.get(event).push(callback);
console.log('🔌 [WebSocket] Количество слушателей для', event, ':', this.listeners.get(event).length);
// console.log('🔌 [WebSocket] Количество слушателей для', event, ':', this.listeners.get(event).length);
}
// Отписка от событий
@@ -208,20 +184,20 @@ class WebSocketService {
// Эмиссия событий
emit(event, data) {
console.log('🔌 [WebSocket] Эмиссия события:', event, 'с данными:', data);
// console.log('🔌 [WebSocket] Эмиссия события:', event, 'с данными:', data);
if (this.listeners.has(event)) {
const callbacks = this.listeners.get(event);
console.log('🔌 [WebSocket] Количество колбэков для', event, ':', callbacks.length);
// console.log('🔌 [WebSocket] Количество колбэков для', event, ':', callbacks.length);
callbacks.forEach((callback, index) => {
try {
console.log('🔌 [WebSocket] Выполняем колбэк #', index, 'для события', event);
// console.log('🔌 [WebSocket] Выполняем колбэк #', index, 'для события', event);
callback(data);
} catch (error) {
console.error(`❌ [WebSocket] Ошибка в обработчике события ${event}:`, error);
// console.error(`❌ [WebSocket] Ошибка в обработчике события ${event}:`, error);
}
});
} else {
console.log('🔌 [WebSocket] Нет слушателей для события:', event);
// console.log('🔌 [WebSocket] Нет слушателей для события:', event);
}
}
@@ -233,7 +209,7 @@ class WebSocketService {
}
this.isConnected = false;
this.listeners.clear();
console.log('🔌 [WebSocket] Отключен');
// console.log('🔌 [WebSocket] Отключен');
}
// Получение статуса соединения
@@ -249,7 +225,7 @@ class WebSocketService {
// Создаем единственный экземпляр
const websocketService = new WebSocketService();
console.log('🔌 [WebSocket] Сервис создан');
// console.log('🔌 [WebSocket] Сервис создан');
// Подписчики на обновления таблиц: tableId -> [callback]
const tableUpdateSubscribers = {};
@@ -269,17 +245,17 @@ export default {
websocketService,
onTableUpdate,
};
console.log('🔌 [WebSocket] Экспорт завершен');
// console.log('🔌 [WebSocket] Экспорт завершен');
// Автоматически подключаемся при загрузке модуля
console.log('🔌 [WebSocket] Автоматическое подключение...');
// console.log('🔌 [WebSocket] Автоматическое подключение...');
setTimeout(() => {
console.log('🔌 [WebSocket] Подключаемся через 1 секунду...');
// console.log('🔌 [WebSocket] Подключаемся через 1 секунду...');
websocketService.connect();
}, 1000);
// Добавляем периодическую проверку состояния соединения
setInterval(() => {
const status = websocketService.getStatus();
console.log('🔌 [WebSocket] Статус соединения:', status);
// console.log('🔌 [WebSocket] Статус соединения:', status);
}, 10000); // Проверяем каждые 10 секунд

View File

@@ -17,7 +17,7 @@ export const isLocalStorageAvailable = () => {
window.localStorage.removeItem(test);
return true;
} catch (e) {
console.error('localStorage is not available:', e);
// console.error('localStorage is not available:', e);
return false;
}
};
@@ -33,7 +33,7 @@ export const getFromStorage = (key, defaultValue = null) => {
return item || defaultValue;
}
} catch (e) {
console.error(`Error getting ${key} from localStorage:`, e);
// console.error(`Error getting ${key} from localStorage:`, e);
return defaultValue;
}
};
@@ -48,7 +48,7 @@ export const setToStorage = (key, value) => {
window.localStorage.setItem(key, valueToStore);
return true;
} catch (e) {
console.error(`Error setting ${key} in localStorage:`, e);
// console.error(`Error setting ${key} in localStorage:`, e);
return false;
}
};
@@ -59,7 +59,7 @@ export const removeFromStorage = (key) => {
window.localStorage.removeItem(key);
return true;
} catch (e) {
console.error(`Error removing ${key} from localStorage:`, e);
// console.error(`Error removing ${key} from localStorage:`, e);
return false;
}
};

View File

@@ -16,11 +16,11 @@ import { SiweMessage } from 'siwe';
export const connectWallet = async () => {
try {
console.log('Starting wallet connection...');
// console.log('Starting wallet connection...');
// Проверяем наличие MetaMask или другого Ethereum провайдера
if (!window.ethereum) {
console.error('No Ethereum provider (like MetaMask) detected!');
// console.error('No Ethereum provider (like MetaMask) detected!');
return {
success: false,
error:
@@ -28,11 +28,11 @@ export const connectWallet = async () => {
};
}
console.log('MetaMask detected, requesting accounts...');
// console.log('MetaMask detected, requesting accounts...');
// Запрашиваем доступ к аккаунтам
const accounts = await window.ethereum.request({ method: 'eth_requestAccounts' });
console.log('Got accounts:', accounts);
// console.log('Got accounts:', accounts);
if (!accounts || accounts.length === 0) {
return {
@@ -45,13 +45,13 @@ export const connectWallet = async () => {
const address = accounts[0];
// Нормализуем адрес (приводим к нижнему регистру для последующих сравнений)
const normalizedAddress = ethers.utils.getAddress(address);
console.log('Normalized address:', normalizedAddress);
// console.log('Normalized address:', normalizedAddress);
// Запрашиваем nonce с сервера
console.log('Requesting nonce...');
// console.log('Requesting nonce...');
const nonceResponse = await axios.get(`/auth/nonce?address=${normalizedAddress}`);
const nonce = nonceResponse.data.nonce;
console.log('Got nonce:', nonce);
// console.log('Got nonce:', nonce);
if (!nonce) {
return {
@@ -83,10 +83,10 @@ export const connectWallet = async () => {
// Получаем строку сообщения для подписи
const messageToSign = message.prepareMessage();
console.log('SIWE message:', messageToSign);
// console.log('SIWE message:', messageToSign);
// Запрашиваем подпись
console.log('Requesting signature...');
// console.log('Requesting signature...');
const signature = await signer.signMessage(messageToSign);
if (!signature) {
@@ -96,17 +96,17 @@ export const connectWallet = async () => {
};
}
console.log('Got signature:', signature);
// console.log('Got signature:', signature);
// Отправляем верификацию на сервер
console.log('Sending verification request...');
// console.log('Sending verification request...');
const requestData = {
address: normalizedAddress,
signature,
nonce,
issuedAt: new Date().toISOString(),
};
console.log('Request data:', requestData);
// console.log('Request data:', requestData);
const verifyResponse = await axios.post('/api/auth/verify', requestData, {
withCredentials: true,
@@ -130,7 +130,7 @@ export const connectWallet = async () => {
if (authButtonsEl) authButtonsEl.style.display = 'none';
if (logoutButtonEl) logoutButtonEl.style.display = 'inline-block';
console.log('Verification response:', verifyResponse.data);
// console.log('Verification response:', verifyResponse.data);
if (verifyResponse.data.success) {
return {
@@ -146,7 +146,7 @@ export const connectWallet = async () => {
};
}
} catch (error) {
console.error('Error connecting wallet:', error);
// console.error('Error connecting wallet:', error);
// Формируем понятное сообщение об ошибке
let errorMessage = 'Произошла ошибка при подключении кошелька.';

View File

@@ -93,24 +93,24 @@ function connectWebSocket() {
const wsProtocol = window.location.protocol === 'https:' ? 'wss' : 'ws';
ws = new WebSocket(`${wsProtocol}://${window.location.host}/ws`);
ws.onopen = () => {
console.log('[CRM] WebSocket соединение установлено');
// console.log('[CRM] WebSocket соединение установлено');
};
ws.onmessage = (event) => {
try {
const msg = JSON.parse(event.data);
if (msg.type === 'contacts-updated') {
console.log('[CRM] Получено событие contacts-updated, обновляем контакты');
// console.log('[CRM] Получено событие contacts-updated, обновляем контакты');
loadContacts();
}
} catch (e) {
console.error('[CRM] Ошибка обработки сообщения WebSocket:', e);
// console.error('[CRM] Ошибка обработки сообщения WebSocket:', e);
}
};
ws.onclose = () => {
console.log('[CRM] WebSocket соединение закрыто');
// console.log('[CRM] WebSocket соединение закрыто');
};
ws.onerror = (e) => {
console.error('[CRM] WebSocket ошибка:', e);
// console.error('[CRM] WebSocket ошибка:', e);
};
}
@@ -136,7 +136,7 @@ const loadDLEs = async () => {
selectedDleIndex.value = 0;
}
} catch (error) {
console.error('Ошибка при загрузке списка DLE:', error);
// console.error('Ошибка при загрузке списка DLE:', error);
} finally {
isLoading.value = false;
}
@@ -144,7 +144,7 @@ const loadDLEs = async () => {
// Обработчик события изменения авторизации
const handleAuthEvent = (eventData) => {
console.log('[CrmView] Получено событие изменения авторизации:', eventData);
// console.log('[CrmView] Получено событие изменения авторизации:', eventData);
if (eventData.isAuthenticated) {
loadDLEs();
}
@@ -154,7 +154,7 @@ const handleAuthEvent = (eventData) => {
let unsubscribe = null;
onMounted(() => {
console.log('[CrmView] Компонент загружен');
// console.log('[CrmView] Компонент загружен');
// Если пользователь авторизован, загружаем данные
if (auth.isAuthenticated.value) {

View File

@@ -52,7 +52,7 @@
import BaseLayout from '../components/BaseLayout.vue';
import ChatInterface from '../components/ChatInterface.vue';
console.log('HomeView.vue: Using BaseLayout');
// console.log('HomeView.vue: Using BaseLayout');
// Определяем props, переданные из App.vue через RouterView
const props = defineProps({
@@ -99,7 +99,7 @@
let unsubscribe = null;
onMounted(() => {
console.log('[HomeView] Компонент загружен (обновленная версия)');
// console.log('[HomeView] Компонент загружен (обновленная версия)');
// Подписка на события авторизации
unsubscribe = eventBus.on('auth-state-changed', handleAuthEvent);
@@ -118,7 +118,7 @@
// Функция обновления сообщений после авторизации
const handleAuthEvent = async (eventData) => {
console.log('[HomeView] Получено событие изменения авторизации:', eventData);
// console.log('[HomeView] Получено событие изменения авторизации:', eventData);
if (eventData.isAuthenticated) {
// Сначала связываем гостевые сообщения, если есть
await linkGuestMessagesAfterAuth();

View File

@@ -58,7 +58,7 @@ async function loadContact() {
error.value = 'Контакт не найден';
}
} catch (e) {
console.error('Ошибка загрузки контакта:', e);
// console.error('Ошибка загрузки контакта:', e);
contact.value = null;
error.value = 'Контакт не найден';
} finally {
@@ -72,7 +72,7 @@ async function deleteContact() {
error.value = '';
try {
const result = await contactsService.deleteContact(contact.value.id);
console.log('Результат удаления:', result);
// console.log('Результат удаления:', result);
// Если удаление успешно или пользователь уже удален
if (result.success || result.message === 'Пользователь уже удален') {
@@ -81,7 +81,7 @@ async function deleteContact() {
error.value = 'Ошибка при удалении контакта';
}
} catch (e) {
console.error('Ошибка при удалении:', e);
// console.error('Ошибка при удалении:', e);
error.value = 'Ошибка при удалении контакта';
} finally {
isDeleting.value = false;

View File

@@ -470,9 +470,9 @@ async function handleSendMessage({ message, attachments }) {
}
async function handleAiReply(selectedMessages = []) {
console.log('[AI-ASSISTANT] Кнопка нажата, messages:', messages.value);
// console.log('[AI-ASSISTANT] Кнопка нажата, messages:', messages.value);
if (isAiLoading.value) {
console.log('[AI-ASSISTANT] Уже идёт генерация, выход');
// console.log('[AI-ASSISTANT] Уже идёт генерация, выход');
return;
}
if (!Array.isArray(selectedMessages) || selectedMessages.length === 0) {
@@ -485,7 +485,7 @@ async function handleAiReply(selectedMessages = []) {
const draftResp = await messagesService.generateAiDraft(conversationId.value, selectedMessages);
if (draftResp && draftResp.success && draftResp.aiMessage) {
chatNewMessage.value = draftResp.aiMessage;
console.log('[AI-ASSISTANT] Черновик сгенерирован:', draftResp.aiMessage);
// console.log('[AI-ASSISTANT] Черновик сгенерирован:', draftResp.aiMessage);
} else {
alert('Не удалось сгенерировать ответ ИИ.');
}
@@ -493,7 +493,7 @@ async function handleAiReply(selectedMessages = []) {
alert('Ошибка генерации ответа ИИ: ' + (e?.message || e));
} finally {
isAiLoading.value = false;
console.log('[AI-ASSISTANT] Генерация завершена');
// console.log('[AI-ASSISTANT] Генерация завершена');
}
}
@@ -536,9 +536,9 @@ async function createTag() {
const descCol = table.columns[1];
// 1. Создаём строку
const newRow = await tablesService.addRow(tableId);
console.log('DEBUG newRow:', newRow);
// console.log('DEBUG newRow:', newRow);
if (!newRow || !newRow.id) {
console.error('Ошибка: не удалось получить id новой строки', newRow);
// console.error('Ошибка: не удалось получить id новой строки', newRow);
alert('Ошибка: не удалось получить id новой строки. См. консоль.');
return;
}
@@ -618,7 +618,7 @@ onMounted(async () => {
// Подписываемся на обновления тегов
unsubscribeFromTags = onTagsUpdate(async () => {
console.log('[ContactDetailsView] Получено обновление тегов, перезагружаем списки тегов');
// console.log('[ContactDetailsView] Получено обновление тегов, перезагружаем списки тегов');
await loadAllTags();
await loadUserTags();
});

File diff suppressed because it is too large Load Diff

View File

@@ -1006,10 +1006,10 @@ const getOkvedLevel = (code) => {
// Функция для загрузки ОКВЭД кодов определенного уровня
const fetchOkvedCodes = async (level, parentCode, optionsRef, loadingRef) => {
console.log(`🔍 fetchOkvedCodes вызвана: level=${level}, parentCode=${parentCode || 'root'}`);
// console.log(`🔍 fetchOkvedCodes вызвана: level=${level}, parentCode=${parentCode || 'root'}`);
if (!optionsRef || !loadingRef) {
console.error('[DleDeployForm] fetchOkvedCodes requires optionsRef and loadingRef');
// console.error('[DleDeployForm] fetchOkvedCodes requires optionsRef and loadingRef');
return;
}
@@ -1017,8 +1017,8 @@ const fetchOkvedCodes = async (level, parentCode, optionsRef, loadingRef) => {
optionsRef.value = [];
try {
console.log(`[DleDeployForm] Загрузка ОКВЭД уровень ${level}, родитель: ${parentCode || 'root'}`);
console.log(`[DleDeployForm] Доступно ОКВЭД кодов: ${russianClassifiers.okved?.length || 0}`);
// console.log(`[DleDeployForm] Загрузка ОКВЭД уровень ${level}, родитель: ${parentCode || 'root'}`);
// console.log(`[DleDeployForm] Доступно ОКВЭД кодов: ${russianClassifiers.okved?.length || 0}`);
// Фильтруем коды из уже загруженных данных
let filteredCodes = [];
@@ -1042,11 +1042,11 @@ const fetchOkvedCodes = async (level, parentCode, optionsRef, loadingRef) => {
text: `${code.code} - ${code.title}`
}));
console.log(`[DleDeployForm] Загружено ОКВЭД кодов уровня ${level}: ${optionsRef.value.length}`);
console.log(`[DleDeployForm] Первые 3 кода:`, optionsRef.value.slice(0, 3));
// console.log(`[DleDeployForm] Загружено ОКВЭД кодов уровня ${level}: ${optionsRef.value.length}`);
// console.log(`[DleDeployForm] Первые 3 кода:`, optionsRef.value.slice(0, 3));
} catch (error) {
console.error('[DleDeployForm] Ошибка при загрузке ОКВЭД кодов:', error);
// console.error('[DleDeployForm] Ошибка при загрузке ОКВЭД кодов:', error);
} finally {
loadingRef.value = false;
}
@@ -1083,7 +1083,7 @@ const updateCurrentOkvedSelection = () => {
// Watchers для 2-уровневой загрузки ОКВЭД
watch(selectedOkvedLevel1, (newVal) => {
console.log('[DleDeployForm] selectedOkvedLevel1 changed to:', newVal);
// console.log('[DleDeployForm] selectedOkvedLevel1 changed to:', newVal);
selectedOkvedLevel2.value = '';
okvedLevel2Options.value = [];
@@ -1094,7 +1094,7 @@ watch(selectedOkvedLevel1, (newVal) => {
});
watch(selectedOkvedLevel2, () => {
console.log('[DleDeployForm] selectedOkvedLevel2 changed to:', selectedOkvedLevel2.value);
// console.log('[DleDeployForm] selectedOkvedLevel2 changed to:', selectedOkvedLevel2.value);
updateCurrentOkvedSelection();
});
@@ -1297,9 +1297,9 @@ const saveFormData = () => {
showUnifiedKey: showUnifiedKey.value
};
localStorage.setItem(STORAGE_KEY, JSON.stringify(dataToSave));
console.log('[DleDeployForm] Данные формы сохранены в localStorage');
// console.log('[DleDeployForm] Данные формы сохранены в localStorage');
} catch (error) {
console.error('[DleDeployForm] Ошибка сохранения данных:', error);
// console.error('[DleDeployForm] Ошибка сохранения данных:', error);
}
}, 500); // Задержка 500мс
};
@@ -1362,11 +1362,11 @@ const loadFormData = () => {
Object.assign(keyValidation, parsedData.keyValidation || {});
showUnifiedKey.value = parsedData.showUnifiedKey || false;
console.log('[DleDeployForm] Данные формы восстановлены из localStorage');
// console.log('[DleDeployForm] Данные формы восстановлены из localStorage');
return true;
}
} catch (error) {
console.error('[DleDeployForm] Ошибка восстановления данных:', error);
// console.error('[DleDeployForm] Ошибка восстановления данных:', error);
}
return false;
};
@@ -1375,9 +1375,9 @@ const loadFormData = () => {
const clearStoredData = () => {
try {
localStorage.removeItem(STORAGE_KEY);
console.log('[DleDeployForm] Данные формы удалены из localStorage');
// console.log('[DleDeployForm] Данные формы удалены из localStorage');
} catch (error) {
console.error('[DleDeployForm] Ошибка очистки localStorage:', error);
// console.error('[DleDeployForm] Ошибка очистки localStorage:', error);
}
};
@@ -1463,7 +1463,7 @@ const searchByPostalCode = async () => {
params.append('countrycodes', 'RU');
}
console.log(`[SearchByPostalCode] Querying Nominatim: ${params.toString()}`);
// console.log(`[SearchByPostalCode] Querying Nominatim: ${params.toString()}`);
const response = await axios.get(`/geocoding/nominatim-search?${params.toString()}`);
if (response.data && Array.isArray(response.data) && response.data.length > 0) {
@@ -1483,18 +1483,18 @@ const searchByPostalCode = async () => {
rawData: result.address // Сохраняем все сырые данные для анализа
}));
console.log(`[SearchByPostalCode] Found ${searchResults.value.length} results`);
// console.log(`[SearchByPostalCode] Found ${searchResults.value.length} results`);
// Автоматически заполняем поля первым результатом
if (searchResults.value.length > 0) {
fillFromSearchResult(searchResults.value[0]);
console.log('[SearchByPostalCode] Auto-filled with first result');
// console.log('[SearchByPostalCode] Auto-filled with first result');
}
} else {
console.log('[SearchByPostalCode] No results found');
// console.log('[SearchByPostalCode] No results found');
}
} catch (error) {
console.error('Ошибка при поиске по индексу:', error);
// console.error('Ошибка при поиске по индексу:', error);
} finally {
isSearchingAddress.value = false;
}
@@ -1509,7 +1509,7 @@ const findOktmoByAddress = (result) => {
return '';
}
console.log(`[FindOktmo] Searching OKTMO for region: "${region}"`);
// console.log(`[FindOktmo] Searching OKTMO for region: "${region}"`);
// Ищем совпадение по названию региона
const foundOktmo = russianClassifiers.oktmo.find(oktmo => {
@@ -1523,11 +1523,11 @@ const findOktmoByAddress = (result) => {
});
if (foundOktmo) {
console.log(`[FindOktmo] Found OKTMO: ${foundOktmo.code} - ${foundOktmo.title}`);
// console.log(`[FindOktmo] Found OKTMO: ${foundOktmo.code} - ${foundOktmo.title}`);
return foundOktmo.code;
}
console.log(`[FindOktmo] No OKTMO found for region: "${region}"`);
// console.log(`[FindOktmo] No OKTMO found for region: "${region}"`);
return '';
};
@@ -1549,13 +1549,13 @@ const fillFromSearchResult = (result) => {
if (autoOktmo) {
dleSettings.selectedOktmo = autoOktmo;
autoSelectedOktmo.value = true; // Помечаем как автовыбранный
console.log(`[FillFromSearchResult] Auto-selected OKTMO: ${autoOktmo}`);
// console.log(`[FillFromSearchResult] Auto-selected OKTMO: ${autoOktmo}`);
} else {
autoSelectedOktmo.value = false;
}
console.log('[FillFromSearchResult] Filled address data:', dleSettings.addressData);
console.log('[FillFromSearchResult] Saved API result:', result);
// console.log('[FillFromSearchResult] Filled address data:', dleSettings.addressData);
// console.log('[FillFromSearchResult] Saved API result:', result);
};
// Проверка адреса (повторный запрос для валидации)

View File

@@ -99,15 +99,15 @@ function validatePrivateKey(key) {
if (!key) return false;
const trimmed = key.trim();
if (!trimmed.startsWith('-----BEGIN OPENSSH PRIVATE KEY-----')) {
console.error('Ключ не начинается с -----BEGIN OPENSSH PRIVATE KEY-----');
// console.error('Ключ не начинается с -----BEGIN OPENSSH PRIVATE KEY-----');
return false;
}
if (!trimmed.endsWith('-----END OPENSSH PRIVATE KEY-----')) {
console.error('Ключ не заканчивается на -----END OPENSSH PRIVATE KEY-----');
// console.error('Ключ не заканчивается на -----END OPENSSH PRIVATE KEY-----');
return false;
}
if (trimmed.split('\n').length < 3) {
console.error('Ключ слишком короткий или не содержит переносов строк');
// console.error('Ключ слишком короткий или не содержит переносов строк');
return false;
}
return true;
@@ -124,15 +124,15 @@ const handleSubmit = async () => {
}
// Логирование ключа (только для отладки!)
console.log('SSH ключ (начало):', form.sshKey.slice(0, 40));
console.log('SSH ключ (конец):', form.sshKey.slice(-40));
console.log('Длина ключа:', form.sshKey.length);
// console.log('SSH ключ (начало):', form.sshKey.slice(0, 40));
// console.log('SSH ключ (конец):', form.sshKey.slice(-40));
// console.log('Длина ключа:', form.sshKey.length);
// Логирование отправляемых данных (без самого ключа)
console.log('Данные для агента:', {
...form,
sshKey: form.sshKey ? `[скрыто, длина: ${form.sshKey.length}]` : 'нет ключа'
});
// console.log('Данные для агента:', {
// ...form,
// sshKey: form.sshKey ? `[скрыто, длина: ${form.sshKey.length}]` : 'нет ключа'
// });
isLoading.value = true;
addLog('info', 'Запуск публикации...');
@@ -228,7 +228,7 @@ const checkConnectionStatus = async () => {
? `Подключено к ${status.domain}`
: 'Не подключено';
} catch (error) {
console.error('Ошибка проверки статуса:', error);
// console.error('Ошибка проверки статуса:', error);
}
};

View File

@@ -467,7 +467,7 @@ async function addModule() {
alert('✅ Модуль успешно добавлен!');
} catch (error) {
console.error('Ошибка при добавлении модуля:', error);
// console.error('Ошибка при добавлении модуля:', error);
alert('❌ Ошибка при добавлении модуля: ' + error.message);
} finally {
isAdding.value = false;
@@ -486,7 +486,7 @@ async function removeModule(moduleId) {
alert('✅ Модуль успешно удален!');
} catch (error) {
console.error('Ошибка при удалении модуля:', error);
// console.error('Ошибка при удалении модуля:', error);
alert('❌ Ошибка при удалении модуля: ' + error.message);
}
}
@@ -495,7 +495,7 @@ async function removeModule(moduleId) {
async function installAvailableModule(availableModule) {
// Здесь должна быть логика установки модуля
// Например, деплой модуля и добавление в DLE
console.log('Установка модуля:', availableModule);
// console.log('Установка модуля:', availableModule);
alert(`Модуль "${availableModule.name}" будет установлен`);
}

View File

@@ -454,7 +454,7 @@ async function createMultisigOperation() {
alert('✅ Операция мультиподписи успешно создана!');
} catch (error) {
console.error('Ошибка при создании операции мультиподписи:', error);
// console.error('Ошибка при создании операции мультиподписи:', error);
alert('❌ Ошибка при создании операции: ' + error.message);
} finally {
isCreating.value = false;
@@ -471,7 +471,7 @@ async function signOperation(operationId, support) {
alert('✅ Ваша подпись учтена!');
} catch (error) {
console.error('Ошибка при подписании операции:', error);
// console.error('Ошибка при подписании операции:', error);
alert('❌ Ошибка при подписании: ' + error.message);
}
}
@@ -486,7 +486,7 @@ async function executeOperation(operationId) {
alert('✅ Операция успешно исполнена!');
} catch (error) {
console.error('Ошибка при исполнении операции:', error);
// console.error('Ошибка при исполнении операции:', error);
alert('❌ Ошибка при исполнении операции: ' + error.message);
}
}
@@ -498,7 +498,7 @@ async function loadOperations() {
// Пока используем заглушку
operations.value = [];
} catch (error) {
console.error('Ошибка при загрузке операций:', error);
// console.error('Ошибка при загрузке операций:', error);
}
}
@@ -520,7 +520,7 @@ function resetForm() {
function viewOperationDetails(operationId) {
// Открыть модальное окно с деталями операции
console.log('Просмотр деталей операции:', operationId);
// console.log('Просмотр деталей операции:', operationId);
}
onMounted(() => {

View File

@@ -497,7 +497,7 @@ async function createProposal() {
alert('✅ Предложение успешно создано!');
} catch (error) {
console.error('Ошибка при создании предложения:', error);
// console.error('Ошибка при создании предложения:', error);
alert('❌ Ошибка при создании предложения: ' + error.message);
} finally {
isCreating.value = false;
@@ -555,7 +555,7 @@ async function voteForProposal(proposalId, support) {
alert('✅ Ваш голос учтен!');
} catch (error) {
console.error('Ошибка при голосовании:', error);
// console.error('Ошибка при голосовании:', error);
alert('❌ Ошибка при голосовании: ' + error.message);
}
}
@@ -570,7 +570,7 @@ async function executeProposal(proposalId) {
alert('✅ Предложение успешно исполнено!');
} catch (error) {
console.error('Ошибка при исполнении предложения:', error);
// console.error('Ошибка при исполнении предложения:', error);
alert('❌ Ошибка при исполнении предложения: ' + error.message);
}
}
@@ -582,7 +582,7 @@ async function loadProposals() {
// Пока используем заглушку
proposals.value = [];
} catch (error) {
console.error('Ошибка при загрузке предложений:', error);
// console.error('Ошибка при загрузке предложений:', error);
}
}
@@ -603,7 +603,7 @@ function resetForm() {
function viewProposalDetails(proposalId) {
// Открыть модальное окно с деталями предложения
console.log('Просмотр деталей предложения:', proposalId);
// console.log('Просмотр деталей предложения:', proposalId);
}
onMounted(() => {

View File

@@ -200,7 +200,7 @@ const createProposal = async () => {
isCreatingProposal.value = true;
// Здесь будет создание предложения в смарт-контракте
console.log('Создание предложения:', newProposal.value);
// console.log('Создание предложения:', newProposal.value);
// Временная логика
const proposal = {
@@ -225,7 +225,7 @@ const createProposal = async () => {
};
} catch (error) {
console.error('Ошибка создания предложения:', error);
// console.error('Ошибка создания предложения:', error);
} finally {
isCreatingProposal.value = false;
}
@@ -238,7 +238,7 @@ const signProposal = async (proposalId) => {
isSigning.value = true;
// Здесь будет подписание предложения в смарт-контракте
console.log('Подписание предложения:', proposalId);
// console.log('Подписание предложения:', proposalId);
const proposal = proposals.value.find(p => p.id === proposalId);
if (proposal) {
@@ -247,7 +247,7 @@ const signProposal = async (proposalId) => {
}
} catch (error) {
console.error('Ошибка подписания предложения:', error);
// console.error('Ошибка подписания предложения:', error);
} finally {
isSigning.value = false;
}
@@ -260,7 +260,7 @@ const executeProposal = async (proposalId) => {
isExecuting.value = true;
// Здесь будет выполнение предложения в смарт-контракте
console.log('Выполнение предложения:', proposalId);
// console.log('Выполнение предложения:', proposalId);
const proposal = proposals.value.find(p => p.id === proposalId);
if (proposal) {
@@ -268,7 +268,7 @@ const executeProposal = async (proposalId) => {
}
} catch (error) {
console.error('Ошибка выполнения предложения:', error);
// console.error('Ошибка выполнения предложения:', error);
} finally {
isExecuting.value = false;
}

View File

@@ -246,7 +246,7 @@ const updateSettings = async () => {
isUpdating.value = true;
// Здесь будет логика обновления настроек в смарт-контракте
console.log('Обновление настроек:', newSettings.value);
// console.log('Обновление настроек:', newSettings.value);
// Временная логика
const change = {
@@ -291,7 +291,7 @@ const updateSettings = async () => {
alert('Настройки успешно обновлены!');
} catch (error) {
console.error('Ошибка обновления настроек:', error);
// console.error('Ошибка обновления настроек:', error);
alert('Ошибка при обновлении настроек');
} finally {
isUpdating.value = false;

View File

@@ -368,7 +368,7 @@ const saveMainSettings = async () => {
isSaving.value = true;
// Здесь будет логика сохранения основных настроек
console.log('Сохранение основных настроек:', mainSettings.value);
// console.log('Сохранение основных настроек:', mainSettings.value);
// Временная логика
await new Promise(resolve => setTimeout(resolve, 1000));
@@ -376,7 +376,7 @@ const saveMainSettings = async () => {
alert('Основные настройки успешно сохранены!');
} catch (error) {
console.error('Ошибка сохранения основных настроек:', error);
// console.error('Ошибка сохранения основных настроек:', error);
alert('Ошибка при сохранении настроек');
} finally {
isSaving.value = false;
@@ -390,7 +390,7 @@ const saveSecuritySettings = async () => {
isSaving.value = true;
// Здесь будет логика сохранения настроек безопасности
console.log('Сохранение настроек безопасности:', securitySettings.value);
// console.log('Сохранение настроек безопасности:', securitySettings.value);
// Временная логика
await new Promise(resolve => setTimeout(resolve, 1000));
@@ -398,7 +398,7 @@ const saveSecuritySettings = async () => {
alert('Настройки безопасности успешно сохранены!');
} catch (error) {
console.error('Ошибка сохранения настроек безопасности:', error);
// console.error('Ошибка сохранения настроек безопасности:', error);
alert('Ошибка при сохранении настроек безопасности');
} finally {
isSaving.value = false;
@@ -412,7 +412,7 @@ const saveNetworkSettings = async () => {
isSaving.value = true;
// Здесь будет логика сохранения настроек сети
console.log('Сохранение настроек сети:', networkSettings.value);
// console.log('Сохранение настроек сети:', networkSettings.value);
// Временная логика
await new Promise(resolve => setTimeout(resolve, 1000));
@@ -420,7 +420,7 @@ const saveNetworkSettings = async () => {
alert('Настройки сети успешно сохранены!');
} catch (error) {
console.error('Ошибка сохранения настроек сети:', error);
// console.error('Ошибка сохранения настроек сети:', error);
alert('Ошибка при сохранении настроек сети');
} finally {
isSaving.value = false;
@@ -463,7 +463,7 @@ const importSettings = (event) => {
alert('Настройки успешно импортированы!');
} catch (error) {
console.error('Ошибка импорта настроек:', error);
// console.error('Ошибка импорта настроек:', error);
alert('Ошибка при импорте настроек');
}
};
@@ -513,7 +513,7 @@ const deleteDLE = () => {
}
// Здесь будет логика удаления DLE
console.log('Удаление DLE...');
// console.log('Удаление DLE...');
alert('DLE будет удален. Это действие может занять некоторое время.');
};
</script>

View File

@@ -245,7 +245,7 @@ const transferTokens = async () => {
isTransferring.value = true;
// Здесь будет логика трансфера токенов
console.log('Трансфер токенов:', transferData.value);
// console.log('Трансфер токенов:', transferData.value);
// Временная логика
const amount = parseFloat(transferData.value.amount);
@@ -266,7 +266,7 @@ const transferTokens = async () => {
alert('Токены успешно переведены!');
} catch (error) {
console.error('Ошибка трансфера токенов:', error);
// console.error('Ошибка трансфера токенов:', error);
alert('Ошибка при переводе токенов');
} finally {
isTransferring.value = false;
@@ -280,7 +280,7 @@ const distributeTokens = async () => {
isDistributing.value = true;
// Здесь будет логика распределения токенов
console.log('Распределение токенов:', distributionData.value);
// console.log('Распределение токенов:', distributionData.value);
// Временная логика
const totalAmount = distributionData.value.recipients.reduce((sum, recipient) => {
@@ -303,7 +303,7 @@ const distributeTokens = async () => {
alert('Токены успешно распределены!');
} catch (error) {
console.error('Ошибка распределения токенов:', error);
// console.error('Ошибка распределения токенов:', error);
alert('Ошибка при распределении токенов');
} finally {
isDistributing.value = false;

View File

@@ -380,7 +380,7 @@ const performDeposit = async () => {
isProcessing.value = true;
// Здесь будет логика депозита
console.log('Депозит:', depositData.value);
// console.log('Депозит:', depositData.value);
// Временная логика
const asset = assets.value.find(a => a.id === depositData.value.asset);
@@ -414,7 +414,7 @@ const performDeposit = async () => {
alert('Депозит успешно выполнен!');
} catch (error) {
console.error('Ошибка депозита:', error);
// console.error('Ошибка депозита:', error);
alert('Ошибка при выполнении депозита');
} finally {
isProcessing.value = false;
@@ -428,7 +428,7 @@ const performWithdraw = async () => {
isProcessing.value = true;
// Здесь будет логика вывода
console.log('Вывод:', withdrawData.value);
// console.log('Вывод:', withdrawData.value);
// Временная логика
const asset = assets.value.find(a => a.id === withdrawData.value.asset);
@@ -469,7 +469,7 @@ const performWithdraw = async () => {
alert('Вывод успешно выполнен!');
} catch (error) {
console.error('Ошибка вывода:', error);
// console.error('Ошибка вывода:', error);
alert('Ошибка при выполнении вывода');
} finally {
isProcessing.value = false;

View File

@@ -350,10 +350,10 @@ app.listen(PORT, 'localhost', () => {
// Обработка необработанных ошибок
process.on('uncaughtException', (error) => {
log.error('Необработанная ошибка: ' + error.message);
console.error(error);
// console.error(error);
});
process.on('unhandledRejection', (reason, promise) => {
log.error('Необработанное отклонение промиса: ' + reason);
console.error(reason);
// console.error(reason);
});