tasq/supabase/migrations/20260306090100_chat_messages.sql

47 lines
1.6 KiB
SQL

-- Chat messages for swap request bargaining
CREATE TABLE IF NOT EXISTS chat_messages (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
thread_id uuid NOT NULL,
sender_id uuid NOT NULL REFERENCES auth.users(id),
body text NOT NULL,
created_at timestamptz NOT NULL DEFAULT now()
);
CREATE INDEX idx_chat_messages_thread ON chat_messages (thread_id, created_at);
-- Auto-generate chat_thread_id on swap_requests if null
ALTER TABLE swap_requests ALTER COLUMN chat_thread_id SET DEFAULT gen_random_uuid();
-- Backfill existing swap_requests that have no chat_thread_id
UPDATE swap_requests SET chat_thread_id = gen_random_uuid() WHERE chat_thread_id IS NULL;
-- Enable realtime
ALTER PUBLICATION supabase_realtime ADD TABLE chat_messages;
-- RLS
ALTER TABLE chat_messages ENABLE ROW LEVEL SECURITY;
-- Users can read messages for swap requests where they are requester or recipient
CREATE POLICY "chat_messages_select" ON chat_messages FOR SELECT TO authenticated
USING (
EXISTS (
SELECT 1 FROM swap_requests sr
WHERE sr.chat_thread_id = chat_messages.thread_id
AND (sr.requester_id = auth.uid() OR sr.recipient_id = auth.uid())
)
OR EXISTS (
SELECT 1 FROM profiles p WHERE p.id = auth.uid() AND p.role IN ('admin', 'dispatcher')
)
);
-- Users can insert messages for swap requests where they are requester or recipient
CREATE POLICY "chat_messages_insert" ON chat_messages FOR INSERT TO authenticated
WITH CHECK (
sender_id = auth.uid()
AND EXISTS (
SELECT 1 FROM swap_requests sr
WHERE sr.chat_thread_id = chat_messages.thread_id
AND (sr.requester_id = auth.uid() OR sr.recipient_id = auth.uid())
)
);