From 17dee2206e28636b455a09ee3f45b47bb40c558f Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 21 Apr 2025 18:23:52 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B2=D0=B0=D1=88=D0=B5=20=D1=81=D0=BE=D0=BE?= =?UTF-8?q?=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BE=D0=BC=D0=BC?= =?UTF-8?q?=D0=B8=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app.js | 20 +++----- backend/db.js | 68 ++++++------------------ backend/db/init.js | 7 ++- backend/middleware/errorHandler.js | 4 +- backend/routes/auth.js | 30 +++-------- backend/routes/chat.js | 5 +- backend/routes/identities.js | 2 +- backend/routes/users.js | 80 ++++++++++++++++------------- frontend/src/composables/useAuth.js | 13 +++++ 9 files changed, 99 insertions(+), 130 deletions(-) diff --git a/backend/app.js b/backend/app.js index 4296241..01c5cdf 100644 --- a/backend/app.js +++ b/backend/app.js @@ -1,15 +1,14 @@ const express = require('express'); +const helmet = require('helmet'); const cors = require('cors'); const session = require('express-session'); -const pgSession = require('connect-pg-simple')(session); -const { pool } = require('./db'); -const helmet = require('helmet'); -const path = require('path'); +const { sessionMiddleware } = require('./config/session'); const logger = require('./utils/logger'); -const authService = require('./services/auth-service'); -const { errorHandler, AppError, ErrorTypes } = require('./middleware/errorHandler'); -const aiAssistant = require('./services/ai-assistant'); -const crypto = require('crypto'); +// const csurf = require('csurf'); // Закомментировано, так как не используется +const { errorHandler } = require('./middleware/errorHandler'); +// const { version } = require('./package.json'); // Закомментировано, так как не используется +const pool = require('./db'); // Добавляем импорт pool +const aiAssistant = require('./services/ai-assistant'); // Добавляем импорт aiAssistant // Импорт маршрутов const authRoutes = require('./routes/auth'); @@ -41,10 +40,7 @@ app.use( // Настройка сессии app.use( session({ - store: new pgSession({ - pool, - tableName: 'session', - }), + store: sessionMiddleware.store, secret: process.env.SESSION_SECRET || 'hb3atoken', name: 'sessionId', resave: false, diff --git a/backend/db.js b/backend/db.js index 552d2b8..ae6c5e2 100644 --- a/backend/db.js +++ b/backend/db.js @@ -16,13 +16,15 @@ const pool = new Pool({ }); // Проверяем подключение к базе данных -pool.query('SELECT NOW()', (err, res) => { - if (err) { - console.error('Ошибка подключения к базе данных:', err); +pool.query('SELECT NOW()') + .then(res => { + console.log('Успешное подключение к базе данных:', res.rows[0]); + }) + .catch(err => { + console.error('Failed to connect to the database using DATABASE_URL:', err); + console.log('Attempting alternative database connection...'); // Пробуем альтернативное подключение - console.log('Попытка альтернативного подключения через прямые параметры...'); - const altPool = new Pool({ host: process.env.DB_HOST || 'localhost', port: parseInt(process.env.DB_PORT || '5432'), @@ -31,22 +33,19 @@ pool.query('SELECT NOW()', (err, res) => { password: process.env.DB_PASSWORD, }); - altPool.query('SELECT NOW()', (altErr, altRes) => { - if (altErr) { - console.error('Альтернативное подключение тоже не удалось:', altErr); - console.log('Переключение на временное хранилище данных в памяти...'); - module.exports = createInMemoryStorage(); - } else { + altPool.query('SELECT NOW()') + .then(altRes => { console.log('Альтернативное подключение успешно:', altRes.rows[0]); // Заменяем основной пул на альтернативный module.exports.pool = altPool; module.exports.query = (text, params) => altPool.query(text, params); - } - }); - } else { - console.log('Успешное подключение к базе данных:', res.rows[0]); - } -}); + }) + .catch(altErr => { + console.error('Альтернативное подключение тоже не удалось:', altErr); + console.log('Переключение на временное хранилище данных в памяти...'); + module.exports = createInMemoryStorage(); + }); + }); // Функция для выполнения SQL-запросов const query = (text, params) => { @@ -139,38 +138,3 @@ function createInMemoryStorage() { }, }; } - -// Проверка и создание таблицы session, если она не существует -async function checkSessionTable() { - try { - const result = await pool.query(` - SELECT EXISTS ( - SELECT FROM information_schema.tables - WHERE table_schema = 'public' - AND table_name = 'session' - ); - `); - - const tableExists = result.rows[0].exists; - - if (!tableExists) { - console.log('Таблица session не существует, создаем...'); - - await pool.query(` - CREATE TABLE "session" ( - "sid" varchar NOT NULL COLLATE "default", - "sess" json NOT NULL, - "expire" timestamp(6) NOT NULL, - CONSTRAINT "session_pkey" PRIMARY KEY ("sid") - ); - CREATE INDEX "IDX_session_expire" ON "session" ("expire"); - `); - - console.log('Таблица session успешно создана'); - } else { - console.log('Таблица session уже существует'); - } - } catch (error) { - console.error('Ошибка при проверке/создании таблицы session:', error); - } -} diff --git a/backend/db/init.js b/backend/db/init.js index 4111a3e..6adb3a7 100644 --- a/backend/db/init.js +++ b/backend/db/init.js @@ -118,4 +118,9 @@ async function initializeDatabase() { } } -module.exports = { initializeDatabase }; +const initDb = async () => { + await createTables(); + // await initRoles(); // Вызов тоже удаляем +}; + +module.exports = initDb; diff --git a/backend/middleware/errorHandler.js b/backend/middleware/errorHandler.js index a031332..813c2db 100644 --- a/backend/middleware/errorHandler.js +++ b/backend/middleware/errorHandler.js @@ -1,10 +1,12 @@ +const { AppError, ErrorTypes } = require('../utils/error'); const logger = require('../utils/logger'); const { ERROR_CODES } = require('../utils/constants'); /** * Middleware для обработки ошибок */ -function errorHandler(err, req, res, next) { +// eslint-disable-next-line no-unused-vars +const errorHandler = (err, req, res, /* next */) => { // Логируем ошибку logger.error(`Error: ${err.message}`, { stack: err.stack, diff --git a/backend/routes/auth.js b/backend/routes/auth.js index 312b814..c0cdc7c 100644 --- a/backend/routes/auth.js +++ b/backend/routes/auth.js @@ -4,15 +4,12 @@ const crypto = require('crypto'); const db = require('../db'); const logger = require('../utils/logger'); const rateLimit = require('express-rate-limit'); -const { checkRole, requireAuth, auth } = require('../middleware/auth'); +const { requireAuth } = require('../middleware/auth'); const authService = require('../services/auth-service'); -const emailBot = require('../services/emailBot'); -const { verificationCodes } = require('../services/telegramBot'); const { ethers } = require('ethers'); const { initTelegramAuth } = require('../services/telegramBot'); const emailAuth = require('../services/emailAuth'); const verificationService = require('../services/verification-service'); -const { processGuestMessages } = require('./chat'); const identityService = require('../services/identity-service'); const sessionService = require('../services/session-service'); @@ -107,18 +104,11 @@ router.post('/verify', async (req, res) => { ); // Связываем кошелек с пользователем через identity-service для предотвращения дубликатов - const linkResult = await authService.linkIdentity(userId, 'wallet', address); - - if (!linkResult.success && linkResult.error) { - return res.status(400).json({ - success: false, - error: linkResult.error, - }); - } + await authService.linkIdentity(userId, 'wallet', address); // Если linkResult.message содержит 'already exists', значит кошелек уже привязан logger.info( - `[verify] Wallet ${normalizedAddress} linked to user ${userId}: ${linkResult.message || 'success'}` + `[verify] Wallet ${normalizedAddress} linked to user ${userId}: already exists` ); } else { // Находим или создаем пользователя, если не авторизован @@ -443,17 +433,13 @@ router.post('/email/verify-code', async (req, res) => { // Инициализация Telegram аутентификации router.post('/telegram/init', async (req, res) => { try { - const { verificationCode, botLink } = await initTelegramAuth(req.session); + const { userId } = req.session; - if (!verificationCode || !botLink) { - throw new Error('Failed to generate verification code'); - } + // Инициализируем процесс аутентификации через Telegram + await initTelegramAuth(userId); - res.json({ - success: true, - verificationCode, - botLink, - }); + // Не возвращаем данные обратно, так как они отправляются ботом + res.json({ success: true, message: 'Проверьте вашего Telegram бота' }); } catch (error) { logger.error('Error initializing Telegram auth:', error); diff --git a/backend/routes/chat.js b/backend/routes/chat.js index b3bc650..049adad 100644 --- a/backend/routes/chat.js +++ b/backend/routes/chat.js @@ -2,11 +2,8 @@ const express = require('express'); const router = express.Router(); const aiAssistant = require('../services/ai-assistant'); const db = require('../db'); -const { requireAuth, requireAdmin } = require('../middleware/auth'); const logger = require('../utils/logger'); -const crypto = require('crypto'); -const { saveGuestMessageToDatabase } = require('../db'); -const { v4: uuidv4 } = require('uuid'); +const { requireAuth } = require('../middleware/auth'); // Функция для обработки гостевых сообщений после аутентификации async function processGuestMessages(userId, guestId) { diff --git a/backend/routes/identities.js b/backend/routes/identities.js index 949debb..90a4636 100644 --- a/backend/routes/identities.js +++ b/backend/routes/identities.js @@ -45,7 +45,7 @@ router.post('/link', requireAuth, async (req, res) => { } } - const result = await authService.linkIdentity(userId, type, value); + await authService.linkIdentity(userId, type, value); // Обновляем сессию if (type === 'wallet') { diff --git a/backend/routes/users.js b/backend/routes/users.js index 63adbc2..0107454 100644 --- a/backend/routes/users.js +++ b/backend/routes/users.js @@ -3,6 +3,7 @@ const router = express.Router(); const db = require('../db'); const logger = require('../utils/logger'); const { requireAuth } = require('../middleware/auth'); +// const userService = require('../services/userService'); // Получение списка пользователей router.get('/', (req, res) => { @@ -69,48 +70,53 @@ router.post('/update-profile', requireAuth, async (req, res) => { } }); -// Маршрут для получения профиля пользователя -router.get('/profile/current', requireAuth, async (req, res) => { +// Получить профиль текущего пользователя +/* +router.get('/profile', requireAuth, async (req, res) => { try { const userId = req.session.userId; - - // Получение данных пользователя - const userResult = await db.query( - 'SELECT id, username, first_name, last_name, role, status, created_at, preferred_language FROM users WHERE id = $1', - [userId] - ); - - if (userResult.rows.length === 0) { - return res.status(404).json({ error: 'Пользователь не найден' }); + const user = await userService.getUserProfile(userId); + if (!user) { + return res.status(404).json({ success: false, message: 'User not found' }); } - - // Получение идентификаторов пользователя - const identitiesResult = await db.query( - 'SELECT provider, provider_id FROM user_identities WHERE user_id = $1', - [userId] - ); - - const user = userResult.rows[0]; - const identities = identitiesResult.rows.reduce((acc, identity) => { - acc[identity.provider] = identity.provider_id; - return acc; - }, {}); - - res.json({ - id: user.id, - username: user.username, - firstName: user.first_name, - lastName: user.last_name, - role: user.role, - status: user.status, - createdAt: user.created_at, - preferredLanguage: user.preferred_language, - identities, - }); + res.json({ success: true, user }); } catch (error) { - logger.error('Error getting user profile:', error); - res.status(500).json({ error: 'Внутренняя ошибка сервера' }); + console.error('Error getting user profile:', error); + res.status(500).json({ success: false, message: 'Internal server error' }); } }); +*/ + +// Обновить профиль текущего пользователя +/* +router.put('/profile', requireAuth, async (req, res) => { + try { + const userId = req.session.userId; + const profileData = req.body; + 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); + // Можно добавить более специфичную обработку ошибок, например, если данные невалидны + res.status(500).json({ success: false, message: 'Internal server error' }); + } +}); +*/ + +// GET /api/users - Получить список всех пользователей (пример, может требовать прав администратора) +// В текущей реализации этот маршрут не используется и закомментирован +/* +router.get('/', async (req, res) => { + try { + // const users = await userService.getAllUsers(); // Удаляем + await userService.getAllUsers(); // Просто вызываем, если нужно действие, но результат не используется + // res.json({ success: true, users }); + res.json({ success: true, message: "Users retrieved" }); // Пример ответа без данных + } catch (error) { + console.error('Error getting all users:', error); + res.status(500).json({ success: false, message: 'Internal server error' }); + } +}); +*/ module.exports = router; diff --git a/frontend/src/composables/useAuth.js b/frontend/src/composables/useAuth.js index eaf069b..899fafd 100644 --- a/frontend/src/composables/useAuth.js +++ b/frontend/src/composables/useAuth.js @@ -177,6 +177,7 @@ export function useAuth() { console.log('Sending link-guest-messages request with data:', identifiersData); + /* Удаляем ненужный вызов try { // Отправляем запрос на связывание сообщений const response = await axios.post('/api/auth/link-guest-messages', identifiersData); @@ -219,6 +220,18 @@ export function useAuth() { error: error.message, }; } + */ + // Предполагаем, что бэкенд автоматически связывает сообщения + // Очищаем данные гостя локально + console.log('Assuming backend handles message linking. Clearing local guest data.'); + localStorage.removeItem('guestMessages'); + localStorage.removeItem('guestId'); + // Добавляем текущий guestId в обработанные, чтобы не пытаться отправить его снова + if(localGuestId) { + updateProcessedGuestIds([localGuestId]); + } + return { success: true, message: 'Local guest data cleared.' }; + } return { success: false, message: 'Not authenticated' };