Run this SQL in your Supabase SQL Editor to initialize the database.
Site URL: https://neon-groups-2.preview.emergentagent.comRedirect URLs: https://neon-groups-2.preview.emergentagent.com/**ADMIN_EMAIL in .env to your email address, then restart the server-- ======================================================
-- GROWMATEE DATABASE SETUP
-- Run this SQL in your Supabase Dashboard > SQL Editor
-- ======================================================
-- Create creators table
CREATE TABLE IF NOT EXISTS public.creators (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES auth.users(id) ON DELETE CASCADE UNIQUE,
username TEXT UNIQUE NOT NULL,
full_name TEXT NOT NULL,
country TEXT NOT NULL DEFAULT 'US',
community_name TEXT NOT NULL,
logo_url TEXT,
description TEXT DEFAULT '',
platform TEXT CHECK (platform IN ('telegram', 'whatsapp')) DEFAULT 'telegram',
subscription_type TEXT CHECK (subscription_type IN ('onetime', 'recurring')) DEFAULT 'onetime',
billing_cycle TEXT CHECK (billing_cycle IN ('monthly', 'yearly')),
price NUMERIC(10,2) DEFAULT 0,
currency TEXT DEFAULT 'USD',
payment_link TEXT,
telegram_link TEXT,
balance NUMERIC(10,2) DEFAULT 0,
member_count INTEGER DEFAULT 0,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- Create payments table
CREATE TABLE IF NOT EXISTS public.payments (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
creator_id UUID REFERENCES public.creators(id) ON DELETE CASCADE,
subscriber_email TEXT NOT NULL,
amount NUMERIC(10,2) NOT NULL,
currency TEXT DEFAULT 'USD',
status TEXT DEFAULT 'pending' CHECK (status IN ('pending', 'confirmed')),
paid_at TIMESTAMPTZ,
telegram_link_sent BOOLEAN DEFAULT FALSE,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- Enable Row Level Security
ALTER TABLE public.creators ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.payments ENABLE ROW LEVEL SECURITY;
-- Creators policies
DROP POLICY IF EXISTS "creators_read_own" ON public.creators;
CREATE POLICY "creators_read_own" ON public.creators
FOR SELECT TO authenticated USING (auth.uid() = user_id);
DROP POLICY IF EXISTS "creators_insert_own" ON public.creators;
CREATE POLICY "creators_insert_own" ON public.creators
FOR INSERT TO authenticated WITH CHECK (auth.uid() = user_id);
DROP POLICY IF EXISTS "creators_update_own" ON public.creators;
CREATE POLICY "creators_update_own" ON public.creators
FOR UPDATE TO authenticated USING (auth.uid() = user_id);
-- Payments policies
DROP POLICY IF EXISTS "payments_read_own" ON public.payments;
CREATE POLICY "payments_read_own" ON public.payments
FOR SELECT TO authenticated
USING (creator_id IN (SELECT id FROM public.creators WHERE user_id = auth.uid()));
-- Storage bucket for logos
INSERT INTO storage.buckets (id, name, public)
VALUES ('logos', 'logos', true)
ON CONFLICT (id) DO NOTHING;
-- Storage policies
DROP POLICY IF EXISTS "logos_public_read" ON storage.objects;
CREATE POLICY "logos_public_read" ON storage.objects
FOR SELECT USING (bucket_id = 'logos');
DROP POLICY IF EXISTS "logos_auth_upload" ON storage.objects;
CREATE POLICY "logos_auth_upload" ON storage.objects
FOR INSERT TO authenticated WITH CHECK (bucket_id = 'logos');
DROP POLICY IF EXISTS "logos_auth_update" ON storage.objects;
CREATE POLICY "logos_auth_update" ON storage.objects
FOR UPDATE TO authenticated USING (bucket_id = 'logos');