56 lines
1.6 KiB
PL/PgSQL
56 lines
1.6 KiB
PL/PgSQL
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;
|
||
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;
|
||
|
||
-- Создаем новую беседу
|
||
INSERT INTO conversations (user_id, created_at, updated_at)
|
||
VALUES (p_user_id, NOW(), NOW())
|
||
RETURNING id INTO v_conversation_id;
|
||
|
||
RAISE NOTICE 'Created conversation with id: %', v_conversation_id;
|
||
|
||
-- Копируем сообщения пользователя
|
||
WITH inserted_messages AS (
|
||
INSERT INTO messages (
|
||
conversation_id,
|
||
sender_type,
|
||
sender_id,
|
||
content,
|
||
role,
|
||
channel,
|
||
guest_message_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',
|
||
id, -- Сохраняем связь с гостевым сообщением
|
||
created_at
|
||
FROM guest_messages
|
||
WHERE guest_id = p_guest_id
|
||
ORDER BY created_at
|
||
RETURNING id
|
||
)
|
||
SELECT COUNT(*) INTO v_count FROM inserted_messages;
|
||
|
||
RAISE NOTICE 'Inserted % messages', v_count;
|
||
END;
|
||
$$ LANGUAGE plpgsql; |