From 9b8a90744bfd6959540130bdc1bc71988acada10 Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 14 Apr 2025 11:58:37 +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/routes/auth.js | 30 +- backend/services/auth-service.js | 91 +- frontend/src/views/HomeView.vue | 1609 +++++++++++++------------- frontend/src/views/HomeView.vue. bak | 1473 +++++++++++++++++++++++ 4 files changed, 2349 insertions(+), 854 deletions(-) create mode 100644 frontend/src/views/HomeView.vue. bak diff --git a/backend/routes/auth.js b/backend/routes/auth.js index 5af6085..cdbe87f 100644 --- a/backend/routes/auth.js +++ b/backend/routes/auth.js @@ -287,9 +287,24 @@ router.post('/telegram/verify', async (req, res) => { // Связываем гостевые сообщения только если это новый пользователь if (verificationResult.isNewUser && guestId) { - const linkResults = await authService.linkGuestMessagesAfterAuth(verificationResult.userId, guestId); + // Создаем объект сессии для совместимости с другими методами аутентификации + const session = { + guestId: guestId, + save: async (callback) => { + if (typeof callback === 'function') { + callback(null); + } + return Promise.resolve(); + } + }; + const linkResults = await linkGuestMessagesAfterAuth(session, verificationResult.userId); logger.info(`[telegram/verify] Guest messages linking results for new user:`, linkResults); } + // Если пользователь не новый, но есть гостевой ID, все равно связываем сообщения + else if (!verificationResult.isNewUser && guestId) { + const linkResults = await linkGuestMessagesAfterAuth(req.session, verificationResult.userId); + logger.info(`[telegram/verify] Guest messages linking results for existing user:`, linkResults); + } return res.json({ success: true, @@ -1814,7 +1829,18 @@ router.post('/link-guest-messages', requireAuth, async (req, res) => { }); } - const result = await authService.linkGuestMessagesAfterAuth(userId, currentGuestId); + // Создаем временную сессию для совместимости + const tempSession = { + guestId: currentGuestId, + save: async (callback) => { + if (typeof callback === 'function') { + callback(null); + } + return Promise.resolve(); + } + }; + + const result = await linkGuestMessagesAfterAuth(tempSession, userId); res.json(result); } catch (error) { diff --git a/backend/services/auth-service.js b/backend/services/auth-service.js index cd52df0..d3b9c84 100644 --- a/backend/services/auth-service.js +++ b/backend/services/auth-service.js @@ -566,6 +566,10 @@ class AuthService { /** * Обработка гостевых сообщений после аутентификации + * ПРИМЕЧАНИЕ: Эта функция оставлена для обратной совместимости. + * Фактически все маршруты теперь используют версию функции из auth.js, + * которая корректно обрабатывает сообщения для всех типов аутентификации. + * @deprecated Используйте функцию linkGuestMessagesAfterAuth из routes/auth.js */ async linkGuestMessagesAfterAuth(userId, currentGuestId, previousGuestId) { try { @@ -598,83 +602,20 @@ class AuthService { } } - // Блокируем таблицу guest_messages для атомарной операции - await db.query('BEGIN'); + // Используем ту же функцию processGuestMessages что и в auth.js + const result = await processGuestMessages(userId, currentGuestId); + logger.info(`[linkGuestMessagesAfterAuth] Guest messages processed: ${JSON.stringify(result)}`); - try { - // Получаем все гостевые сообщения для этого ID - const guestMessagesResult = await db.query( - 'SELECT * FROM guest_messages WHERE guest_id = $1 ORDER BY created_at ASC FOR UPDATE', - [currentGuestId] - ); - - if (guestMessagesResult.rows.length === 0) { - await db.query('COMMIT'); - logger.info(`[linkGuestMessagesAfterAuth] No messages found for guest ID ${currentGuestId}`); - return { success: true, message: 'No messages found' }; - } - - const guestMessages = guestMessagesResult.rows; - logger.info(`[linkGuestMessagesAfterAuth] Found ${guestMessages.length} messages for guest ID ${currentGuestId}`); - - // Создаем одну беседу для всех сообщений этого гостевого ID - const firstMessage = guestMessages[0]; - const title = firstMessage.content.length > 30 - ? `${firstMessage.content.substring(0, 30)}...` - : firstMessage.content; - - const newConversationResult = await db.query( - 'INSERT INTO conversations (user_id, title) VALUES ($1, $2) RETURNING *', - [userId, title] - ); - - const conversation = newConversationResult.rows[0]; - logger.info(`[linkGuestMessagesAfterAuth] Created conversation ${conversation.id} for user ${userId}`); - - // Переносим все сообщения в новую беседу - for (const guestMessage of guestMessages) { - await db.query( - `INSERT INTO messages - (conversation_id, content, sender_type, role, channel, guest_message_id, created_at, user_id) - VALUES - ($1, $2, $3, $4, $5, $6, $7, $8)`, - [ - conversation.id, - guestMessage.content, - guestMessage.is_ai ? 'assistant' : 'user', - guestMessage.is_ai ? 'assistant' : 'user', - 'web', - guestMessage.id, - guestMessage.created_at, - userId - ] - ); - } - - // Удаляем обработанные гостевые сообщения - await db.query('DELETE FROM guest_messages WHERE guest_id = $1', [currentGuestId]); - - // Удаляем гостевой идентификатор - await db.query( - 'DELETE FROM user_identities WHERE user_id = $1 AND provider = $2 AND provider_id = $3', - [userId, 'guest', currentGuestId] - ); - - await db.query('COMMIT'); - logger.info(`[linkGuestMessagesAfterAuth] Successfully processed guest ID ${currentGuestId}`); - - return { - success: true, - result: { - conversationId: conversation.id, - message: `Processed ${guestMessages.length} guest messages`, - success: true - } - }; - } catch (error) { - await db.query('ROLLBACK'); - throw error; + // Если есть предыдущий гостевой ID, обработаем и его + if (previousGuestId && previousGuestId !== currentGuestId) { + const prevResult = await processGuestMessages(userId, previousGuestId); + logger.info(`[linkGuestMessagesAfterAuth] Previous guest messages processed: ${JSON.stringify(prevResult)}`); } + + return { + success: true, + result: result + }; } catch (error) { logger.error('[linkGuestMessagesAfterAuth] Error:', error); throw error; diff --git a/frontend/src/views/HomeView.vue b/frontend/src/views/HomeView.vue index f4e5fa0..0987424 100644 --- a/frontend/src/views/HomeView.vue +++ b/frontend/src/views/HomeView.vue @@ -74,67 +74,67 @@

Авторизация через:

-
+
-
+
Код верификации: - {{ telegramVerificationCode }} + {{ telegramAuth.verificationCode }} Скопировано!
- Открыть бота Telegram + Открыть бота Telegram
-
- {{ telegramError }} - +
+ {{ telegramAuth.error }} +
-
+
-