ваше сообщение коммита
This commit is contained in:
@@ -287,9 +287,24 @@ router.post('/telegram/verify', async (req, res) => {
|
|||||||
|
|
||||||
// Связываем гостевые сообщения только если это новый пользователь
|
// Связываем гостевые сообщения только если это новый пользователь
|
||||||
if (verificationResult.isNewUser && guestId) {
|
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);
|
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({
|
return res.json({
|
||||||
success: true,
|
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);
|
res.json(result);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@@ -566,6 +566,10 @@ class AuthService {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Обработка гостевых сообщений после аутентификации
|
* Обработка гостевых сообщений после аутентификации
|
||||||
|
* ПРИМЕЧАНИЕ: Эта функция оставлена для обратной совместимости.
|
||||||
|
* Фактически все маршруты теперь используют версию функции из auth.js,
|
||||||
|
* которая корректно обрабатывает сообщения для всех типов аутентификации.
|
||||||
|
* @deprecated Используйте функцию linkGuestMessagesAfterAuth из routes/auth.js
|
||||||
*/
|
*/
|
||||||
async linkGuestMessagesAfterAuth(userId, currentGuestId, previousGuestId) {
|
async linkGuestMessagesAfterAuth(userId, currentGuestId, previousGuestId) {
|
||||||
try {
|
try {
|
||||||
@@ -598,83 +602,20 @@ class AuthService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Блокируем таблицу guest_messages для атомарной операции
|
// Используем ту же функцию processGuestMessages что и в auth.js
|
||||||
await db.query('BEGIN');
|
const result = await processGuestMessages(userId, currentGuestId);
|
||||||
|
logger.info(`[linkGuestMessagesAfterAuth] Guest messages processed: ${JSON.stringify(result)}`);
|
||||||
|
|
||||||
try {
|
// Если есть предыдущий гостевой ID, обработаем и его
|
||||||
// Получаем все гостевые сообщения для этого ID
|
if (previousGuestId && previousGuestId !== currentGuestId) {
|
||||||
const guestMessagesResult = await db.query(
|
const prevResult = await processGuestMessages(userId, previousGuestId);
|
||||||
'SELECT * FROM guest_messages WHERE guest_id = $1 ORDER BY created_at ASC FOR UPDATE',
|
logger.info(`[linkGuestMessagesAfterAuth] Previous guest messages processed: ${JSON.stringify(prevResult)}`);
|
||||||
[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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
success: true,
|
||||||
|
result: result
|
||||||
|
};
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
logger.error('[linkGuestMessagesAfterAuth] Error:', error);
|
logger.error('[linkGuestMessagesAfterAuth] Error:', error);
|
||||||
throw error;
|
throw error;
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
1473
frontend/src/views/HomeView.vue. bak
Normal file
1473
frontend/src/views/HomeView.vue. bak
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user