Files
DLE/backend/db/migrations/functions/link_guest_messages.sql

87 lines
2.8 KiB
PL/PgSQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

CREATE OR REPLACE FUNCTION link_guest_messages(
p_user_id INTEGER,
p_guest_id VARCHAR(255)
) RETURNS VOID AS $$
DECLARE
v_conversation_id INTEGER;
v_count INTEGER;
v_first_message TEXT;
v_title TEXT;
BEGIN
-- Логируем входные параметры
RAISE NOTICE 'Linking messages for user_id: %, guest_id: %', p_user_id, p_guest_id;
-- Проверяем наличие гостевых сообщений
SELECT COUNT(*) INTO v_count
FROM guest_messages
WHERE guest_id = p_guest_id;
RAISE NOTICE 'Found % guest messages', v_count;
-- Если нет гостевых сообщений, выходим
IF v_count = 0 THEN
RAISE NOTICE 'No guest messages found, exiting';
RETURN;
END IF;
-- Получаем первое сообщение для названия беседы
SELECT content INTO v_first_message
FROM guest_messages
WHERE guest_id = p_guest_id AND NOT is_ai
ORDER BY created_at ASC
LIMIT 1;
-- Формируем название диалога на основе первого сообщения
v_title := CASE
WHEN length(v_first_message) > 30 THEN substring(v_first_message from 1 for 30) || '...'
ELSE v_first_message
END;
-- Создаем новую беседу
INSERT INTO conversations (user_id, title, created_at, updated_at)
VALUES (p_user_id, v_title, NOW(), NOW())
RETURNING id INTO v_conversation_id;
RAISE NOTICE 'Created conversation with id: % and title: %', v_conversation_id, v_title;
-- Копируем сообщения пользователя
WITH inserted_messages AS (
INSERT INTO messages (
conversation_id,
sender_type,
sender_id,
content,
role,
channel,
user_id,
created_at
)
SELECT
v_conversation_id,
CASE WHEN is_ai THEN 'assistant' ELSE 'user' END,
CASE WHEN NOT is_ai THEN p_user_id ELSE NULL END,
content,
CASE WHEN is_ai THEN 'assistant' ELSE 'user' END,
'chat',
p_user_id,
created_at
FROM guest_messages
WHERE guest_id = p_guest_id
-- Проверка, чтобы избежать дублирования сообщений на основе содержимого и времени
AND NOT EXISTS (
SELECT 1 FROM messages m
WHERE m.conversation_id = v_conversation_id
AND m.content = guest_messages.content
AND m.created_at = guest_messages.created_at
)
ORDER BY created_at
RETURNING id
)
SELECT COUNT(*) INTO v_count FROM inserted_messages;
RAISE NOTICE 'Inserted % messages into conversation', v_count;
-- НЕ удаляем гостевые сообщения, позволяем им существовать на всякий случай
-- до автоматической очистки по cron job
END;
$$ LANGUAGE plpgsql;