| -- Supabase Database Schema for Topcoder Challenge Steward Agent | |
| -- This file contains the SQL schema needed to set up the database tables in Supabase | |
| -- ========================================= | |
| -- TABLES | |
| -- ========================================= | |
| -- Users table to store email addresses and preferences | |
| CREATE TABLE users ( | |
| id UUID DEFAULT gen_random_uuid() PRIMARY KEY, | |
| email VARCHAR(255) UNIQUE NOT NULL, | |
| preferences_text TEXT, | |
| active BOOLEAN DEFAULT true, | |
| created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), | |
| updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() | |
| ); | |
| -- Notifications table to track sent notifications and avoid duplicates | |
| CREATE TABLE notifications ( | |
| id UUID DEFAULT gen_random_uuid() PRIMARY KEY, | |
| user_id UUID REFERENCES users(id) ON DELETE CASCADE, | |
| challenge_id VARCHAR(255), | |
| sent_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), | |
| challenge_title VARCHAR(500), | |
| challenge_url TEXT, | |
| prize_amount DECIMAL(10,2), | |
| challenge_track VARCHAR(100) | |
| ); | |
| -- Agent runs log to track system performance and debugging | |
| CREATE TABLE agent_runs ( | |
| id UUID DEFAULT gen_random_uuid() PRIMARY KEY, | |
| user_id UUID REFERENCES users(id) ON DELETE CASCADE, | |
| run_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), | |
| challenges_found INTEGER DEFAULT 0, | |
| notifications_sent INTEGER DEFAULT 0, | |
| status VARCHAR(50) DEFAULT 'completed', | |
| error_message TEXT | |
| ); | |
| -- ========================================= | |
| -- INDEXES FOR PERFORMANCE | |
| -- ========================================= | |
| -- Users table indexes | |
| CREATE INDEX idx_users_email ON users(email); | |
| CREATE INDEX idx_users_active ON users(active); | |
| -- Notifications table indexes | |
| CREATE INDEX idx_notifications_user_id ON notifications(user_id); | |
| CREATE INDEX idx_notifications_sent_at ON notifications(sent_at); | |
| CREATE INDEX idx_notifications_challenge_id ON notifications(challenge_id); | |
| -- Agent runs table indexes | |
| CREATE INDEX idx_agent_runs_user_id ON agent_runs(user_id); | |
| CREATE INDEX idx_agent_runs_run_at ON agent_runs(run_at); | |
| CREATE INDEX idx_agent_runs_status ON agent_runs(status); | |
| -- ========================================= | |
| -- ROW LEVEL SECURITY (RLS) POLICIES | |
| -- ========================================= | |
| -- Enable RLS on all tables | |
| ALTER TABLE users ENABLE ROW LEVEL SECURITY; | |
| ALTER TABLE notifications ENABLE ROW LEVEL SECURITY; | |
| ALTER TABLE agent_runs ENABLE ROW LEVEL SECURITY; | |
| -- Policy to allow service role to read/write all data | |
| CREATE POLICY "Service role has full access to users" ON users | |
| FOR ALL USING (true); | |
| CREATE POLICY "Service role has full access to notifications" ON notifications | |
| FOR ALL USING (true); | |
| CREATE POLICY "Service role has full access to agent_runs" ON agent_runs | |
| FOR ALL USING (true); | |
| -- ========================================= | |
| -- FUNCTIONS AND TRIGGERS | |
| -- ========================================= | |
| -- Function to automatically update the updated_at timestamp | |
| CREATE OR REPLACE FUNCTION update_updated_at_column() | |
| RETURNS TRIGGER AS $$ | |
| BEGIN | |
| NEW.updated_at = NOW(); | |
| RETURN NEW; | |
| END; | |
| $$ language 'plpgsql'; | |
| -- Trigger to auto-update updated_at on users table | |
| CREATE TRIGGER update_users_updated_at | |
| BEFORE UPDATE ON users | |
| FOR EACH ROW | |
| EXECUTE FUNCTION update_updated_at_column(); | |
| -- ========================================= | |
| -- SAMPLE DATA FOR TESTING (OPTIONAL) | |
| -- ========================================= | |
| -- Uncomment the lines below if you want to insert sample data for testing | |
| -- INSERT INTO users (email, preferences_text, active) VALUES | |
| -- ('test@example.com', 'I am interested in AI and machine learning challenges with prizes over $1000', true), | |
| -- ('developer@example.com', 'Looking for development challenges, especially web development and mobile app challenges', true), | |
| -- ('designer@example.com', 'Design challenges, UI/UX, and creative challenges preferred', false); | |
| -- ========================================= | |
| -- SETUP INSTRUCTIONS | |
| -- ========================================= | |
| -- To set up this schema in Supabase: | |
| -- | |
| -- 1. Go to your Supabase project dashboard | |
| -- 2. Navigate to the SQL Editor | |
| -- 3. Copy and paste this entire file contents | |
| -- 4. Click "Run" to execute the schema | |
| -- | |
| -- Note: Make sure you have the proper environment variables set: | |
| -- - SUPABASE_URL: Your Supabase project URL | |
| -- - SUPABASE_ANON_KEY: Your Supabase anonymous key (for the service role) | |
| -- | |
| -- The service role key should have permissions to read/write all tables. | |