| |
| |
|
|
| |
| CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; |
|
|
| |
| CREATE TABLE IF NOT EXISTS public.species ( |
| id UUID DEFAULT uuid_generate_v4() PRIMARY KEY, |
| sno INTEGER NOT NULL, |
| species_name TEXT NOT NULL, |
| species_type TEXT NOT NULL CHECK (species_type IN ('plant', 'mushroom')), |
| location TEXT NOT NULL, |
| latitude NUMERIC NOT NULL, |
| longitude NUMERIC NOT NULL, |
| added_by TEXT DEFAULT 'system', |
| notes TEXT, |
| created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() NOT NULL, |
| updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() NOT NULL, |
| UNIQUE(species_name, location) |
| ); |
|
|
| |
| CREATE INDEX IF NOT EXISTS idx_species_type ON public.species(species_type); |
| CREATE INDEX IF NOT EXISTS idx_species_name ON public.species(species_name); |
| CREATE INDEX IF NOT EXISTS idx_location ON public.species(location); |
|
|
| |
| CREATE TABLE IF NOT EXISTS public.recognition_logs ( |
| id UUID DEFAULT uuid_generate_v4() PRIMARY KEY, |
| species_name TEXT NOT NULL, |
| confidence NUMERIC NOT NULL, |
| location TEXT DEFAULT 'N/A', |
| latitude TEXT DEFAULT 'N/A', |
| longitude TEXT DEFAULT 'N/A', |
| status TEXT NOT NULL, |
| identified_by TEXT DEFAULT 'BioCLIP', |
| created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() NOT NULL |
| ); |
|
|
| |
| CREATE TABLE IF NOT EXISTS public.species_submissions ( |
| id UUID DEFAULT uuid_generate_v4() PRIMARY KEY, |
| species_name TEXT NOT NULL, |
| species_type TEXT NOT NULL CHECK (species_type IN ('plant', 'mushroom')), |
| location TEXT NOT NULL, |
| user_id TEXT, |
| user_email TEXT, |
| notes TEXT, |
| image_url TEXT, |
| status TEXT DEFAULT 'pending' CHECK (status IN ('pending', 'approved', 'rejected')), |
| created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() NOT NULL, |
| updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() NOT NULL |
| ); |
|
|
| |
| ALTER TABLE public.species ENABLE ROW LEVEL SECURITY; |
| ALTER TABLE public.recognition_logs ENABLE ROW LEVEL SECURITY; |
| ALTER TABLE public.species_submissions ENABLE ROW LEVEL SECURITY; |
|
|
| |
| CREATE POLICY "Species are viewable by everyone" |
| ON public.species FOR SELECT |
| USING (true); |
|
|
| |
| CREATE POLICY "Anyone can submit new species" |
| ON public.species_submissions FOR INSERT |
| WITH CHECK (true); |
|
|
| |
| CREATE POLICY "Anyone can view submissions" |
| ON public.species_submissions FOR SELECT |
| USING (true); |
|
|
| |
| CREATE POLICY "Anyone can log recognitions" |
| ON public.recognition_logs FOR INSERT |
| WITH CHECK (true); |
|
|
| |
| CREATE OR REPLACE FUNCTION handle_updated_at() |
| RETURNS TRIGGER AS $$ |
| BEGIN |
| NEW.updated_at = NOW(); |
| RETURN NEW; |
| END; |
| $$ LANGUAGE plpgsql; |
|
|
| |
| DROP TRIGGER IF EXISTS set_updated_at ON public.species; |
| CREATE TRIGGER set_updated_at |
| BEFORE UPDATE ON public.species |
| FOR EACH ROW |
| EXECUTE FUNCTION handle_updated_at(); |
|
|
| DROP TRIGGER IF EXISTS set_updated_at_submissions ON public.species_submissions; |
| CREATE TRIGGER set_updated_at_submissions |
| BEFORE UPDATE ON public.species_submissions |
| FOR EACH ROW |
| EXECUTE FUNCTION handle_updated_at(); |
|
|
| |
| DO $$ |
| BEGIN |
| RAISE NOTICE 'Database schema created successfully!'; |
| RAISE NOTICE 'Next step: Run migrate_csv_to_supabase.py to import your existing data'; |
| END $$; |
|
|