diff --git a/supabase/schema.sql b/supabase/schema.sql index 0b275b0..f540376 100644 --- a/supabase/schema.sql +++ b/supabase/schema.sql @@ -9,14 +9,17 @@ CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; -- ============================================ CREATE TABLE IF NOT EXISTS users ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), + legacy_id TEXT UNIQUE, -- For migration from SQLite name TEXT NOT NULL, email TEXT NOT NULL UNIQUE, avatar_url TEXT, + password_hash TEXT NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); -- Create index on email for faster lookups CREATE INDEX IF NOT EXISTS idx_users_email ON users(email); +CREATE INDEX IF NOT EXISTS idx_users_legacy_id ON users(legacy_id); -- Enable RLS ALTER TABLE users ENABLE ROW LEVEL SECURITY; @@ -29,17 +32,6 @@ CREATE POLICY "Users can read own data" ON users CREATE POLICY "Users can update own data" ON users FOR UPDATE USING (auth.uid() = id); --- ============================================ --- PROFILES TABLE --- ============================================ -CREATE TABLE IF NOT EXISTS profiles ( - id UUID PRIMARY KEY REFERENCES auth.users(id), - name TEXT, - avatar_url TEXT, - created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), - updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() -); - -- ============================================ -- SESSIONS TABLE -- ============================================ @@ -91,12 +83,16 @@ CREATE POLICY "Service role manages reset tokens" ON password_reset_tokens -- ============================================ CREATE TABLE IF NOT EXISTS projects ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), + legacy_id TEXT UNIQUE, -- For migration from SQLite name TEXT NOT NULL, description TEXT, color TEXT NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); +-- Create index for legacy ID lookups +CREATE INDEX IF NOT EXISTS idx_projects_legacy_id ON projects(legacy_id); + -- Enable RLS ALTER TABLE projects ENABLE ROW LEVEL SECURITY; @@ -121,6 +117,7 @@ CREATE POLICY "Authenticated users can delete projects" ON projects -- ============================================ CREATE TABLE IF NOT EXISTS sprints ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), + legacy_id TEXT UNIQUE, -- For migration from SQLite name TEXT NOT NULL, goal TEXT, start_date DATE NOT NULL, @@ -132,6 +129,7 @@ CREATE TABLE IF NOT EXISTS sprints ( -- Create indexes CREATE INDEX IF NOT EXISTS idx_sprints_project_id ON sprints(project_id); +CREATE INDEX IF NOT EXISTS idx_sprints_legacy_id ON sprints(legacy_id); CREATE INDEX IF NOT EXISTS idx_sprints_dates ON sprints(start_date, end_date); -- Enable RLS @@ -146,6 +144,7 @@ CREATE POLICY "Authenticated users can manage sprints" ON sprints -- ============================================ CREATE TABLE IF NOT EXISTS tasks ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), + legacy_id TEXT UNIQUE, -- For migration from SQLite title TEXT NOT NULL, description TEXT, type TEXT NOT NULL CHECK (type IN ('idea', 'task', 'bug', 'research', 'plan')), @@ -156,8 +155,15 @@ CREATE TABLE IF NOT EXISTS tasks ( created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), created_by_id UUID REFERENCES users(id) ON DELETE SET NULL, + created_by_name TEXT, + created_by_avatar_url TEXT, updated_by_id UUID REFERENCES users(id) ON DELETE SET NULL, + updated_by_name TEXT, + updated_by_avatar_url TEXT, assignee_id UUID REFERENCES users(id) ON DELETE SET NULL, + assignee_name TEXT, + assignee_email TEXT, + assignee_avatar_url TEXT, due_date DATE, comments JSONB NOT NULL DEFAULT '[]'::jsonb, tags JSONB NOT NULL DEFAULT '[]'::jsonb, @@ -171,6 +177,7 @@ CREATE INDEX IF NOT EXISTS idx_tasks_assignee_id ON tasks(assignee_id); CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status); CREATE INDEX IF NOT EXISTS idx_tasks_priority ON tasks(priority); CREATE INDEX IF NOT EXISTS idx_tasks_due_date ON tasks(due_date); +CREATE INDEX IF NOT EXISTS idx_tasks_legacy_id ON tasks(legacy_id); CREATE INDEX IF NOT EXISTS idx_tasks_updated_at ON tasks(updated_at DESC); -- Create trigger to auto-update updated_at @@ -195,6 +202,26 @@ ALTER TABLE tasks ENABLE ROW LEVEL SECURITY; CREATE POLICY "Authenticated users can manage tasks" ON tasks FOR ALL USING (auth.role() = 'authenticated'); +-- ============================================ +-- META TABLE (for app state like lastUpdated) +-- ============================================ +CREATE TABLE IF NOT EXISTS meta ( + key TEXT PRIMARY KEY, + value TEXT NOT NULL, + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +-- Enable RLS +ALTER TABLE meta ENABLE ROW LEVEL SECURITY; + +-- Policy: All authenticated users can manage meta +CREATE POLICY "Authenticated users can manage meta" ON meta + FOR ALL USING (auth.role() = 'authenticated'); + +-- Insert initial lastUpdated value +INSERT INTO meta (key, value) VALUES ('lastUpdated', extract(epoch from now()) * 1000) +ON CONFLICT (key) DO UPDATE SET value = excluded.value; + -- ============================================ -- FUNCTIONS -- ============================================