xtablo-source/supabase/migrations/20260411_create_chat_tables.sql

48 lines
1.6 KiB
MySQL
Raw Normal View History

-- supabase/migrations/20260411_create_chat_tables.sql
-- Messages table
CREATE TABLE IF NOT EXISTS messages (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
channel_id text NOT NULL REFERENCES tablos(id) ON DELETE CASCADE,
user_id uuid NOT NULL REFERENCES auth.users(id),
text text NOT NULL,
created_at timestamptz NOT NULL DEFAULT now(),
updated_at timestamptz,
deleted_at timestamptz
);
CREATE INDEX IF NOT EXISTS idx_messages_channel_created ON messages(channel_id, created_at DESC);
-- Read state table
CREATE TABLE IF NOT EXISTS channel_read_state (
user_id uuid NOT NULL REFERENCES auth.users(id),
channel_id text NOT NULL REFERENCES tablos(id) ON DELETE CASCADE,
last_read_at timestamptz NOT NULL DEFAULT now(),
PRIMARY KEY (user_id, channel_id)
);
-- RLS policies
ALTER TABLE messages ENABLE ROW LEVEL SECURITY;
ALTER TABLE channel_read_state ENABLE ROW LEVEL SECURITY;
-- Messages: users can read messages in channels they are members of
CREATE POLICY "Users can read messages in their tablos"
ON messages FOR SELECT
USING (
EXISTS (
SELECT 1 FROM tablo_access
WHERE tablo_access.tablo_id = messages.channel_id
AND tablo_access.user_id = auth.uid()
AND tablo_access.is_active = true
)
);
-- Messages: service role inserts (from chat worker) bypass RLS
-- No INSERT policy needed — the chat worker uses the service role key
-- Read state: users can read/write their own read state
CREATE POLICY "Users can manage their own read state"
ON channel_read_state FOR ALL
USING (user_id = auth.uid())
WITH CHECK (user_id = auth.uid());