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