47 lines
1.6 KiB
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())
|
|
)
|
|
);
|