-- Enable the vector extension for embeddings CREATE EXTENSION IF NOT EXISTS vector; -- Create schools table CREATE TABLE schools ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), user_id UUID REFERENCES auth.users(id), name TEXT NOT NULL, address_line1 TEXT, city TEXT, state TEXT, zip_code TEXT, school_type TEXT CHECK (school_type IN ('Public', 'Private', 'Charter', 'Nonprofit', 'Other')), educational_level TEXT CHECK (educational_level IN ('K-12', 'Higher Education', 'Both')), enrollment INTEGER, title_i_status BOOLEAN DEFAULT FALSE, free_reduced_lunch_percentage FLOAT, contact_email TEXT, additional_info TEXT, embedding vector(1536), -- For OpenAI embeddings created_at TIMESTAMP WITH TIME ZONE DEFAULT TIMEZONE('utc'::text, NOW()), updated_at TIMESTAMP WITH TIME ZONE DEFAULT TIMEZONE('utc'::text, NOW()) ); -- Create grants table CREATE TABLE grants ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), title TEXT NOT NULL, url TEXT, provider TEXT, created_date TIMESTAMP WITH TIME ZONE DEFAULT TIMEZONE('utc'::text, NOW()), due_date TIMESTAMP WITH TIME ZONE, funding_amount DECIMAL, contact_info TEXT, description TEXT, embedding vector(1536), -- For OpenAI embeddings requirements TEXT, -- Specific requirements for the grant eligibility TEXT, -- Eligibility criteria category TEXT[] -- Array of categories (e.g., ['STEM', 'Education', 'Technology']) ); -- Create applications table to track grant applications CREATE TABLE applications ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), school_id UUID REFERENCES schools(id), grant_id UUID REFERENCES grants(id), status TEXT CHECK (status IN ('Draft', 'Submitted', 'Under Review', 'Approved', 'Rejected')), submission_date TIMESTAMP WITH TIME ZONE, last_updated TIMESTAMP WITH TIME ZONE DEFAULT TIMEZONE('utc'::text, NOW()), created_at TIMESTAMP WITH TIME ZONE DEFAULT TIMEZONE('utc'::text, NOW()), updated_at TIMESTAMP WITH TIME ZONE DEFAULT TIMEZONE('utc'::text, NOW()), UNIQUE(school_id, grant_id) ); -- Create application_chat_history table to store chat interactions CREATE TABLE application_chat_history ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), application_id UUID REFERENCES applications(id), message_type TEXT CHECK (message_type IN ('user', 'assistant')), content TEXT, created_at TIMESTAMP WITH TIME ZONE DEFAULT TIMEZONE('utc'::text, NOW()) ); -- Create saved_responses table to store drafted responses CREATE TABLE saved_responses ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), application_id UUID REFERENCES applications(id), question_key TEXT, -- Identifier for the question being answered response_text TEXT, -- The drafted response last_edited TIMESTAMP WITH TIME ZONE DEFAULT TIMEZONE('utc'::text, NOW()), created_at TIMESTAMP WITH TIME ZONE DEFAULT TIMEZONE('utc'::text, NOW()) ); -- Create application_documents table for uploaded files CREATE TABLE application_documents ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), application_id UUID REFERENCES applications(id), document_type TEXT, -- e.g., 'Budget', 'Timeline', 'Letter of Support' file_name TEXT, file_url TEXT, uploaded_at TIMESTAMP WITH TIME ZONE DEFAULT TIMEZONE('utc'::text, NOW()) ); -- Add RLS (Row Level Security) policies ALTER TABLE schools ENABLE ROW LEVEL SECURITY; ALTER TABLE applications ENABLE ROW LEVEL SECURITY; ALTER TABLE application_chat_history ENABLE ROW LEVEL SECURITY; ALTER TABLE saved_responses ENABLE ROW LEVEL SECURITY; ALTER TABLE application_documents ENABLE ROW LEVEL SECURITY; -- Create policies CREATE POLICY "Users can view their own school profile" ON schools FOR SELECT USING (auth.uid() = user_id); CREATE POLICY "Users can update their own school profile" ON schools FOR UPDATE USING (auth.uid() = user_id); CREATE POLICY "Users can insert their own school profile" ON schools FOR INSERT WITH CHECK (auth.uid() = user_id); CREATE POLICY "Users can view their own applications" ON applications FOR SELECT USING (EXISTS ( SELECT 1 FROM schools WHERE schools.id = applications.school_id AND schools.user_id = auth.uid() )); CREATE POLICY "Users can create their own applications" ON applications FOR INSERT WITH CHECK (EXISTS ( SELECT 1 FROM schools WHERE schools.id = applications.school_id AND schools.user_id = auth.uid() )); CREATE POLICY "Users can view their own chat history" ON application_chat_history FOR SELECT USING (EXISTS ( SELECT 1 FROM applications JOIN schools ON schools.id = applications.school_id WHERE application_chat_history.application_id = applications.id AND schools.user_id = auth.uid() )); CREATE POLICY "Users can insert chat messages" ON application_chat_history FOR INSERT WITH CHECK (EXISTS ( SELECT 1 FROM applications JOIN schools ON schools.id = applications.school_id WHERE application_chat_history.application_id = applications.id AND schools.user_id = auth.uid() )); CREATE POLICY "Users can view their saved responses" ON saved_responses FOR SELECT USING (EXISTS ( SELECT 1 FROM applications JOIN schools ON schools.id = applications.school_id WHERE saved_responses.application_id = applications.id AND schools.user_id = auth.uid() )); CREATE POLICY "Users can manage their saved responses" ON saved_responses FOR ALL USING (EXISTS ( SELECT 1 FROM applications JOIN schools ON schools.id = applications.school_id WHERE saved_responses.application_id = applications.id AND schools.user_id = auth.uid() )); CREATE POLICY "Users can view their documents" ON application_documents FOR SELECT USING (EXISTS ( SELECT 1 FROM applications JOIN schools ON schools.id = applications.school_id WHERE application_documents.application_id = applications.id AND schools.user_id = auth.uid() )); CREATE POLICY "Users can manage their documents" ON application_documents FOR ALL USING (EXISTS ( SELECT 1 FROM applications JOIN schools ON schools.id = applications.school_id WHERE application_documents.application_id = applications.id AND schools.user_id = auth.uid() ));