From 2508fc4fd60a62bfb2dba93593345552f0d1573b Mon Sep 17 00:00:00 2001 From: Alex Date: Fri, 12 Dec 2025 15:39:58 +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/services/UniversalGuestService.js | 12 +++-- backend/services/unifiedMessageProcessor.js | 52 +++++++++++++++------ 2 files changed, 46 insertions(+), 18 deletions(-) diff --git a/backend/services/UniversalGuestService.js b/backend/services/UniversalGuestService.js index 3c31c6c..52c2397 100644 --- a/backend/services/UniversalGuestService.js +++ b/backend/services/UniversalGuestService.js @@ -346,11 +346,12 @@ class UniversalGuestService { WHERE user_id IS NULL ) SELECT - MIN(id) as first_message_id, - MIN(metadata) as metadata + id as first_message_id, + metadata FROM decrypted_guest WHERE guest_identifier = $1 AND channel = $3 - GROUP BY guest_identifier, channel`, + ORDER BY id ASC + LIMIT 1`, [identifier, encryptionKey, channel] ); @@ -515,13 +516,14 @@ class UniversalGuestService { const aiResponse = await aiAssistant.generateResponse({ channel: channel, messageId: `guest_${identifier}_${Date.now()}`, - userId: identifier, + userId: null, // Для гостей передаем null, чтобы не использовать identifier как user_id userQuestion: fullMessageContent, conversationHistory: conversationHistory, metadata: { isGuest: true, hasMedia: !!processedContent, - mediaSummary: processedContent?.summary + mediaSummary: processedContent?.summary, + guestIdentifier: identifier // Сохраняем identifier в metadata для логирования } }); diff --git a/backend/services/unifiedMessageProcessor.js b/backend/services/unifiedMessageProcessor.js index 5f3ed00..74e767a 100644 --- a/backend/services/unifiedMessageProcessor.js +++ b/backend/services/unifiedMessageProcessor.js @@ -112,7 +112,37 @@ async function processMessage(messageData) { hasAttachments: attachments.length > 0 }); - // 1. Определяем: гость или пользователь? + // 1. Разбираем идентификатор + const [provider, providerId] = identifier.split(':'); + + // 2. Для telegram/email: автоматически создаем пользователя, если его нет + if ((provider === 'telegram' || provider === 'email') && providerId) { + let user = await identityService.findUserByIdentity(provider, providerId); + + if (!user) { + // Автоматически создаем пользователя для telegram/email при первом сообщении + logger.info(`[UnifiedMessageProcessor] Автоматическое создание пользователя для ${provider}:${providerId}`); + const { ROLES } = require('/app/shared/permissions'); + const db = require('../db'); + + // Создаем нового пользователя с ролью user + const newUserResult = await db.getQuery()('INSERT INTO users (role) VALUES ($1) RETURNING id', [ + ROLES.USER, + ]); + const userId = newUserResult.rows[0].id; + + // Добавляем идентификатор + await identityService.saveIdentity(userId, provider, providerId, true); + + logger.info(`[UnifiedMessageProcessor] Создан пользователь ${userId} для ${provider}:${providerId} с ролью ${ROLES.USER}`); + + // Обновляем список контактов + const { broadcastContactsUpdate } = require('../wsHub'); + broadcastContactsUpdate(); + } + } + + // 3. Определяем: гость или пользователь? const isGuestIdentifier = await checkIfGuest(identifier); if (isGuestIdentifier) { @@ -127,8 +157,7 @@ async function processMessage(messageData) { }); } - // 2. ПОЛЬЗОВАТЕЛЬ: ищем user_id - const [provider, providerId] = identifier.split(':'); + // 4. ПОЛЬЗОВАТЕЛЬ: ищем user_id (теперь он точно должен быть, так как для telegram/email мы его создали) const user = await identityService.findUserByIdentity(provider, providerId); if (!user) { @@ -485,22 +514,19 @@ async function checkIfGuest(identifier) { return true; // Это web гость } - // Проверяем есть ли пользователь с wallet + // Проверяем есть ли пользователь с этим идентификатором (telegram/email/wallet) const user = await identityService.findUserByIdentity(provider, providerId); if (!user) { - return true; // Пользователь не найден - это гость - } - - // Проверяем есть ли у пользователя wallet - const walletIdentity = await identityService.findIdentity(user.id, 'wallet'); - - if (!walletIdentity) { - // Нет кошелька - это временный пользователь, считаем гостем + // Пользователь не найден - это гость + // Исключение: для telegram/email если пользователь не найден, это может быть гость + // Но если он авторизован, он должен быть создан через verifyTelegramAuth/checkEmailVerification return true; } - // Есть кошелек - полноценный пользователь + // Если пользователь найден в БД - это пользователь (независимо от наличия кошелька) + // Telegram/Email пользователи получают роль user даже без кошелька + // Только web-гости без авторизации остаются гостами return false; } catch (error) {