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

This commit is contained in:
2025-12-12 15:39:58 +03:00
parent ef60b1c457
commit 2508fc4fd6
2 changed files with 46 additions and 18 deletions

View File

@@ -346,11 +346,12 @@ class UniversalGuestService {
WHERE user_id IS NULL WHERE user_id IS NULL
) )
SELECT SELECT
MIN(id) as first_message_id, id as first_message_id,
MIN(metadata) as metadata metadata
FROM decrypted_guest FROM decrypted_guest
WHERE guest_identifier = $1 AND channel = $3 WHERE guest_identifier = $1 AND channel = $3
GROUP BY guest_identifier, channel`, ORDER BY id ASC
LIMIT 1`,
[identifier, encryptionKey, channel] [identifier, encryptionKey, channel]
); );
@@ -515,13 +516,14 @@ class UniversalGuestService {
const aiResponse = await aiAssistant.generateResponse({ const aiResponse = await aiAssistant.generateResponse({
channel: channel, channel: channel,
messageId: `guest_${identifier}_${Date.now()}`, messageId: `guest_${identifier}_${Date.now()}`,
userId: identifier, userId: null, // Для гостей передаем null, чтобы не использовать identifier как user_id
userQuestion: fullMessageContent, userQuestion: fullMessageContent,
conversationHistory: conversationHistory, conversationHistory: conversationHistory,
metadata: { metadata: {
isGuest: true, isGuest: true,
hasMedia: !!processedContent, hasMedia: !!processedContent,
mediaSummary: processedContent?.summary mediaSummary: processedContent?.summary,
guestIdentifier: identifier // Сохраняем identifier в metadata для логирования
} }
}); });

View File

@@ -112,7 +112,37 @@ async function processMessage(messageData) {
hasAttachments: attachments.length > 0 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); const isGuestIdentifier = await checkIfGuest(identifier);
if (isGuestIdentifier) { if (isGuestIdentifier) {
@@ -127,8 +157,7 @@ async function processMessage(messageData) {
}); });
} }
// 2. ПОЛЬЗОВАТЕЛЬ: ищем user_id // 4. ПОЛЬЗОВАТЕЛЬ: ищем user_id (теперь он точно должен быть, так как для telegram/email мы его создали)
const [provider, providerId] = identifier.split(':');
const user = await identityService.findUserByIdentity(provider, providerId); const user = await identityService.findUserByIdentity(provider, providerId);
if (!user) { if (!user) {
@@ -485,22 +514,19 @@ async function checkIfGuest(identifier) {
return true; // Это web гость return true; // Это web гость
} }
// Проверяем есть ли пользователь с wallet // Проверяем есть ли пользователь с этим идентификатором (telegram/email/wallet)
const user = await identityService.findUserByIdentity(provider, providerId); const user = await identityService.findUserByIdentity(provider, providerId);
if (!user) { if (!user) {
return true; // Пользователь не найден - это гость // Пользователь не найден - это гость
} // Исключение: для telegram/email если пользователь не найден, это может быть гость
// Но если он авторизован, он должен быть создан через verifyTelegramAuth/checkEmailVerification
// Проверяем есть ли у пользователя wallet
const walletIdentity = await identityService.findIdentity(user.id, 'wallet');
if (!walletIdentity) {
// Нет кошелька - это временный пользователь, считаем гостем
return true; return true;
} }
// Есть кошелек - полноценный пользователь // Если пользователь найден в БД - это пользователь (независимо от наличия кошелька)
// Telegram/Email пользователи получают роль user даже без кошелька
// Только web-гости без авторизации остаются гостами
return false; return false;
} catch (error) { } catch (error) {