sipher/supabase/sql_snippets/Get Thread Details.sql
Nixyi 8b27c6b140 Stable Release (I think)
Added all SQL scripts by using a python script to fetch them.

Also added a "About" page and a skeleton to the chat page.

Fixed the register function that was not setting the public_key on the database
2024-12-18 16:08:06 -03:00

1 line
No EOL
1.8 KiB
PL/PgSQL

CREATE OR REPLACE FUNCTION public.get_thread(thread_uuid UUID, user_id UUID)
RETURNS TABLE (
thread_id UUID,
participants TEXT[],
participant_suuids TEXT[],
messages JSON[]
) AS $$
BEGIN
IF NOT EXISTS (
SELECT 1
FROM public.thread_participants tp
WHERE tp.thread_id = thread_uuid
AND tp.user_uuid = user_id
) THEN
RETURN;
END IF;
RETURN QUERY
WITH thread_info AS (
-- Get thread participants info first
SELECT
mt.id as tid,
array_agg(DISTINCT u.username) as usernames,
array_agg(DISTINCT u.suuid::TEXT) as suuids
FROM public.message_threads mt
JOIN public.thread_participants tp ON mt.id = tp.thread_id
JOIN public.users u ON tp.user_uuid = u.uuid
WHERE mt.id = thread_uuid
GROUP BY mt.id
),
messages_info AS (
-- Get messages separately
SELECT
m.thread_id,
array_agg(
json_build_object(
'id', m.id,
'content', CASE
WHEN m.sender_uuid = user_id THEN m.sender_content
ELSE m.recipient_content
END,
'sender_uuid', m.sender_uuid,
'created_at', m.created_at
)
ORDER BY m.created_at ASC -- Add ordering here
) FILTER (WHERE m.id IS NOT NULL) as msg_array
FROM public.messages m
WHERE m.thread_id = thread_uuid
GROUP BY m.thread_id
)
SELECT
t.tid,
t.usernames,
t.suuids,
COALESCE(m.msg_array, ARRAY[]::JSON[])
FROM thread_info t
LEFT JOIN messages_info m ON t.tid = m.thread_id;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;