-- Enable UUID extension CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; -- Create files table CREATE TABLE IF NOT EXISTS files ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), name TEXT NOT NULL, path TEXT NOT NULL, size BIGINT NOT NULL, mime_type TEXT NOT NULL, user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE, created_at TIMESTAMPTZ DEFAULT NOW(), updated_at TIMESTAMPTZ DEFAULT NOW() ); -- Create index on user_id for faster queries CREATE INDEX IF NOT EXISTS idx_files_user_id ON files(user_id); -- Create index on created_at for sorting CREATE INDEX IF NOT EXISTS idx_files_created_at ON files(created_at DESC); -- Enable Row Level Security ALTER TABLE files ENABLE ROW LEVEL SECURITY; -- Create policy to allow users to see only their own files CREATE POLICY "Users can view their own files" ON files FOR SELECT USING (auth.uid() = user_id); -- Create policy to allow users to insert their own files CREATE POLICY "Users can insert their own files" ON files FOR INSERT WITH CHECK (auth.uid() = user_id); -- Create policy to allow users to update their own files CREATE POLICY "Users can update their own files" ON files FOR UPDATE USING (auth.uid() = user_id); -- Create policy to allow users to delete their own files CREATE POLICY "Users can delete their own files" ON files FOR DELETE USING (auth.uid() = user_id); -- Create storage bucket for files INSERT INTO storage.buckets (id, name, public) VALUES ('files', 'files', true) ON CONFLICT (id) DO NOTHING; -- Create policy to allow authenticated users to upload files CREATE POLICY "Users can upload files" ON storage.objects FOR INSERT WITH CHECK ( bucket_id = 'files' AND auth.uid()::text = (storage.foldername(name))[1] ); -- Create policy to allow users to view their own files CREATE POLICY "Users can view their own files" ON storage.objects FOR SELECT USING ( bucket_id = 'files' AND auth.uid()::text = (storage.foldername(name))[1] ); -- Create policy to allow users to delete their own files CREATE POLICY "Users can delete their own files" ON storage.objects FOR DELETE USING ( bucket_id = 'files' AND auth.uid()::text = (storage.foldername(name))[1] ); -- Create updated_at trigger function CREATE OR REPLACE FUNCTION update_updated_at_column() RETURNS TRIGGER AS $$ BEGIN NEW.updated_at = NOW(); RETURN NEW; END; $$ LANGUAGE plpgsql; -- Create trigger to auto-update updated_at CREATE TRIGGER update_files_updated_at BEFORE UPDATE ON files FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();