G
Growmatee

Database Setup

Run this SQL in your Supabase SQL Editor to initialize the database.

Required Setup Steps

  1. 1.Go to your Supabase Dashboard → SQL Editor
  2. 2.Copy the SQL below and paste it into the SQL Editor
  3. 3.Click "Run" to create all tables, policies, and storage bucket
  4. 4.Go to Authentication → Providers → Google and enable it with your Client ID & Secret
  5. 5.Go to Authentication → URL Configuration and set:
    Site URL: https://neon-groups-2.preview.emergentagent.com
    Redirect URLs: https://neon-groups-2.preview.emergentagent.com/**
  6. 6.Update ADMIN_EMAIL in .env to your email address, then restart the server
Open SQL Editor
setup.sql
-- ======================================================
-- 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');