|
|
|
@@ -0,0 +1,114 @@
|
|
|
|
|
-- Project RiverTalk: Core Database Schema
|
|
|
|
|
|
|
|
|
|
-- Enable UUID extension
|
|
|
|
|
create extension if not exists "uuid-ossp";
|
|
|
|
|
|
|
|
|
|
-- 1. Users Profile Table (Extends Supabase Auth Auth.users)
|
|
|
|
|
create table public.users (
|
|
|
|
|
id uuid references auth.users not null primary key,
|
|
|
|
|
name text,
|
|
|
|
|
email text,
|
|
|
|
|
language_preference text default 'en' check (language_preference in ('en', 'es')),
|
|
|
|
|
voice_clone_id text,
|
|
|
|
|
created_at timestamp with time zone default timezone('utc'::text, now()) not null
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
-- Row Level Security (RLS) for Users
|
|
|
|
|
alter table public.users enable row level security;
|
|
|
|
|
create policy "Public profiles are viewable by everyone." on users for select using (true);
|
|
|
|
|
create policy "Users can insert their own profile." on users for insert with check ((select auth.uid()) = id);
|
|
|
|
|
create policy "Users can update own profile." on users for update using ((select auth.uid()) = id);
|
|
|
|
|
|
|
|
|
|
-- 2. Categories (Level 1)
|
|
|
|
|
create table public.categories (
|
|
|
|
|
id uuid default uuid_generate_v4() primary key,
|
|
|
|
|
name text not null,
|
|
|
|
|
type text check (type in ('dm', 'job', 'office')),
|
|
|
|
|
created_at timestamp with time zone default timezone('utc'::text, now()) not null
|
|
|
|
|
);
|
|
|
|
|
alter table public.categories enable row level security;
|
|
|
|
|
create policy "Categories are viewable by everyone." on categories for select using (true);
|
|
|
|
|
|
|
|
|
|
-- 3. Chats (Level 2)
|
|
|
|
|
create table public.chats (
|
|
|
|
|
id uuid default uuid_generate_v4() primary key,
|
|
|
|
|
category_id uuid references public.categories(id) on delete cascade not null,
|
|
|
|
|
name text not null,
|
|
|
|
|
created_at timestamp with time zone default timezone('utc'::text, now()) not null
|
|
|
|
|
);
|
|
|
|
|
alter table public.chats enable row level security;
|
|
|
|
|
create policy "Chats are viewable by everyone." on chats for select using (true);
|
|
|
|
|
|
|
|
|
|
-- 4. Chat Members (Access Control)
|
|
|
|
|
create table public.chat_members (
|
|
|
|
|
user_id uuid references public.users(id) on delete cascade not null,
|
|
|
|
|
chat_id uuid references public.chats(id) on delete cascade not null,
|
|
|
|
|
role text default 'member' check (role in ('admin', 'member')),
|
|
|
|
|
joined_at timestamp with time zone default timezone('utc'::text, now()) not null,
|
|
|
|
|
primary key (user_id, chat_id)
|
|
|
|
|
);
|
|
|
|
|
alter table public.chat_members enable row level security;
|
|
|
|
|
create policy "Members can view members of their chats." on chat_members for select using (
|
|
|
|
|
exists (select 1 from public.chat_members cm where cm.chat_id = chat_members.chat_id and cm.user_id = (select auth.uid()))
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
-- 5. Sub-Chats (Level 3)
|
|
|
|
|
create table public.sub_chats (
|
|
|
|
|
id uuid default uuid_generate_v4() primary key,
|
|
|
|
|
chat_id uuid references public.chats(id) on delete cascade not null,
|
|
|
|
|
name text not null,
|
|
|
|
|
created_at timestamp with time zone default timezone('utc'::text, now()) not null
|
|
|
|
|
);
|
|
|
|
|
alter table public.sub_chats enable row level security;
|
|
|
|
|
create policy "Sub-chats viewable by chat members." on sub_chats for select using (
|
|
|
|
|
exists (select 1 from public.chat_members cm where cm.chat_id = sub_chats.chat_id and cm.user_id = (select auth.uid()))
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
-- 6. Threads (Level 4)
|
|
|
|
|
create table public.threads (
|
|
|
|
|
id uuid default uuid_generate_v4() primary key,
|
|
|
|
|
parent_id uuid not null, -- Can be chat_id or sub_chat_id
|
|
|
|
|
title text,
|
|
|
|
|
created_at timestamp with time zone default timezone('utc'::text, now()) not null
|
|
|
|
|
);
|
|
|
|
|
alter table public.threads enable row level security;
|
|
|
|
|
create policy "Threads viewable by authenticated users." on threads for select using ((select auth.role()) = 'authenticated');
|
|
|
|
|
|
|
|
|
|
-- 7. Messages
|
|
|
|
|
create table public.messages (
|
|
|
|
|
id uuid default uuid_generate_v4() primary key,
|
|
|
|
|
user_id uuid references public.users(id) on delete set null,
|
|
|
|
|
thread_id uuid references public.threads(id) on delete cascade,
|
|
|
|
|
sub_chat_id uuid references public.sub_chats(id) on delete cascade,
|
|
|
|
|
chat_id uuid references public.chats(id) on delete cascade not null,
|
|
|
|
|
type text default 'text' check (type in ('text', 'audio', 'media', 'pdf')),
|
|
|
|
|
original_language text default 'en',
|
|
|
|
|
content text,
|
|
|
|
|
content_en text,
|
|
|
|
|
media_url text,
|
|
|
|
|
media_url_en text,
|
|
|
|
|
created_at timestamp with time zone default timezone('utc'::text, now()) not null
|
|
|
|
|
);
|
|
|
|
|
alter table public.messages enable row level security;
|
|
|
|
|
create policy "Messages viewable by chat members." on messages for select using (
|
|
|
|
|
exists (select 1 from public.chat_members cm where cm.chat_id = messages.chat_id and cm.user_id = (select auth.uid()))
|
|
|
|
|
);
|
|
|
|
|
create policy "Members can insert messages." on messages for insert with check (
|
|
|
|
|
(select auth.uid()) = user_id and
|
|
|
|
|
exists (select 1 from public.chat_members cm where cm.chat_id = messages.chat_id and cm.user_id = (select auth.uid()))
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
-- 8. Audio Metadata
|
|
|
|
|
create table public.audio_metadata (
|
|
|
|
|
message_id uuid references public.messages(id) on delete cascade primary key,
|
|
|
|
|
duration numeric,
|
|
|
|
|
waveform_data jsonb,
|
|
|
|
|
transcript text,
|
|
|
|
|
transcript_en text,
|
|
|
|
|
summary text
|
|
|
|
|
);
|
|
|
|
|
alter table public.audio_metadata enable row level security;
|
|
|
|
|
create policy "Audio metadata viewable by authenticated users." on audio_metadata for select using ((select auth.role()) = 'authenticated');
|
|
|
|
|
|
|
|
|
|
-- Turn on Realtime for Messages
|
|
|
|
|
alter publication supabase_realtime add table messages;
|