Signed-off-by: Max <ai-agent@topdoglabs.com>

This commit is contained in:
Max 2026-02-23 08:10:28 -06:00
parent 7d66c99815
commit 9f0ea70a89

View File

@ -9,14 +9,17 @@ CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
-- ============================================ -- ============================================
CREATE TABLE IF NOT EXISTS users ( CREATE TABLE IF NOT EXISTS users (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
legacy_id TEXT UNIQUE, -- For migration from SQLite
name TEXT NOT NULL, name TEXT NOT NULL,
email TEXT NOT NULL UNIQUE, email TEXT NOT NULL UNIQUE,
avatar_url TEXT, avatar_url TEXT,
password_hash TEXT NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
); );
-- Create index on email for faster lookups -- 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_email ON users(email);
CREATE INDEX IF NOT EXISTS idx_users_legacy_id ON users(legacy_id);
-- Enable RLS -- Enable RLS
ALTER TABLE users ENABLE ROW LEVEL SECURITY; 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 CREATE POLICY "Users can update own data" ON users
FOR UPDATE USING (auth.uid() = id); 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 -- SESSIONS TABLE
-- ============================================ -- ============================================
@ -91,12 +83,16 @@ CREATE POLICY "Service role manages reset tokens" ON password_reset_tokens
-- ============================================ -- ============================================
CREATE TABLE IF NOT EXISTS projects ( CREATE TABLE IF NOT EXISTS projects (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
legacy_id TEXT UNIQUE, -- For migration from SQLite
name TEXT NOT NULL, name TEXT NOT NULL,
description TEXT, description TEXT,
color TEXT NOT NULL, color TEXT NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() 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 -- Enable RLS
ALTER TABLE projects ENABLE ROW LEVEL SECURITY; 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 ( CREATE TABLE IF NOT EXISTS sprints (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
legacy_id TEXT UNIQUE, -- For migration from SQLite
name TEXT NOT NULL, name TEXT NOT NULL,
goal TEXT, goal TEXT,
start_date DATE NOT NULL, start_date DATE NOT NULL,
@ -132,6 +129,7 @@ CREATE TABLE IF NOT EXISTS sprints (
-- Create indexes -- Create indexes
CREATE INDEX IF NOT EXISTS idx_sprints_project_id ON sprints(project_id); 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); CREATE INDEX IF NOT EXISTS idx_sprints_dates ON sprints(start_date, end_date);
-- Enable RLS -- Enable RLS
@ -146,6 +144,7 @@ CREATE POLICY "Authenticated users can manage sprints" ON sprints
-- ============================================ -- ============================================
CREATE TABLE IF NOT EXISTS tasks ( CREATE TABLE IF NOT EXISTS tasks (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
legacy_id TEXT UNIQUE, -- For migration from SQLite
title TEXT NOT NULL, title TEXT NOT NULL,
description TEXT, description TEXT,
type TEXT NOT NULL CHECK (type IN ('idea', 'task', 'bug', 'research', 'plan')), 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(), created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_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_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_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_id UUID REFERENCES users(id) ON DELETE SET NULL,
assignee_name TEXT,
assignee_email TEXT,
assignee_avatar_url TEXT,
due_date DATE, due_date DATE,
comments JSONB NOT NULL DEFAULT '[]'::jsonb, comments JSONB NOT NULL DEFAULT '[]'::jsonb,
tags 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_status ON tasks(status);
CREATE INDEX IF NOT EXISTS idx_tasks_priority ON tasks(priority); 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_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 INDEX IF NOT EXISTS idx_tasks_updated_at ON tasks(updated_at DESC);
-- Create trigger to auto-update updated_at -- 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 CREATE POLICY "Authenticated users can manage tasks" ON tasks
FOR ALL USING (auth.role() = 'authenticated'); 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 -- FUNCTIONS
-- ============================================ -- ============================================